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 | #define _LINUX_CONSOLE_H_ 1 | 15 | #define _LINUX_CONSOLE_H_ 1 |
| 16 | 16 | ||
| 17 | #include <linux/atomic.h> | 17 | #include <linux/atomic.h> |
| 18 | #include <linux/bits.h> | ||
| 18 | #include <linux/rculist.h> | 19 | #include <linux/rculist.h> |
| 19 | #include <linux/types.h> | 20 | #include <linux/types.h> |
| 20 | 21 | ||
| @@ -125,37 +126,82 @@ static inline int con_debug_leave(void) · 104 unmodified lines | |||
| 125 | /* | 126 | /* |
| 126 | * The interface for a console, or any other device that wants to capture | 127 | * The interface for a console, or any other device that wants to capture |
| 127 | * console messages (printer driver?) | 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) | 131 | /** |
| 134 | #define CON_CONSDEV (2) /* Preferred console, /dev/console */ | 132 | * cons_flags - General console flags |
| 135 | #define CON_ENABLED (4) | 133 | * @CON_PRINTBUFFER: Used by newly registered consoles to avoid duplicate |
| 136 | #define CON_BOOT (8) | 134 | * output of messages that were already shown by boot |
| 137 | #define CON_ANYTIME (16) /* Safe to call when cpu is offline */ | 135 | * consoles or read by userspace via syslog() syscall. |
| 138 | #define CON_BRL (32) /* Used for a braille device */ | 136 | * @CON_CONSDEV: Indicates that the console driver is backing |
| 139 | #define CON_EXTENDED (64) /* Use the extended output format a la /dev/kmsg */ | 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 | struct console { | 187 | struct console { |
| 142 | char name[16]; | 188 | char name[16]; |
| 143 | void (*write)(struct console *, const char *, unsigned); | 189 | void (*write)(struct console *co, const char *s, unsigned int count); |
| 144 | int (*read)(struct console *, char *, unsigned); | 190 | int (*read)(struct console *co, char *s, unsigned int count); |
| 145 | struct tty_driver *(*device)(struct console *, int *); | 191 | struct tty_driver *(*device)(struct console *co, int *index); |
| 146 | void (*unblank)(void); | 192 | void (*unblank)(void); |
| 147 | int (*setup)(struct console *, char *); | 193 | int (*setup)(struct console *co, char *options); |
| 148 | int (*exit)(struct console *); | 194 | int (*exit)(struct console *co); |
| 149 | int (*match)(struct console *, char *name, int idx, char *options); | 195 | int (*match)(struct console *co, char *name, int idx, char *options); |
| 150 | short flags; | 196 | short flags; |
| 151 | short index; | 197 | short index; |
| 152 | int cflag; | 198 | int cflag; |
| 153 | uint ispeed; | 199 | uint ispeed; |
| 154 | uint ospeed; | 200 | uint ospeed; |
| 155 | u64 seq; | 201 | u64 seq; |
| 156 | unsigned long dropped; | 202 | unsigned long dropped; |
| 157 | void *data; | 203 | void *data; |
| 158 | struct hlist_node node; | 204 | struct hlist_node node; |
| 159 | }; | 205 | }; |
| 160 | 206 | ||
| 161 | #ifdef CONFIG_LOCKDEP | 207 | #ifdef CONFIG_LOCKDEP |
| @@ -44,8 +44,6 @@ static inline const char *printk_skip_headers(const char *buffer) · 43 unmodified lines | |||
| 44 | return buffer; | 44 | return buffer; |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | #define CONSOLE_EXT_LOG_MAX 8192 | ||
| 48 | |||
| 49 | /* printk's without a loglevel use this.. */ | 47 | /* printk's without a loglevel use this.. */ |
| 50 | #define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT | 48 | #define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT |
| 51 | 49 | ||