diff options
Diffstat (limited to 'include/asm-generic/bug.h')
-rw-r--r-- | include/asm-generic/bug.h | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h index 4c794d73fb84..37b82cb96c89 100644 --- a/include/asm-generic/bug.h +++ b/include/asm-generic/bug.h | |||
@@ -28,6 +28,17 @@ struct bug_entry { | |||
28 | #define BUGFLAG_WARNING (1<<0) | 28 | #define BUGFLAG_WARNING (1<<0) |
29 | #endif /* CONFIG_GENERIC_BUG */ | 29 | #endif /* CONFIG_GENERIC_BUG */ |
30 | 30 | ||
31 | /* | ||
32 | * Don't use BUG() or BUG_ON() unless there's really no way out; one | ||
33 | * example might be detecting data structure corruption in the middle | ||
34 | * of an operation that can't be backed out of. If the (sub)system | ||
35 | * can somehow continue operating, perhaps with reduced functionality, | ||
36 | * it's probably not BUG-worthy. | ||
37 | * | ||
38 | * If you're tempted to BUG(), think again: is completely giving up | ||
39 | * really the *only* solution? There are usually better options, where | ||
40 | * users don't need to reboot ASAP and can mostly shut down cleanly. | ||
41 | */ | ||
31 | #ifndef HAVE_ARCH_BUG | 42 | #ifndef HAVE_ARCH_BUG |
32 | #define BUG() do { \ | 43 | #define BUG() do { \ |
33 | printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ | 44 | printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ |
@@ -39,17 +50,22 @@ struct bug_entry { | |||
39 | #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0) | 50 | #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0) |
40 | #endif | 51 | #endif |
41 | 52 | ||
53 | /* | ||
54 | * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report | ||
55 | * significant issues that need prompt attention if they should ever | ||
56 | * appear at runtime. Use the versions with printk format strings | ||
57 | * to provide better diagnostics. | ||
58 | */ | ||
42 | #ifndef __WARN | 59 | #ifndef __WARN |
43 | #ifndef __ASSEMBLY__ | 60 | #ifndef __ASSEMBLY__ |
44 | extern void warn_on_slowpath(const char *file, const int line); | ||
45 | extern void warn_slowpath(const char *file, const int line, | 61 | extern void warn_slowpath(const char *file, const int line, |
46 | const char *fmt, ...) __attribute__((format(printf, 3, 4))); | 62 | const char *fmt, ...) __attribute__((format(printf, 3, 4))); |
47 | #define WANT_WARN_ON_SLOWPATH | 63 | #define WANT_WARN_ON_SLOWPATH |
48 | #endif | 64 | #endif |
49 | #define __WARN() warn_on_slowpath(__FILE__, __LINE__) | 65 | #define __WARN() warn_slowpath(__FILE__, __LINE__, NULL) |
50 | #define __WARN_printf(arg...) warn_slowpath(__FILE__, __LINE__, arg) | 66 | #define __WARN_printf(arg...) warn_slowpath(__FILE__, __LINE__, arg) |
51 | #else | 67 | #else |
52 | #define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0) | 68 | #define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0) |
53 | #endif | 69 | #endif |
54 | 70 | ||
55 | #ifndef WARN_ON | 71 | #ifndef WARN_ON |