On Fri, 2016-06-24 at 10:30 +0200, Borislav Petkov wrote: > From: Borislav Petkov <b...@suse.de> > > Have printk*once() return a bool which denotes whether the string was > printed or not so that calling code can react accordingly.
I expected object size to either increase or stay the same with just this change. Oddly, at least with gcc 5.3, some defconfig x86-64 objects _decrease_ in size. for example: drivers/gpu/drm/i915/intel_opregion.o I presume there's some curiosity in the gcc optimizer with the evaluation of statement expression macros that don't return a value. Perhaps the printk_once macros should end with unlikely(__ret_print_once); like the WARN_ONCE variants. > Signed-off-by: Borislav Petkov <b...@suse.de> > Cc: Andrew Morton <a...@linux-foundation.org> > --- > include/linux/printk.h | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) > > diff --git a/include/linux/printk.h b/include/linux/printk.h > index f4da695fd615..464fcdddb359 100644 > --- a/include/linux/printk.h > +++ b/include/linux/printk.h > @@ -108,11 +108,14 @@ struct va_format { > * Dummy printk for disabled debugging statements to use whilst maintaining > * gcc's format checking. > */ > -#define no_printk(fmt, ...) \ > -do { \ > - if (0) \ > - printk(fmt, ##__VA_ARGS__); \ > -} while (0) > +#define no_printk(fmt, ...) \ > +({ \ > + do { \ > + if (0) \ > + printk(fmt, ##__VA_ARGS__); \ > + } while (0); \ > + 0; \ > +}) > > #ifdef CONFIG_EARLY_PRINTK > extern asmlinkage __printf(1, 2) > @@ -309,20 +312,24 @@ extern asmlinkage void dump_stack(void) __cold; > #define printk_once(fmt, ...) \ > ({ \ > static bool __print_once __read_mostly; \ > + bool __ret_print_once = !__print_once; \ > \ > if (!__print_once) { \ > __print_once = true; \ > printk(fmt, ##__VA_ARGS__); \ > } \ > + __ret_print_once; \ > }) > #define printk_deferred_once(fmt, ...) \ > ({ \ > static bool __print_once __read_mostly; \ > + bool __ret_print_once = !__print_once; \ > \ > if (!__print_once) { \ > __print_once = true; \ > printk_deferred(fmt, ##__VA_ARGS__); \ > } \ > + __ret_print_once; \ > }) > #else > #define printk_once(fmt, ...) \