Re: [PATCH 5.10.y] printk: declare printk_deferred_{enter,safe}() in include/linux/printk.h

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux