diff options
Diffstat (limited to 'kernel/printk/internal.h')
-rw-r--r-- | kernel/printk/internal.h | 79 |
1 files changed, 46 insertions, 33 deletions
diff --git a/kernel/printk/internal.h b/kernel/printk/internal.h index 7fd2838fa417..1db044f808b7 100644 --- a/kernel/printk/internal.h +++ b/kernel/printk/internal.h | |||
@@ -16,42 +16,55 @@ | |||
16 | */ | 16 | */ |
17 | #include <linux/percpu.h> | 17 | #include <linux/percpu.h> |
18 | 18 | ||
19 | typedef __printf(1, 0) int (*printk_func_t)(const char *fmt, va_list args); | 19 | #ifdef CONFIG_PRINTK |
20 | 20 | ||
21 | int __printf(1, 0) vprintk_default(const char *fmt, va_list args); | 21 | #define PRINTK_SAFE_CONTEXT_MASK 0x7fffffff |
22 | 22 | #define PRINTK_NMI_CONTEXT_MASK 0x80000000 | |
23 | #ifdef CONFIG_PRINTK_NMI | ||
24 | 23 | ||
25 | extern raw_spinlock_t logbuf_lock; | 24 | extern raw_spinlock_t logbuf_lock; |
26 | 25 | ||
26 | __printf(1, 0) int vprintk_default(const char *fmt, va_list args); | ||
27 | __printf(1, 0) int vprintk_func(const char *fmt, va_list args); | ||
28 | void __printk_safe_enter(void); | ||
29 | void __printk_safe_exit(void); | ||
30 | |||
31 | #define printk_safe_enter_irqsave(flags) \ | ||
32 | do { \ | ||
33 | local_irq_save(flags); \ | ||
34 | __printk_safe_enter(); \ | ||
35 | } while (0) | ||
36 | |||
37 | #define printk_safe_exit_irqrestore(flags) \ | ||
38 | do { \ | ||
39 | __printk_safe_exit(); \ | ||
40 | local_irq_restore(flags); \ | ||
41 | } while (0) | ||
42 | |||
43 | #define printk_safe_enter_irq() \ | ||
44 | do { \ | ||
45 | local_irq_disable(); \ | ||
46 | __printk_safe_enter(); \ | ||
47 | } while (0) | ||
48 | |||
49 | #define printk_safe_exit_irq() \ | ||
50 | do { \ | ||
51 | __printk_safe_exit(); \ | ||
52 | local_irq_enable(); \ | ||
53 | } while (0) | ||
54 | |||
55 | #else | ||
56 | |||
57 | __printf(1, 0) int vprintk_func(const char *fmt, va_list args) { return 0; } | ||
58 | |||
27 | /* | 59 | /* |
28 | * printk() could not take logbuf_lock in NMI context. Instead, | 60 | * In !PRINTK builds we still export logbuf_lock spin_lock, console_sem |
29 | * it temporary stores the strings into a per-CPU buffer. | 61 | * semaphore and some of console functions (console_unlock()/etc.), so |
30 | * The alternative implementation is chosen transparently | 62 | * printk-safe must preserve the existing local IRQ guarantees. |
31 | * via per-CPU variable. | ||
32 | */ | 63 | */ |
33 | DECLARE_PER_CPU(printk_func_t, printk_func); | 64 | #define printk_safe_enter_irqsave(flags) local_irq_save(flags) |
34 | static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args) | 65 | #define printk_safe_exit_irqrestore(flags) local_irq_restore(flags) |
35 | { | 66 | |
36 | return this_cpu_read(printk_func)(fmt, args); | 67 | #define printk_safe_enter_irq() local_irq_disable() |
37 | } | 68 | #define printk_safe_exit_irq() local_irq_enable() |
38 | 69 | ||
39 | extern atomic_t nmi_message_lost; | 70 | #endif /* CONFIG_PRINTK */ |
40 | static inline int get_nmi_message_lost(void) | ||
41 | { | ||
42 | return atomic_xchg(&nmi_message_lost, 0); | ||
43 | } | ||
44 | |||
45 | #else /* CONFIG_PRINTK_NMI */ | ||
46 | |||
47 | static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args) | ||
48 | { | ||
49 | return vprintk_default(fmt, args); | ||
50 | } | ||
51 | |||
52 | static inline int get_nmi_message_lost(void) | ||
53 | { | ||
54 | return 0; | ||
55 | } | ||
56 | |||
57 | #endif /* CONFIG_PRINTK_NMI */ | ||