diff options
Diffstat (limited to 'include/asm-generic/bug.h')
-rw-r--r-- | include/asm-generic/bug.h | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h index 0cd9711895f..a5250895155 100644 --- a/include/asm-generic/bug.h +++ b/include/asm-generic/bug.h @@ -16,12 +16,15 @@ #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 */ @@ -34,8 +37,24 @@ #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) ({ \ + static int __warn_once = 1; \ + typeof(condition) __ret_warn_once = (condition);\ + \ + if (likely(__warn_once)) \ + if (WARN_ON(__ret_warn_once)) \ + __warn_once = 0; \ + unlikely(__ret_warn_once); \ +}) + +#ifdef CONFIG_SMP +# define WARN_ON_SMP(x) WARN_ON(x) +#else +# define WARN_ON_SMP(x) do { } while (0) #endif #endif |