Skip to content

Commit df43d90

Browse files
committed
Merge tag 'printk-for-5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux
Pull printk updates from Petr Mladek: - Optionally, provide an index of possible printk messages via <debugfs>/printk/index/. It can be used when monitoring important kernel messages on a farm of various hosts. The monitor has to be updated when some messages has changed or are not longer available by a newly deployed kernel. - Add printk.console_no_auto_verbose boot parameter. It allows to generate crash dump even with slow consoles in a reasonable time frame. - Remove printk_safe buffers. The messages are always stored directly to the main logbuffer, even in NMI or recursive context. Also it allows to serialize syslog operations by a mutex instead of a spin lock. - Misc clean up and build fixes. * tag 'printk-for-5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux: printk/index: Fix -Wunused-function warning lib/nmi_backtrace: Serialize even messages about idle CPUs printk: Add printk.console_no_auto_verbose boot parameter printk: Remove console_silent() lib/test_scanf: Handle n_bits == 0 in random tests printk: syslog: close window between wait and read printk: convert @syslog_lock to mutex printk: remove NMI tracking printk: remove safe buffers printk: track/limit recursion lib/nmi_backtrace: explicitly serialize banner and regs printk: Move the printk() kerneldoc comment to its new home printk/index: Fix warning about missing prototypes MIPS/asm/printk: Fix build failure caused by printk printk: index: Add indexing support to dev_printk printk: Userspace format indexing support printk: Rework parse_prefix into printk_parse_prefix printk: Straighten out log_flags into printk_info_flags string_helpers: Escape double quotes in escape_special printk/console: Check consistent sequence number when handling race in console_unlock()
2 parents 9e5f3ff + c985aaf commit df43d90

File tree

38 files changed

+687
-657
lines changed

38 files changed

+687
-657
lines changed

Documentation/admin-guide/kernel-parameters.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4198,6 +4198,15 @@
41984198
Format: <bool> (1/Y/y=enable, 0/N/n=disable)
41994199
default: disabled
42004200

4201+
printk.console_no_auto_verbose=
4202+
Disable console loglevel raise on oops, panic
4203+
or lockdep-detected issues (only if lock debug is on).
4204+
With an exception to setups with low baudrate on
4205+
serial console, keeping this 0 is a good choice
4206+
in order to provide more debug information.
4207+
Format: <bool>
4208+
default: 0 (auto_verbose is enabled)
4209+
42014210
printk.devkmsg={on,off,ratelimit}
42024211
Control writing to /dev/kmsg.
42034212
on - unlimited logging to /dev/kmsg from userspace

Documentation/core-api/printk-basics.rst

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,6 @@ also ``CONFIG_DYNAMIC_DEBUG`` in the case of pr_debug()) is defined.
107107
Function reference
108108
==================
109109

110-
.. kernel-doc:: kernel/printk/printk.c
111-
:functions: printk
112-
113110
.. kernel-doc:: include/linux/printk.h
114-
:functions: pr_emerg pr_alert pr_crit pr_err pr_warn pr_notice pr_info
111+
:functions: printk pr_emerg pr_alert pr_crit pr_err pr_warn pr_notice pr_info
115112
pr_fmt pr_debug pr_devel pr_cont

MAINTAINERS

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15021,6 +15021,11 @@ S: Maintained
1502115021
F: include/linux/printk.h
1502215022
F: kernel/printk/
1502315023

15024+
PRINTK INDEXING
15025+
R: Chris Down <[email protected]>
15026+
S: Maintained
15027+
F: kernel/printk/index.c
15028+
1502415029
PROC FILESYSTEM
1502515030
1502615031

arch/arm/kernel/entry-v7m.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ __invalid_entry:
2323
adr r0, strerr
2424
mrs r1, ipsr
2525
mov r2, lr
26-
bl printk
26+
bl _printk
2727
#endif
2828
mov r0, sp
2929
bl show_regs

arch/arm/kernel/smp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -667,9 +667,9 @@ static void do_handle_IPI(int ipinr)
667667
break;
668668

669669
case IPI_CPU_BACKTRACE:
670-
printk_nmi_enter();
670+
printk_deferred_enter();
671671
nmi_cpu_backtrace(get_irq_regs());
672-
printk_nmi_exit();
672+
printk_deferred_exit();
673673
break;
674674

675675
default:

arch/arm/lib/backtrace-clang.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ finished_setup:
202202
1006: adr r0, .Lbad
203203
mov r1, loglvl
204204
mov r2, frame
205-
bl printk
205+
bl _printk
206206
no_frame: ldmfd sp!, {r4 - r9, fp, pc}
207207
ENDPROC(c_backtrace)
208208
.pushsection __ex_table,"a"

