lkml.org 
[lkml]   [2015]   [May]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 04/10] printk: Merge and flush NMI buffer predictably via IRQ work
    Date
    It might take ages until users see messages from NMI context. They cannot
    be flushed to the console because the operation involves taking and
    releasing a bunch of locks. Everything gets fixed by the followup printk
    in normal context but it is not predictable.

    The same problem has printk_sched() and this patch reuses the existing
    solution.

    There is no special printk() variant for NMI context. Hence the IRQ work
    need to get queued from vprintk_emit().

    Signed-off-by: Petr Mladek <pmladek@suse.cz>
    ---
    kernel/printk/printk.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
    index bf2abdda5869..c2ae9ff388ae 100644
    --- a/kernel/printk/printk.c
    +++ b/kernel/printk/printk.c
    @@ -1554,9 +1554,6 @@ int printk_deferred(const char *fmt, ...)
    va_start(args, fmt);
    r = vprintk_emit(0, LOGLEVEL_SCHED, NULL, 0, fmt, args);
    va_end(args);
    -
    - __this_cpu_or(printk_pending, PRINTK_PENDING_OUTPUT);
    - irq_work_queue(this_cpu_ptr(&wake_up_klogd_work));
    preempt_enable();

    return r;
    @@ -1880,7 +1877,10 @@ asmlinkage int vprintk_emit(int facility, int level,
    * If called from the scheduler or NMI context, we can not get console
    * without a possible deadlock.
    */
    - if (!in_sched && !in_nmi()) {
    + if (in_sched || in_nmi()) {
    + __this_cpu_or(printk_pending, PRINTK_PENDING_OUTPUT);
    + irq_work_queue(this_cpu_ptr(&wake_up_klogd_work));
    + } else {
    lockdep_off();
    /*
    * Disable preemption to avoid being preempted while holding
    --
    1.8.5.6


    \
     
     \ /
      Last update: 2015-05-25 15:01    [W:6.311 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site