On Tue, 27 Dec 2016 23:16:07 +0900 Sergey Senozhatsky <sergey.senozhat...@gmail.com> wrote:
> Always use printk_deferred() in printk_safe_flush_line(). > Flushing can be done from NMI or printk_safe contexts (when > we are in panic), so we can't call console drivers, yet still > want to store the messages in the logbuf buffer. Therefore we > use a deferred printk version. > > Signed-off-by: Sergey Senozhatsky <sergey.senozhat...@gmail.com> > Suggested-by: Petr Mladek <pmla...@suse.com> > Reviewed-by: Petr Mladek <pmla...@suse.com> > --- > kernel/printk/printk_safe.c | 12 +++++------- > 1 file changed, 5 insertions(+), 7 deletions(-) > > diff --git a/kernel/printk/printk_safe.c b/kernel/printk/printk_safe.c > index efc89a4e9df5..054c9128ade0 100644 > --- a/kernel/printk/printk_safe.c > +++ b/kernel/printk/printk_safe.c > @@ -113,14 +113,12 @@ static int printk_safe_log_store(struct > printk_safe_seq_buf *s, > static void printk_safe_flush_line(const char *text, int len) > { > /* > - * The buffers are flushed in NMI only on panic. The messages must > - * go only into the ring buffer at this stage. Consoles will get > - * explicitly called later when a crashdump is not generated. > + * Avoid any console drivers calls from here, because we may be > + * in NMI or printk_safe context (when in panic). The messages > + * must go only into the ring buffer at this stage. Consoles will > + * get explicitly called later when a crashdump is not generated. > */ > - if (in_nmi()) > - printk_deferred("%.*s", len, text); > - else > - printk("%.*s", len, text); > + printk_deferred("%.*s", len, text); > } The helper function was there because of the if statement. Just nuke this function and call printk_deferred() directly. You can move the comment to the caller. -- Steve > > /* printk part of the temporary buffer line by line */