arch/arm/lib/backtrace.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ for_each_frame: tst frame, mask @ Check for address exceptions
103103
1006: adr r0, .Lbad
104104
mov r1, loglvl
105105
mov r2, frame
106-
bl printk
106+
bl _printk
107107
no_frame: ldmfd sp!, {r4 - r9, pc}
108108
ENDPROC(c_backtrace)
109109

arch/arm/mach-rpc/io-acorn.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ ENTRY(insl)
2525
ENTRY(outsl)
2626
adr r0, .Liosl_warning
2727
mov r1, lr
28-
b printk
28+
b _printk

arch/arm/vfp/vfphw.S

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#ifdef DEBUG
2424
stmfd sp!, {r0-r3, ip, lr}
2525
ldr r0, =1f
26-
bl printk
26+
bl _printk
2727
ldmfd sp!, {r0-r3, ip, lr}
2828

2929
.pushsection .rodata, "a"
@@ -38,7 +38,7 @@
3838
stmfd sp!, {r0-r3, ip, lr}
3939
mov r1, \arg
4040
ldr r0, =1f
41-
bl printk
41+
bl _printk
4242
ldmfd sp!, {r0-r3, ip, lr}
4343

4444
.pushsection .rodata, "a"
@@ -55,7 +55,7 @@
5555
mov r2, \arg2
5656
mov r1, \arg1
5757
ldr r0, =1f
58-
bl printk
58+
bl _printk
5959
ldmfd sp!, {r0-r3, ip, lr}
6060

6161
.pushsection .rodata, "a"

arch/ia64/include/uapi/asm/cmpxchg.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,9 @@ extern long ia64_cmpxchg_called_with_bad_pointer(void);
143143
do { \
144144
if (_cmpxchg_bugcheck_count-- <= 0) { \
145145
void *ip; \
146-
extern int printk(const char *fmt, ...); \
146+
extern int _printk(const char *fmt, ...); \
147147
ip = (void *) ia64_getreg(_IA64_REG_IP); \
148-
printk("CMPXCHG_BUGCHECK: stuck at %p on word %p\n", ip, (v));\
148+
_printk("CMPXCHG_BUGCHECK: stuck at %p on word %p\n", ip, (v));\
149149
break; \
150150
} \
151151
} while (0)

arch/mips/include/asm/asm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ symbol = value
114114
.set push; \
115115
.set reorder; \
116116
PTR_LA a0, 8f; \
117-
jal printk; \
117+
jal _printk; \
118118
.set pop; \
119119
TEXT(string)
120120
#else

arch/openrisc/kernel/entry.S

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ EXCEPTION_ENTRY(_external_irq_handler)
551551
l.movhi r3,hi(42f)
552552
l.ori r3,r3,lo(42f)
553553
l.sw 0x0(r1),r3
554-
l.jal printk
554+
l.jal _printk
555555
l.sw 0x4(r1),r4
556556
l.addi r1,r1,0x8
557557

@@ -681,8 +681,8 @@ _syscall_debug:
681681
l.sw -4(r1),r27
682682
l.sw -8(r1),r11
683683
l.addi r1,r1,-8
684-
l.movhi r27,hi(printk)
685-
l.ori r27,r27,lo(printk)
684+
l.movhi r27,hi(_printk)
685+
l.ori r27,r27,lo(_printk)
686686
l.jalr r27
687687
l.nop
688688
l.addi r1,r1,8

arch/powerpc/kernel/head_fsl_booke.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@ KernelSPE:
858858
ori r3,r3,87f@l
859859
mr r4,r2 /* current */
860860
lwz r5,_NIP(r1)
861-
bl printk
861+
bl _printk
862862
#endif
863863
b interrupt_return
864864
#ifdef CONFIG_PRINTK

arch/powerpc/kernel/traps.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,6 @@ extern void panic_flush_kmsg_start(void)
171171

