Pull printk updates from Petr Mladek: - Refactor printk code for formatting messages that are shown on consoles. This is a preparatory step for introducing atomic consoles which could not share the global buffers - Prevent memory leak when removing printk index in debugfs - Dump also the newest printk message by the sample gdbmacro - Fix a compiler warning * tag 'printk-for-6.3' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux: printf: fix errname.c list kernel/printk/index.c: fix memory leak with using debugfs_lookup() printk: Use scnprintf() to print the message about the dropped messages on a console printk: adjust string limit macros printk: use printk_buffers for devkmsg printk: introduce console_prepend_dropped() for dropped messages printk: introduce printk_get_next_message() and printk_message printk: introduce struct printk_buffers console: Document struct console console: Use BIT() macros for @flags values printk: move size limit macros into internal.h docs: gdbmacros: print newest record
Showing the changes to include (2 of 7 files). Show all
Unified · Split
| @@ -15,6 +15,7 @@ · 14 unmodified lines | ||
| 15 | 15 | #define _LINUX_CONSOLE_H_ 1 |
| 16 | 16 | |
| 17 | 17 | #include <linux/atomic.h> |
| 18 | +#include <linux/bits.h> | |
| 18 | 19 | #include <linux/rculist.h> |
| 19 | 20 | #include <linux/types.h> |
| 20 | 21 | |
| @@ -125,37 +126,82 @@ static inline int con_debug_leave(void) · 104 unmodified lines | ||
| 125 | 126 | /* |
| 126 | 127 | * The interface for a console, or any other device that wants to capture |
| 127 | 128 | * console messages (printer driver?) |
| 128 | − * | |
| 129 | − * If a console driver is marked CON_BOOT then it will be auto-unregistered | |
| 130 | − * when the first real console is registered. This is for early-printk drivers. | |
| 131 | 129 | */ |
| 132 | 130 | |
| 133 | −#define CON_PRINTBUFFER (1) | |
| 134 | −#define CON_CONSDEV (2) /* Preferred console, /dev/console */ | |
| 135 | −#define CON_ENABLED (4) | |
| 136 | −#define CON_BOOT (8) | |
| 137 | −#define CON_ANYTIME (16) /* Safe to call when cpu is offline */ | |
| 138 | −#define CON_BRL (32) /* Used for a braille device */ | |
| 139 | −#define CON_EXTENDED (64) /* Use the extended output format a la /dev/kmsg */ | |
| 131 | +/** | |
| 132 | + * cons_flags - General console flags | |
| 133 | + * @CON_PRINTBUFFER: Used by newly registered consoles to avoid duplicate | |
| 134 | + * output of messages that were already shown by boot | |
| 135 | + * consoles or read by userspace via syslog() syscall. | |
| 136 | + * @CON_CONSDEV: Indicates that the console driver is backing | |
| 137 | + * /dev/console. | |
| 138 | + * @CON_ENABLED: Indicates if a console is allowed to print records. If | |
| 139 | + * false, the console also will not advance to later | |
| 140 | + * records. | |
| 141 | + * @CON_BOOT: Marks the console driver as early console driver which | |
| 142 | + * is used during boot before the real driver becomes | |
| 143 | + * available. It will be automatically unregistered | |
| 144 | + * when the real console driver is registered unless | |
| 145 | + * "keep_bootcon" parameter is used. | |
| 146 | + * @CON_ANYTIME: A misnomed historical flag which tells the core code | |
| 147 | + * that the legacy @console::write callback can be invoked | |
| 148 | + * on a CPU which is marked OFFLINE. That is misleading as | |
| 149 | + * it suggests that there is no contextual limit for | |
| 150 | + * invoking the callback. The original motivation was | |
| 151 | + * readiness of the per-CPU areas. | |
| 152 | + * @CON_BRL: Indicates a braille device which is exempt from | |
| 153 | + * receiving the printk spam for obvious reasons. | |
| 154 | + * @CON_EXTENDED: The console supports the extended output format of | |
| 155 | + * /dev/kmesg which requires a larger output buffer. | |
| 156 | + */ | |
| 157 | +enum cons_flags { | |
| 158 | + CON_PRINTBUFFER = BIT(0), | |
| 159 | + CON_CONSDEV = BIT(1), | |
| 160 | + CON_ENABLED = BIT(2), | |
| 161 | + CON_BOOT = BIT(3), | |
| 162 | + CON_ANYTIME = BIT(4), | |
| 163 | + CON_BRL = BIT(5), | |
| 164 | + CON_EXTENDED = BIT(6), | |
| 165 | +}; | |
| 140 | 166 | |
| 167 | +/** | |
| 168 | + * struct console - The console descriptor structure | |
| 169 | + * @name: The name of the console driver | |
| 170 | + * @write: Write callback to output messages (Optional) | |
| 171 | + * @read: Read callback for console input (Optional) | |
| 172 | + * @device: The underlying TTY device driver (Optional) | |
| 173 | + * @unblank: Callback to unblank the console (Optional) | |
| 174 | + * @setup: Callback for initializing the console (Optional) | |
| 175 | + * @exit: Callback for teardown of the console (Optional) | |
| 176 | + * @match: Callback for matching a console (Optional) | |
| 177 | + * @flags: Console flags. See enum cons_flags | |
| 178 | + * @index: Console index, e.g. port number | |
| 179 | + * @cflag: TTY control mode flags | |
| 180 | + * @ispeed: TTY input speed | |
| 181 | + * @ospeed: TTY output speed | |
| 182 | + * @seq: Sequence number of the next ringbuffer record to print | |
| 183 | + * @dropped: Number of unreported dropped ringbuffer records | |
| 184 | + * @data: Driver private data | |
| 185 | + * @node: hlist node for the console list | |
| 186 | + */ | |
| 141 | 187 | struct console { |
| 142 | − char name[16]; | |
| 143 | − void (*write)(struct console *, const char *, unsigned); | |
| 144 | − int (*read)(struct console *, char *, unsigned); | |
| 145 | − struct tty_driver *(*device)(struct console *, int *); | |
| 146 | − void (*unblank)(void); | |
| 147 | − int (*setup)(struct console *, char *); | |
| 148 | − int (*exit)(struct console *); | |
| 149 | − int (*match)(struct console *, char *name, int idx, char *options); | |
| 150 | − short flags; | |
| 151 | − short index; | |
| 152 | − int cflag; | |
| 153 | − uint ispeed; | |
| 154 | − uint ospeed; | |
| 155 | − u64 seq; | |
| 156 | − unsigned long dropped; | |
| 157 | − void *data; | |
| 158 | − struct hlist_node node; | |
| 188 | + char name[16]; | |
| 189 | + void (*write)(struct console *co, const char *s, unsigned int count); | |
| 190 | + int (*read)(struct console *co, char *s, unsigned int count); | |
| 191 | + struct tty_driver *(*device)(struct console *co, int *index); | |
| 192 | + void (*unblank)(void); | |
| 193 | + int (*setup)(struct console *co, char *options); | |
| 194 | + int (*exit)(struct console *co); | |
| 195 | + int (*match)(struct console *co, char *name, int idx, char *options); | |
| 196 | + short flags; | |
| 197 | + short index; | |
| 198 | + int cflag; | |
| 199 | + uint ispeed; | |
| 200 | + uint ospeed; | |
| 201 | + u64 seq; | |
| 202 | + unsigned long dropped; | |
| 203 | + void *data; | |
| 204 | + struct hlist_node node; | |
| 159 | 205 | }; |
| 160 | 206 | |
| 161 | 207 | #ifdef CONFIG_LOCKDEP |
| @@ -44,8 +44,6 @@ static inline const char *printk_skip_headers(const char *buffer) · 43 unmodified lines | ||
| 44 | 44 | return buffer; |
| 45 | 45 | } |
| 46 | 46 | |
| 47 | −#define CONSOLE_EXT_LOG_MAX 8192 | |
| 48 | − | |
| 49 | 47 | /* printk's without a loglevel use this.. */ |
| 50 | 48 | #define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT |
| 51 | 49 | |