aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/printk/internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/printk/internal.h')
-rw-r--r--kernel/printk/internal.h79
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
19typedef __printf(1, 0) int (*printk_func_t)(const char *fmt, va_list args); 19#ifdef CONFIG_PRINTK
20 20
21int __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
25extern raw_spinlock_t logbuf_lock; 24extern 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);
28void __printk_safe_enter(void);
29void __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 */
33DECLARE_PER_CPU(printk_func_t, printk_func); 64#define printk_safe_enter_irqsave(flags) local_irq_save(flags)
34static 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
39extern atomic_t nmi_message_lost; 70#endif /* CONFIG_PRINTK */
40static inline int get_nmi_message_lost(void)
41{
42 return atomic_xchg(&nmi_message_lost, 0);
43}
44
45#else /* CONFIG_PRINTK_NMI */
46
47static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args)
48{
49 return vprintk_default(fmt, args);
50}
51
52static inline int get_nmi_message_lost(void)
53{
54 return 0;
55}
56
57#endif /* CONFIG_PRINTK_NMI */