19/07/2020 13:41, Matan Azrad:
>
> From: Thomas Monjalon:
> > 19/07/2020 12:56, Matan Azrad:
> > >
> > > From: Thomas Monjalon
> > > > The detection of the CPU was done in a constructor and shared in a
> > > > global variable.
> > > >
> > > > This variable may not be visible in the net PMD because it was not
> > > > exported as part of the .map file.
> > >
> > > Can you explain exactly when it is not visible?
> >
> > I depends on linker options.
> >
> > > > It is fixed by exporting a function, which is cleaner than a variable.
> > >
> > > Can you explain why?
> > > We have classic example - rte_eth_devices.
> >
> > There is more control and more abstraction in functions, it can provide
> > futre-
> > proof abstraction.
>
> Also variable have more abstraction - struct.
> In future, if it will be needed, we can change it.
>
> > We should not export variables at all,
> > it is a basic rule of writing API.
>
> It is variable which is depended only in the running CPU - almost like
> compile time condition,
> so it is not regular case.
> I think it makes sense also to use a singleton variable as internal API.
>
> > Having a bad example in ethdev doesn't mean we should follow it.
>
> If ethdev rte_eth_devices is bad API, Are you going to change it?
No, we avoid changing API.
> > > > By checking the CPU only at the first call of the function, doing
> > > > the check in a constructor becomes useless.
> > >
> > > Yes, but why not to do it in constructor? this variable is initialized
> > > only once
> > and doesn't depend in any parameter.
> >
> > Constructor must remain minimal.
> > If constructor can be avoided, it must be.
> > This is a golden rule.
>
> The cpu detection is a fast code.
>
> Using constructor here makes sense:
> 1. we need only one initialization for all the program.
> 2. no need to take care of multithreading on the single initialization (are
> your code thread safe?).
I don't see what could be the issue.
> 3. no parameters are required.
>
> > > > Note: the priority of the constructor was probably irrelevant.
> >
> > No comment about the constructor priority which was set as LOG for no good
> > reason, proving that this code was not well reviewed?
>
> I guess you mean that comment is missing - you right.
No I mean this constructor is declared with LOG priority,
but it is not doing any log registration.
> We want to be sure that the variable is ready before any usage of it in the
> drivers (even in driver contractors).
It is not used by other constructors.
And avoiding constructor dependencies is exactly why we avoid using
constructors at all.
> > > > At the same time, the comments are reworded or dropped if useless.
> > > >
> > > > Fixes: 4c204fe5e5d2 ("common/mlx5: disable relaxed ordering in
> > > > unsuitable
> > > > CPUs")
> > > > Cc: [email protected]
> > > > Cc: [email protected]
> > > >
> > > > Signed-off-by: Thomas Monjalon <[email protected]>