diff options
| -rw-r--r-- | include/asm-generic/bug.h | 32 | ||||
| -rw-r--r-- | include/asm-powerpc/bug.h | 12 | 
2 files changed, 23 insertions, 21 deletions
diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h index 8ceab7bcd8b..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,21 +37,18 @@  #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 diff --git a/include/asm-powerpc/bug.h b/include/asm-powerpc/bug.h index f44b529e329..978b2c7e84e 100644 --- a/include/asm-powerpc/bug.h +++ b/include/asm-powerpc/bug.h @@ -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  |