Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 684f9783 authored by Herbert Xu's avatar Herbert Xu Committed by Linus Torvalds
Browse files

[PATCH] Let WARN_ON/WARN_ON_ONCE return the condition



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: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 6299a2de
Loading
Loading
Loading
Loading
+16 −16
Original line number Diff line number Diff line
@@ -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__); \
#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();						\
	}								\
} while (0)
	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)) {	\
	if (likely(__warn_once))			\
		if (WARN_ON(__ret_warn_once)) 		\
			__warn_once = 0;		\
		WARN_ON(1);				\
		__ret = 1;				\
	}						\
	__ret;						\
	unlikely(__ret_warn_once);			\
})

#ifdef CONFIG_SMP
+7 −5
Original line number Diff line number Diff line
@@ -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