74caba7f2a
Dictionaries are only used for SUBSYSTEM and DEVICE properties. The current implementation stores the property names each time they are used. This requires more space than otherwise necessary. Also, because the dictionary entries are currently considered optional, it cannot be relied upon that they are always available, even if the writer wanted to store them. These issues will increase should new dictionary properties be introduced. Rather than storing the subsystem and device properties in the dict ring, introduce a struct dev_printk_info with separate fields to store only the property values. Embed this struct within the struct printk_info to provide guaranteed availability. Signed-off-by: John Ogness <john.ogness@linutronix.de> Reviewed-by: Petr Mladek <pmladek@suse.com> Signed-off-by: Petr Mladek <pmladek@suse.com> Link: https://lore.kernel.org/r/87mu1jl6ne.fsf@jogness.linutronix.de
75 lines
2.0 KiB
C
75 lines
2.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* internal.h - printk internal definitions
|
|
*/
|
|
#include <linux/percpu.h>
|
|
|
|
#ifdef CONFIG_PRINTK
|
|
|
|
#define PRINTK_SAFE_CONTEXT_MASK 0x007ffffff
|
|
#define PRINTK_NMI_DIRECT_CONTEXT_MASK 0x008000000
|
|
#define PRINTK_NMI_CONTEXT_MASK 0xff0000000
|
|
|
|
#define PRINTK_NMI_CONTEXT_OFFSET 0x010000000
|
|
|
|
extern raw_spinlock_t logbuf_lock;
|
|
|
|
__printf(4, 0)
|
|
int vprintk_store(int facility, int level,
|
|
const struct dev_printk_info *dev_info,
|
|
const char *fmt, va_list args);
|
|
|
|
__printf(1, 0) int vprintk_default(const char *fmt, va_list args);
|
|
__printf(1, 0) int vprintk_deferred(const char *fmt, va_list args);
|
|
__printf(1, 0) int vprintk_func(const char *fmt, va_list args);
|
|
void __printk_safe_enter(void);
|
|
void __printk_safe_exit(void);
|
|
|
|
void printk_safe_init(void);
|
|
bool printk_percpu_data_ready(void);
|
|
|
|
#define printk_safe_enter_irqsave(flags) \
|
|
do { \
|
|
local_irq_save(flags); \
|
|
__printk_safe_enter(); \
|
|
} while (0)
|
|
|
|
#define printk_safe_exit_irqrestore(flags) \
|
|
do { \
|
|
__printk_safe_exit(); \
|
|
local_irq_restore(flags); \
|
|
} while (0)
|
|
|
|
#define printk_safe_enter_irq() \
|
|
do { \
|
|
local_irq_disable(); \
|
|
__printk_safe_enter(); \
|
|
} while (0)
|
|
|
|
#define printk_safe_exit_irq() \
|
|
do { \
|
|
__printk_safe_exit(); \
|
|
local_irq_enable(); \
|
|
} while (0)
|
|
|
|
void defer_console_output(void);
|
|
|
|
#else
|
|
|
|
__printf(1, 0) int vprintk_func(const char *fmt, va_list args) { return 0; }
|
|
|
|
/*
|
|
* In !PRINTK builds we still export logbuf_lock spin_lock, console_sem
|
|
* semaphore and some of console functions (console_unlock()/etc.), so
|
|
* printk-safe must preserve the existing local IRQ guarantees.
|
|
*/
|
|
#define printk_safe_enter_irqsave(flags) local_irq_save(flags)
|
|
#define printk_safe_exit_irqrestore(flags) local_irq_restore(flags)
|
|
|
|
#define printk_safe_enter_irq() local_irq_disable()
|
|
#define printk_safe_exit_irq() local_irq_enable()
|
|
|
|
static inline void printk_safe_init(void) { }
|
|
static inline bool printk_percpu_data_ready(void) { return false; }
|
|
#endif /* CONFIG_PRINTK */
|