On Wed, 31 Aug 2016 10:44:41 +0900 Sergey Senozhatsky <sergey.senozhatsky.w...@gmail.com> wrote:
> On (08/30/16 15:03), Andrew Morton wrote: > > > __printk_nmi_flush() can be called from nmi_panic(), therefore it has to > > > test whether it's executed in NMI context and thus must route the messages > > > through deferred printk() or via direct printk(). > > > > Why? What misbehaviour does the current code cause? > > the reasoning behind the `if in_nmi()' in print_nmi_seq_line() > > if (in_nmi()) > printk_deferred("%.*s", (end - start) + 1, buf); > else > printk("%.*s", (end - start) + 1, buf); > > was as follows (per Petr's commit message) OK, thanks, I altered the changelog thusly and scheduled the patch for 4.8: --- txt/printk-nmi-avoid-direct-printk-s-from-__printk_nmi_flush.txt +++ txt/printk-nmi-avoid-direct-printk-s-from-__printk_nmi_flush.txt @@ -3,8 +3,13 @@ __printk_nmi_flush() can be called from nmi_panic(), therefore it has to test whether it's executed in NMI context and thus must route the messages -through deferred printk() or via direct printk(). Except for two places -where __printk_nmi_flush() does unconditional direct printk() calls: +through deferred printk() or via direct printk(). This is to avoid +potential deadlocks, as described in cf9b1106c81c45cde ("printk/nmi: flush +NMI messages on the system panic"). + +However there remain two places where __printk_nmi_flush() does +unconditional direct printk() calls: + - pr_err("printk_nmi_flush: internal error ...") - pr_cont("\n")