[PATCH] Let WARN_ON/WARN_ON_ONCE return the condition
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 29 Sep 2006 08:59:06 +0000 (01:59 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 29 Sep 2006 16:18:06 +0000 (09:18 -0700)
Letting WARN_ON/WARN_ON_ONCE return the condition means that you could do

if (WARN_ON(blah)) {
handle_impossible_case
}

Rather than

if (unlikely(blah)) {
WARN_ON(1)
handle_impossible_case
}

I checked all the newly added WARN_ON_ONCE users and none of them test the
return status so we can still change it.

[akpm@osdl.org: warning fix]
[akpm@osdl.org: build fix]
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
include/asm-generic/bug.h
include/asm-powerpc/bug.h

index 8ceab7b..a525089 100644 (file)
 #endif
 
 #ifndef HAVE_ARCH_WARN_ON
-#define WARN_ON(condition) do { \
-       if (unlikely((condition)!=0)) { \
-               printk("BUG: warning at %s:%d/%s()\n", __FILE__, __LINE__, __FUNCTION__); \
-               dump_stack(); \
-       } \
-} while (0)
+#define WARN_ON(condition) ({                                          \
+       typeof(condition) __ret_warn_on = (condition);                  \
+       if (unlikely(__ret_warn_on)) {                                  \
+               printk("BUG: warning at %s:%d/%s()\n", __FILE__,        \
+                       __LINE__, __FUNCTION__);                        \
+               dump_stack();                                           \
+       }                                                               \
+       unlikely(__ret_warn_on);                                        \
+})
 #endif
 
 #else /* !CONFIG_BUG */
 #endif
 
 #ifndef HAVE_ARCH_WARN_ON
-#define WARN_ON(condition) do { if (condition) ; } while(0)
+#define WARN_ON(condition) unlikely((condition))
 #endif
 #endif
 
-#define WARN_ON_ONCE(condition)                                \
-({                                                     \
+#define WARN_ON_ONCE(condition)        ({                      \
        static int __warn_once = 1;                     \
-       int __ret = 0;                                  \
+       typeof(condition) __ret_warn_once = (condition);\
                                                        \
-       if (unlikely((condition) && __warn_once)) {     \
-               __warn_once = 0;                        \
-               WARN_ON(1);                             \
-               __ret = 1;                              \
-       }                                               \
-       __ret;                                          \
+       if (likely(__warn_once))                        \
+               if (WARN_ON(__ret_warn_once))           \
+                       __warn_once = 0;                \
+       unlikely(__ret_warn_once);                      \
 })
 
 #ifdef CONFIG_SMP
index f44b529..978b2c7 100644 (file)
@@ -70,9 +70,10 @@ struct bug_entry *find_bug(unsigned long bugaddr);
                    "i" (__FILE__), "i" (__FUNCTION__));        \
 } while (0)
 
-#define WARN_ON(x) do {                                                \
-       if (__builtin_constant_p(x)) {                          \
-               if (x)                                          \
+#define WARN_ON(x) ({                                          \
+       typeof(x) __ret_warn_on = (x);                          \
+       if (__builtin_constant_p(__ret_warn_on)) {              \
+               if (__ret_warn_on)                              \
                        __WARN();                               \
        } else {                                                \
                __asm__ __volatile__(                           \
@@ -80,11 +81,12 @@ struct bug_entry *find_bug(unsigned long bugaddr);
                ".section __bug_table,\"a\"\n"                  \
                "\t"PPC_LONG"   1b,%1,%2,%3\n"                  \
                ".previous"                                     \
-               : : "r" ((long)(x)),                            \
+               : : "r" (__ret_warn_on),                        \
                    "i" (__LINE__ + BUG_WARNING_TRAP),          \
                    "i" (__FILE__), "i" (__FUNCTION__));        \
        }                                                       \
-} while (0)
+       unlikely(__ret_warn_on);                                \
+})
 
 #define HAVE_ARCH_BUG
 #define HAVE_ARCH_BUG_ON