On Sun, May 14, 2023 at 01:41:27PM +0900, Tetsuo Handa wrote: > commit 85e3e7fbbb720b9897fba9a99659e31cbd1c082e upstream. > > [This patch implements subset of original commit 85e3e7fbbb72 ("printk: > remove NMI tracking") where commit 1007843a9190 ("mm/page_alloc: fix > potential deadlock on zonelist_update_seq seqlock") depends on, for > commit 3d36424b3b58 ("mm/page_alloc: fix race condition between > build_all_zonelists and page allocation") was backported to stable.] > > All NMI contexts are handled the same as the safe context: store the > message and defer printing. There is no need to have special NMI > context tracking for this. Using in_nmi() is enough. > > There are several parts of the kernel that are manually calling into > the printk NMI context tracking in order to cause general printk > deferred printing: > > arch/arm/kernel/smp.c > arch/powerpc/kexec/crash.c > kernel/trace/trace.c > > For arm/kernel/smp.c and powerpc/kexec/crash.c, provide a new > function pair printk_deferred_enter/exit that explicitly achieves the > same objective. > > For ftrace, remove the printk context manipulation completely. It was > added in commit 03fc7f9c99c1 ("printk/nmi: Prevent deadlock when > accessing the main log buffer in NMI"). The purpose was to enforce > storing messages directly into the ring buffer even in NMI context. > It really should have only modified the behavior in NMI context. > There is no need for a special behavior any longer. All messages are > always stored directly now. The console deferring is handled > transparently in vprintk(). > > Signed-off-by: John Ogness <john.ogness@xxxxxxxxxxxxx> > [pmladek@xxxxxxxx: Remove special handling in ftrace.c completely. > Signed-off-by: Petr Mladek <pmladek@xxxxxxxx> > Link: https://lore.kernel.org/r/20210715193359.25946-5-john.ogness@xxxxxxxxxxxxx > [penguin-kernel: Copy only printk_deferred_{enter,safe}() definition ] > Signed-off-by: Tetsuo Handa <penguin-kernel@xxxxxxxxxxxxxxxxxxx> > --- > include/linux/printk.h | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/include/linux/printk.h b/include/linux/printk.h > index fe7eb2351610..344f6da3d4c3 100644 > --- a/include/linux/printk.h > +++ b/include/linux/printk.h > @@ -623,4 +623,23 @@ static inline void print_hex_dump_debug(const char *prefix_str, int prefix_type, > #define print_hex_dump_bytes(prefix_str, prefix_type, buf, len) \ > print_hex_dump_debug(prefix_str, prefix_type, 16, 1, buf, len, true) > > +#ifdef CONFIG_PRINTK > +extern void __printk_safe_enter(void); > +extern void __printk_safe_exit(void); > +/* > + * The printk_deferred_enter/exit macros are available only as a hack for > + * some code paths that need to defer all printk console printing. Interrupts > + * must be disabled for the deferred duration. > + */ > +#define printk_deferred_enter __printk_safe_enter > +#define printk_deferred_exit __printk_safe_exit > +#else > +static inline void printk_deferred_enter(void) > +{ > +} > +static inline void printk_deferred_exit(void) > +{ > +} > +#endif > + > #endif > -- > 2.34.1 > > All now queued up, thanks. greg k-h