--- /dev/null
+From stable-owner@vger.kernel.org Sun May 14 06:41:59 2023
+From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+Date: Sun, 14 May 2023 13:41:27 +0900
+Subject: printk: declare printk_deferred_{enter,safe}() in include/linux/printk.h
+To: stable@vger.kernel.org
+Cc: John Ogness <john.ogness@linutronix.de>, Petr Mladek <pmladek@suse.com>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Message-ID: <767ab028-d946-98d5-4a13-d6ed6df77763@I-love.SAKURA.ne.jp>
+
+From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+
+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@linutronix.de>
+[pmladek@suse.com: Remove special handling in ftrace.c completely.
+Signed-off-by: Petr Mladek <pmladek@suse.com>
+Link: https://lore.kernel.org/r/20210715193359.25946-5-john.ogness@linutronix.de
+[penguin-kernel: Copy only printk_deferred_{enter,safe}() definition ]
+Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/linux/printk.h | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+--- a/include/linux/printk.h
++++ b/include/linux/printk.h
+@@ -623,4 +623,23 @@ static inline void print_hex_dump_debug(
+ #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