Re: [GIT PULL] more printk for 6.15

From: Petr Mladek
Date: Fri Apr 04 2025 - 04:19:14 EST


On Thu 2025-04-03 15:07:09, Andy Shevchenko wrote:
> On Wed, Apr 02, 2025 at 01:34:22PM -0700, Nathan Chancellor wrote:
> > On Wed, Apr 02, 2025 at 10:25:46PM +0300, Andy Shevchenko wrote:
> > > +Cc: Kees and Nathan (I believe this discussion has some material for
> > > you, folks, to think of / comment on / etc)
> >
> > Thanks, I have commented on the part of the message that seem relevant
> > for me.
>
> Thank you!
>
> > > On Wed, Apr 2, 2025 at 10:06 PM Linus Torvalds
> > > <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote:
> > > > On Wed, 2 Apr 2025 at 11:39, Andy Shevchenko <andy.shevchenko@xxxxxxxxx> wrote:
> > > > >
> > > > > Yes. Clang complains on unknown pragma.
> > > >
> > > > Can we please use wrapper defines instead so that we don't have that
> > > > #ifndef in the middle of code? And since those don't work with
> > > > '#pragma', they need to use the _Pragma() operator instead.
> > > >
> > > > Something like
> > > >
> > > > #define GCC_PRAGMA(x) _Pragma(#x)
> > > >
> > > > in compiler-gcc.h, and then add a
> > > >
> > > > #ifndef GCC_PRAGMA
> > > > #define GCC_PRAGMA(x) /* Nothing */
> > > > #endif
> > > >
> > > > and then you can just do
> > > >
> > > > GCC_PRAGMA(Wsuggest-attribute=format)
> > > >
> > > > in places like this?
> > > >
> > > > (Entirely untested: I *despise* pragma in general).
> >
> > We have the __diag() infrastructure for this already. I think this issue
> > would be as simple as the following diff, which makes clang and GCC
> > happy without any obvious ifdeffery.
>
> FWIW, I have tested this in my case for both compilers and they are happy with it.
>
> Tested-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>

Great!

Nathan, would mind to send this as a proper patch, please?

> > diff --git a/include/linux/compiler-igcc.h b/include/linux/compiler-gcc.h
> > index 32048052c64a..5d07c469b571 100644
> > --- a/include/linux/compiler-gcc.h
> > +++ b/include/linux/compiler-gcc.h
> > @@ -127,6 +127,8 @@
> > #define __diag_GCC_8(s)
> > #endif
> >
> > +#define __diag_GCC_all(s) __diag(s)
> > +
> > #define __diag_ignore_all(option, comment) \
> > __diag(__diag_GCC_ignore option)
> >
> > diff --git a/lib/vsprintf.c b/lib/vsprintf.c
> > index 01699852f30c..6ff4d85e144e 100644
> > --- a/lib/vsprintf.c
> > +++ b/lib/vsprintf.c
> > @@ -1699,10 +1699,8 @@ char *escaped_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
> > return buf;
> > }
> >
> > -#pragma GCC diagnostic push
> > -#ifndef __clang__
> > -#pragma GCC diagnostic ignored "-Wsuggest-attribute=format"
> > -#endif
> > +__diag_push();
> > +__diag_ignore(GCC, all, "-Wsuggest-attribute=format", "<reason>");
> > static char *va_format(char *buf, char *end, struct va_format *va_fmt,
> > struct printf_spec spec)
> > {
> > @@ -1717,7 +1715,7 @@ static char *va_format(char *buf, char *end, struct va_format *va_fmt,
> >
> > return buf;
> > }
> > -#pragma GCC diagnostic pop
> > +__diag_pop();
> >
> > static noinline_for_stack
> > char *uuid_string(char *buf, char *end, const u8 *addr,

Best Regards,
Petr