debug warnings: eliminate warn_on_slowpath()
[linux-2.6] / include / asm-generic / bug.h
1 #ifndef _ASM_GENERIC_BUG_H
2 #define _ASM_GENERIC_BUG_H
3
4 #include <linux/compiler.h>
5
6 #ifdef CONFIG_BUG
7
8 #ifdef CONFIG_GENERIC_BUG
9 #ifndef __ASSEMBLY__
10 struct bug_entry {
11         unsigned long   bug_addr;
12 #ifdef CONFIG_DEBUG_BUGVERBOSE
13         const char      *file;
14         unsigned short  line;
15 #endif
16         unsigned short  flags;
17 };
18 #endif          /* __ASSEMBLY__ */
19
20 #define BUGFLAG_WARNING (1<<0)
21 #endif  /* CONFIG_GENERIC_BUG */
22
23 #ifndef HAVE_ARCH_BUG
24 #define BUG() do { \
25         printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
26         panic("BUG!"); \
27 } while (0)
28 #endif
29
30 #ifndef HAVE_ARCH_BUG_ON
31 #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0)
32 #endif
33
34 #ifndef __WARN
35 #ifndef __ASSEMBLY__
36 extern void warn_slowpath(const char *file, const int line,
37                 const char *fmt, ...) __attribute__((format(printf, 3, 4)));
38 #define WANT_WARN_ON_SLOWPATH
39 #endif
40 #define __WARN()                warn_slowpath(__FILE__, __LINE__, NULL)
41 #define __WARN_printf(arg...)   warn_slowpath(__FILE__, __LINE__, arg)
42 #else
43 #define __WARN_printf(arg...)   do { printk(arg); __WARN(); } while (0)
44 #endif
45
46 #ifndef WARN_ON
47 #define WARN_ON(condition) ({                                           \
48         int __ret_warn_on = !!(condition);                              \
49         if (unlikely(__ret_warn_on))                                    \
50                 __WARN();                                               \
51         unlikely(__ret_warn_on);                                        \
52 })
53 #endif
54
55 #ifndef WARN
56 #define WARN(condition, format...) ({                                           \
57         int __ret_warn_on = !!(condition);                              \
58         if (unlikely(__ret_warn_on))                                    \
59                 __WARN_printf(format);                                  \
60         unlikely(__ret_warn_on);                                        \
61 })
62 #endif
63
64 #else /* !CONFIG_BUG */
65 #ifndef HAVE_ARCH_BUG
66 #define BUG()
67 #endif
68
69 #ifndef HAVE_ARCH_BUG_ON
70 #define BUG_ON(condition) do { if (condition) ; } while(0)
71 #endif
72
73 #ifndef HAVE_ARCH_WARN_ON
74 #define WARN_ON(condition) ({                                           \
75         int __ret_warn_on = !!(condition);                              \
76         unlikely(__ret_warn_on);                                        \
77 })
78 #endif
79
80 #ifndef WARN
81 #define WARN(condition, format...) ({                                   \
82         int __ret_warn_on = !!(condition);                              \
83         unlikely(__ret_warn_on);                                        \
84 })
85 #endif
86
87 #endif
88
89 #define WARN_ON_ONCE(condition) ({                              \
90         static int __warned;                                    \
91         int __ret_warn_once = !!(condition);                    \
92                                                                 \
93         if (unlikely(__ret_warn_once))                          \
94                 if (WARN_ON(!__warned))                         \
95                         __warned = 1;                           \
96         unlikely(__ret_warn_once);                              \
97 })
98
99 #define WARN_ONCE(condition, format...) ({                      \
100         static int __warned;                                    \
101         int __ret_warn_once = !!(condition);                    \
102                                                                 \
103         if (unlikely(__ret_warn_once))                          \
104                 if (WARN(!__warned, format))                    \
105                         __warned = 1;                           \
106         unlikely(__ret_warn_once);                              \
107 })
108
109 #define WARN_ON_RATELIMIT(condition, state)                     \
110                 WARN_ON((condition) && __ratelimit(state))
111
112 #ifdef CONFIG_SMP
113 # define WARN_ON_SMP(x)                 WARN_ON(x)
114 #else
115 # define WARN_ON_SMP(x)                 do { } while (0)
116 #endif
117
118 #endif