172172
extern void panic_flush_kmsg_end(void)
173173
{
174-
printk_safe_flush_on_panic();
175174
kmsg_dump(KMSG_DUMP_PANIC);
176175
bust_spinlocks(0);
177176
debug_locks_off();

arch/powerpc/kernel/watchdog.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,11 +184,6 @@ static void watchdog_smp_panic(int cpu, u64 tb)
184184

185185
wd_smp_unlock(&flags);
186186

187-
printk_safe_flush();
188-
/*
189-
* printk_safe_flush() seems to require another print
190-
* before anything actually goes out to console.
191-
*/
192187
if (sysctl_hardlockup_all_cpu_backtrace)
193188
trigger_allbutself_cpu_backtrace();
194189

arch/powerpc/kexec/crash.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
313313
int (*old_handler)(struct pt_regs *regs);
314314

315315
/* Avoid hardlocking with irresponsive CPU holding logbuf_lock */
316-
printk_nmi_enter();
316+
printk_deferred_enter();
317317

318318
/*
319319
* This function is only called after the system

arch/um/include/shared/user.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ extern void panic(const char *fmt, ...)
3838
#define UM_KERN_CONT KERN_CONT
3939

4040
#ifdef UML_CONFIG_PRINTK
41-
extern int printk(const char *fmt, ...)
41+
#define printk(...) _printk(__VA_ARGS__)
42+
extern int _printk(const char *fmt, ...)
4243
__attribute__ ((format (printf, 1, 2)));
4344
#else
4445
static inline int printk(const char *fmt, ...)

arch/x86/kernel/head_32.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ SYM_FUNC_START(early_ignore_irq)
432432
pushl 32(%esp)
433433
pushl 40(%esp)
434434
pushl $int_msg
435-
call printk
435+
call _printk
436436

437437
call dump_stack
438438

drivers/base/core.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4579,8 +4579,8 @@ static void __dev_printk(const char *level, const struct device *dev,
45794579
printk("%s(NULL device *): %pV", level, vaf);
45804580
}
45814581

4582-
void dev_printk(const char *level, const struct device *dev,
4583-
const char *fmt, ...)
4582+
void _dev_printk(const char *level, const struct device *dev,
4583+
const char *fmt, ...)
45844584
{
45854585
struct va_format vaf;
45864586
va_list args;
@@ -4594,7 +4594,7 @@ void dev_printk(const char *level, const struct device *dev,
45944594

45954595
va_end(args);
45964596
}
4597-
EXPORT_SYMBOL(dev_printk);
4597+
EXPORT_SYMBOL(_dev_printk);
45984598

45994599
#define define_dev_printk_level(func, kern_level) \
46004600
void func(const struct device *dev, const char *fmt, ...) \

include/asm-generic/vmlinux.lds.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,8 @@
483483
\
484484
TRACEDATA \
485485
\
486+
PRINTK_INDEX \
487+
\
486488
/* Kernel symbol table: Normal symbols */ \
487489
__ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
488490
__start___ksymtab = .; \
@@ -894,6 +896,17 @@
894896
#define TRACEDATA
895897
#endif
896898

899+
#ifdef CONFIG_PRINTK_INDEX
900+
#define PRINTK_INDEX \
901+
.printk_index : AT(ADDR(.printk_index) - LOAD_OFFSET) { \
902+
__start_printk_index = .; \
903+
*(.printk_index) \
904+
__stop_printk_index = .; \
905+
}
906+
#else
907+
#define PRINTK_INDEX
908+
#endif
909+
897910
#define NOTES \
898911
.notes : AT(ADDR(.notes) - LOAD_OFFSET) { \
899912
__start_notes = .; \

include/linux/dev_printk.h

Lines changed: 49 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ __printf(3, 4) __cold
3838
int dev_printk_emit(int level, const struct device *dev, const char *fmt, ...);
3939

4040
__printf(3, 4) __cold
41-
void dev_printk(const char *level, const struct device *dev,
42-
const char *fmt, ...);
41+
void _dev_printk(const char *level, const struct device *dev,
42+
const char *fmt, ...);
4343
__printf(2, 3) __cold
4444
void _dev_emerg(const struct device *dev, const char *fmt, ...);
4545
__printf(2, 3) __cold
@@ -69,7 +69,7 @@ static inline void __dev_printk(const char *level, const struct device *dev,
6969
struct va_format *vaf)
7070
{}
7171
static inline __printf(3, 4)
72-
void dev_printk(const char *level, const struct device *dev,
72+
void _dev_printk(const char *level, const struct device *dev,
7373
const char *fmt, ...)
7474
{}
7575

@@ -97,25 +97,57 @@ void _dev_info(const struct device *dev, const char *fmt, ...)
9797

9898
#endif
9999

100+
/*
101+
* Need to take variadic arguments even though we don't use them, as dev_fmt()
102+
* may only just have been expanded and may result in multiple arguments.
103+
*/
104+
#define dev_printk_index_emit(level, fmt, ...) \
105+
printk_index_subsys_emit("%s %s: ", level, fmt)
106+
107+
#define dev_printk_index_wrap(_p_func, level, dev, fmt, ...) \
108+
({ \
109+
dev_printk_index_emit(level, fmt); \
110+
_p_func(dev, fmt, ##__VA_ARGS__); \
111+
})
112+
113+
/*
114+
* Some callsites directly call dev_printk rather than going through the
115+
* dev_<level> infrastructure, so we need to emit here as well as inside those
116+
* level-specific macros. Only one index entry will be produced, either way,
117+
* since dev_printk's `fmt` isn't known at compile time if going through the
118+
* dev_<level> macros.
119+
*
120+
* dev_fmt() isn't called for dev_printk when used directly, as it's used by
121+
* the dev_<level> macros internally which already have dev_fmt() processed.
122+
*
123+
* We also can't use dev_printk_index_wrap directly, because we have a separate
124+
* level to process.
125+
*/
126+
#define dev_printk(level, dev, fmt, ...) \
127+
({ \
128+
dev_printk_index_emit(level, fmt); \
129+
_dev_printk(level, dev, fmt, ##__VA_ARGS__); \
130+
})
131+
100132
/*
101133
* #defines for all the dev_<level> macros to prefix with whatever
102134
* possible use of #define dev_fmt(fmt) ...
103135
*/
104136

105-
#define dev_emerg(dev, fmt, ...) \
106-
_dev_emerg(dev, dev_fmt(fmt), ##__VA_ARGS__)
107-
#define dev_crit(dev, fmt, ...) \
108-
_dev_crit(dev, dev_fmt(fmt), ##__VA_ARGS__)
109-
#define dev_alert(dev, fmt, ...) \
110-
_dev_alert(dev, dev_fmt(fmt), ##__VA_ARGS__)
111-
#define dev_err(dev, fmt, ...) \
112-
_dev_err(dev, dev_fmt(fmt), ##__VA_ARGS__)
113-
#define dev_warn(dev, fmt, ...) \
114-
_dev_warn(dev, dev_fmt(fmt), ##__VA_ARGS__)
115-
#define dev_notice(dev, fmt, ...) \
116-
_dev_notice(dev, dev_fmt(fmt), ##__VA_ARGS__)
117-
#define dev_info(dev, fmt, ...) \
118-
_dev_info(dev, dev_fmt(fmt), ##__VA_ARGS__)
137+
#define dev_emerg(dev, fmt, ...) \
138+
dev_printk_index_wrap(_dev_emerg, KERN_EMERG, dev, dev_fmt(fmt), ##__VA_ARGS__)
139+
#define dev_crit(dev, fmt, ...) \
140+
dev_printk_index_wrap(_dev_crit, KERN_CRIT, dev, dev_fmt(fmt), ##__VA_ARGS__)
141+
#define dev_alert(dev, fmt, ...) \
142+
dev_printk_index_wrap(_dev_alert, KERN_ALERT, dev, dev_fmt(fmt), ##__VA_ARGS__)
143+
#define dev_err(dev, fmt, ...) \
144+
dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
145+
#define dev_warn(dev, fmt, ...) \
146+
dev_printk_index_wrap(_dev_warn, KERN_WARNING, dev, dev_fmt(fmt), ##__VA_ARGS__)
147+
#define dev_notice(dev, fmt, ...) \
148+
dev_printk_index_wrap(_dev_notice, KERN_NOTICE, dev, dev_fmt(fmt), ##__VA_ARGS__)
149+
#define dev_info(dev, fmt, ...) \
150+
dev_printk_index_wrap(_dev_info, KERN_INFO, dev, dev_fmt(fmt), ##__VA_ARGS__)
119151

120152
#if defined(CONFIG_DYNAMIC_DEBUG) || \
121153
(defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE))

include/linux/hardirq.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ extern void rcu_nmi_exit(void);
116116
do { \
117117
lockdep_off(); \
118118
arch_nmi_enter(); \
119-
printk_nmi_enter(); \
120119
BUG_ON(in_nmi() == NMI_MASK); \
121120
__preempt_count_add(NMI_OFFSET + HARDIRQ_OFFSET); \
122121
} while (0)
@@ -135,7 +134,6 @@ extern void rcu_nmi_exit(void);
135134
do { \
136135
BUG_ON(!in_nmi()); \
137136
__preempt_count_sub(NMI_OFFSET + HARDIRQ_OFFSET); \
138-
printk_nmi_exit(); \
139137
arch_nmi_exit(); \
140138
lockdep_on(); \
141139
} while (0)

include/linux/module.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,11 @@ struct module {
511511
struct klp_modinfo *klp_info;
512512
#endif
513513

514+
#ifdef CONFIG_PRINTK_INDEX
515+
unsigned int printk_index_size;
516+
struct pi_entry **printk_index_start;
517+
#endif
518+
514519
#ifdef CONFIG_MODULE_UNLOAD
515520
/* What modules depend on me? */
516521
struct list_head source_list;

0 commit comments

Comments
 (0)