Re: [PATCH] WARN_ONCE(): use bool for boolean flag

From: Cesar Eduardo Barros
Date: Sun Sep 27 2009 - 13:24:25 EST


Daniel Walker escreveu:
On Sun, 2009-09-27 at 12:56 -0300, Cesar Eduardo Barros wrote:
Daniel Walker escreveu:
On Sun, 2009-09-27 at 10:53 -0300, Cesar Eduardo Barros wrote:
#define
WARN_ON_ONCE(condition) ({ \
- static int __warned; \
+ static bool __warned; \
int __ret_warn_once = !!(condition); \
Could __ret_warn_once be bool also ? It looks like just another
conditional variable..
Yes, it could (as long as either it is converted back to int in the return of the macro, or all users do not care about the macro's return type). However, the justification used for the printk_once patch (and this WARN_ONCE patch) does not apply directly anymore, since the code is different (to start with, it is not a static variable).

I did a couple kernel builds to test this on a small normal config,

vmlinux.base-line
text data bss dec hex filename
6718958 497200 1082460 8298618 7ea07a vmlinux.base-line

vmlinux.one-bool <-- Your patch
text data bss dec hex filename
6718590 497232 1082292 8298114 7e9e82 vmlinux.one-bool

I am still trying to understand why data increases (but not enough to offset the gains on text and bss). My own testing had the same qualitative result (x86-64 defconfig):

text data bss dec hex filename
8101271 1207116 992764 10301151 9d2edf vmlinux.warn.before
8100553 1207148 991988 10299689 9d2929 vmlinux.warn.after

vmlinux.all-bool-converted text data bss dec hex filename
6718506 497232 1082292 8298030 7e9e2e vmlinux.all-converted

your changes drops the size 368 bytes, and if you convert the other
conditionals it drops it by another 84 bytes. Not much more, but it's
something.

So I think Rolands original reasoning still holds.. As far as people
needing an int output from WARN_ON() , I'm not sure that's happening
anyplace .. I can't imagine a sane usage for that..

I took a quick look, and all uses seem to be directly in a boolean context (within an if()), so there would be no problem. Besides, the unlikely() all these macros end with does a double negation, meaning even if it is an int, it will be either 0 or 1 (but I am not sure I am reading these macros right - it seems CONFIG_TRACE_BRANCH_PROFILING turns all unlikely() into likely()).

In fact, I was expecting no change at all, since gcc should be able to see it is being treated as a boolean (perhaps I am trusting gcc too much). And to make matters even more confusing, my own test changing all __ret_warn_once to bool and dropping the !! caused an _increase_ of 598 bytes (x86-64 defconfig).

text data bss dec hex filename
8100553 1207148 991988 10299689 9d2929 vmlinux.warnret.before
8101119 1207180 991988 10300287 9d2b7f vmlinux.warnret.after

(And yes, data increased again.)

--
Cesar Eduardo Barros
cesarb@xxxxxxxxxx
cesar.barros@xxxxxxxxx
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/