[PATCH next v1 2/3] printk: remove safe buffers
Petr Mladek
pmladek at suse.com
Mon Mar 22 18:02:43 GMT 2021
On Mon 2021-03-22 12:16:15, John Ogness wrote:
> On 2021-03-21, Sergey Senozhatsky <senozhatsky at chromium.org> wrote:
> >> @@ -369,7 +70,10 @@ __printf(1, 0) int vprintk_func(const char *fmt, va_list args)
> >> * Use the main logbuf even in NMI. But avoid calling console
> >> * drivers that might have their own locks.
> >> */
> >> - if ((this_cpu_read(printk_context) & PRINTK_NMI_DIRECT_CONTEXT_MASK)) {
> >> + if (this_cpu_read(printk_context) &
> >> + (PRINTK_NMI_DIRECT_CONTEXT_MASK |
> >> + PRINTK_NMI_CONTEXT_MASK |
> >> + PRINTK_SAFE_CONTEXT_MASK)) {
> >
> > Do we need printk_nmi_direct_enter/exit() and
> > PRINTK_NMI_DIRECT_CONTEXT_MASK? Seems like all printk_safe() paths
> > are now DIRECT - we store messages to the prb, but don't call console
> > drivers.
>
> I was planning on waiting until the kthreads are introduced, in which
> case printk_safe.c is completely removed.
You want to keep printk_safe() context because it prevents calling
consoles even in normal context. Namely, it prevents deadlock by
recursively taking, for example, sem->lock in console_lock() or
console_owner_lock in console_trylock_spinning(). Am I right?
> But I suppose I could switch
> the 1 printk_nmi_direct_enter() user to printk_nmi_enter() so that
> PRINTK_NMI_DIRECT_CONTEXT_MASK can be removed now. I would do this in a
> 4th patch of the series.
Yes, please unify the PRINTK_NMI_CONTEXT. One is enough.
I wonder if it would make sense to go even further at this stage.
There will still be 4 contexts that modify the printk behavior after
this patchset:
+ printk_count set by printk_enter()/exit()
+ prevents: infinite recursion
+ context: any context
+ action: skips entire printk at 3rd recursion level
+ prink_context set by printk_safe_enter()/exit()
+ prevents: dead lock caused by recursion into some
console code in any context
+ context: any
+ action: skips console call at 1st recursion level
+ printk_context set by printk_nmi_enter()/exit()
+ prevents: dead lock caused by any console lock recursion
+ context: NMI
+ action: skips console calls at 0th recursion level
+ kdb_trap_printk
+ redirects printk() to kdb_printk() in kdb context
What is possible?
1. We could get rid of printk_nmi_enter()/exit() and
PRINTK_NMI_CONTEXT completely already now. It is enough
to check in_nmi() in printk_func().
printk_nmi_enter() was added by the commit 42a0bb3f71383b457a7db362
("printk/nmi: generic solution for safe printk in NMI"). It was
really needed to modify @printk_func pointer.
We did not remove it later when printk_function became a real
function. The idea was to track all printk contexts in a single
variable. But we never added kdb context.
It might make sense to remove it now. Peter Zijstra would be happy.
There already were some churns with tracking printk_context in NMI.
For example, see
https://lore.kernel.org/r/20200219150744.428764577@infradead.org
IMHO, it does not make sense to wait until the entire console-stuff
rework is done in this case.
2. I thought about unifying printk_safe_enter()/exit() and
printk_enter()/exit(). They both count recursion with
IRQs disabled, have similar name. But they are used
different way.
But better might be to rename printk_safe_enter()/exit() to
console_enter()/exit() or to printk_deferred_enter()/exit().
It would make more clear what it does now. And it might help
to better distinguish it from the new printk_enter()/exit().
This patchset actually splits the original printk_safe()
functionality into two:
+ printk_count prevents infinite recursion
+ printk_deferred_enter() deffers console handling.
I am not sure if it is worth it. But it might help people (even me)
when digging into the printk history. Different name will help to
understand the functionality at the given time.
What do you think, please?
Best Regards,
Petr
More information about the kexec
mailing list