On (20/05/18 11:21), Petr Mladek wrote: [..] > > > Is this guaranteed that we never execute this path from NMI? > > Good question! > > > Absolutely not. > > > > The execution context for kdb is pretty much unique... we are running a > > debug mode with all CPUs parked in a holding loop with interrupts > > disabled. One CPU is at an unknown exception state and the others are > > either handling an IRQ or NMI depending on architecture[1]. > > This is similar to the situation in panic() when other CPUs are > stopped. It is more safe when the CPUs are stopped using IRQ. > There is higher danger of a deadlock when NMI is used. > > bust_spinlock() is used in panic() to increase the chance to go over > the deadlock and actually see the messages. It is not enough when > more locks are used by the console (VT/TTY is good example). And > it is not guaranteed that the console will still work after > the hack is disabled by bust_spinlocks(0).
Good point. It's not guaranteed to help, but bust_spinlocks() does help in general, many serial drivers do check oops_in_progress and use a deadlock safe approach when locking port lock. I don't see bust_spinlocks() being used in kdb, so it probably better start doing so (along with general for_each_console() loop improvements, like checking if console is enabled/available/etc). [..] > > > If so, can this please be added to the commit message? A more > > > detailed commit message will help a lot. > > What about? > > "KDB has to get messages on consoles even when the system is stopped. > It uses kdb_printf() internally and calls console drivers on its own. > > It uses a hack to reuse an existing code. It sets "kdb_trap_printk" > global variable to redirect even the normal printk() into the > kdb_printf() variant. > > The variable "kdb_trap_printk" is checked in printk_default() and > it is ignored when printk is redirected to printk_safe in NMI context. > Solve this by moving the check into printk_func(). > > It is obvious that it is not fully safe. But it does not make things > worse. The console drivers are already called in this context by > kdb_printf() direct calls." This looks more informative indeed. Thanks! -ss