Re: [PATCH] smp: fix __smp_processor_id() backup macro

From: Alexey Dobriyan
Date: Sun Oct 15 2023 - 06:03:41 EST


On Sat, Oct 14, 2023 at 03:12:21PM -0700, Andrew Morton wrote:
> On Sat, 14 Oct 2023 19:14:15 +0300 Alexey Dobriyan <adobriyan@xxxxxxxxx> wrote:
>
> > Every __smp_processor_id usage doesn't have arguments and
> > every raw_smp_processor_id usage doesn't have arguments,
> > therefore "#define __smp_processor_id(x)" can not possibly work.
> >
> > ...
> >
> > --- a/include/linux/smp.h
> > +++ b/include/linux/smp.h
> > @@ -261,7 +261,7 @@ static inline int get_boot_cpu_id(void)
> > * regular asm read for the stable.
> > */
> > #ifndef __smp_processor_id
> > -#define __smp_processor_id(x) raw_smp_processor_id(x)
> > +#define __smp_processor_id() raw_smp_processor_id()
> > #endif
> >
>
> It's been that way for at least 4 years. Presumably this is never used
> and should be removed?

Deleting breaks compilation immediately.

C89 6.8.3 §4 says

"The number of arguments in an invocation of a function-like
macro shall agree with the number of parameters in the macro
definition, ..."

C99 relaxes this in 6.10.3 §4

the number of arguments (including those arguments
consisting of no preprocesing tokens) ... shall equal
the number of parameters in the macro definition.

So, "#define M()" works with M() only, but "#define M(a)" worked with
M(1) and started working as M() which is very funny.

In other words changelog is wrong: it can and does work (sort of by
accident).