|
16 | 16 | */ |
17 | 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); |
22 | | - |
23 | | -#ifdef CONFIG_PRINTK_NMI |
| 21 | +#define PRINTK_SAFE_CONTEXT_MASK 0x7fffffff |
| 22 | +#define PRINTK_NMI_CONTEXT_MASK 0x80000000 |
24 | 23 |
|
25 | 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, |
29 | | - * it temporary stores the strings into a per-CPU buffer. |
30 | | - * The alternative implementation is chosen transparently |
31 | | - * via per-CPU variable. |
| 60 | + * In !PRINTK builds we still export logbuf_lock spin_lock, console_sem |
| 61 | + * semaphore and some of console functions (console_unlock()/etc.), so |
| 62 | + * printk-safe must preserve the existing local IRQ guarantees. |
32 | 63 | */ |
33 | | -DECLARE_PER_CPU(printk_func_t, printk_func); |
34 | | -static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args) |
35 | | -{ |
36 | | - return this_cpu_read(printk_func)(fmt, args); |
37 | | -} |
38 | | - |
39 | | -extern atomic_t nmi_message_lost; |
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 */ |
| 64 | +#define printk_safe_enter_irqsave(flags) local_irq_save(flags) |
| 65 | +#define printk_safe_exit_irqrestore(flags) local_irq_restore(flags) |
| 66 | + |
| 67 | +#define printk_safe_enter_irq() local_irq_disable() |
| 68 | +#define printk_safe_exit_irq() local_irq_enable() |
| 69 | + |
| 70 | +#endif /* CONFIG_PRINTK */ |
0 commit comments