lkml.org 
[lkml]   [2017]   [Apr]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC][PATCHv2 3/8] printk: offload printing from wake_up_klogd_work_func()
    Hi Petr,

    sorry for the delay.

    On (03/31/17 16:56), Petr Mladek wrote:
    [..]
    > > diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
    > > index ab6b3b2a68c6..1927b5cb5cbe 100644
    > > --- a/kernel/printk/printk.c
    > > +++ b/kernel/printk/printk.c
    > > @@ -2741,8 +2741,16 @@ static void wake_up_klogd_work_func(struct irq_work *irq_work)
    > > * If trylock fails, someone else is doing the printing.
    > > * PRINTK_PENDING_OUTPUT bit is cleared by console_unlock().
    > > */
    > > - if (console_trylock())
    > > - console_unlock();
    > > + if (printk_kthread_enabled()) {
    > > + wake_up_process(printk_kthread);
    >
    > Note that the relation between printk_kthread_enabled()
    > and wake_up_process() is racy. The conditions might change
    > between these two calls. It looks fine here, well almost.
    >
    > The critical point is in vprintk_emit(). It must use the emergency
    > mode (call the consoles directly) when it is called from a process
    > that started the emergency mode.

    hm, we don't guarantee this. printk(), both in threaded and in
    emergency modes, can fail to acquire console_sem.

    > We could be more relaxed here. IMHO, the only sensitive situation
    > is if printk_deferred() is used in the emergency context.
    > We might want to use the emergency mode here as well but
    > it is not guaranteed.

    hm, I don't think any path does

    printk_emergency_begin()
    printk_deferred()
    printk_emergency_end()

    and expects logbuf output to be flushed by the time it does
    printk_emergency_end(). it's most likely something like this

    printk_emergency_begin()
    printk()
    printk_emergency_end()

    the expectations here are more reasonable, but still, no
    guarantees are provided (even in non-kthreaded printk mode).

    > A solution might be to add one more bit, e.g.
    > PRINTK_PENDING_EMERGENCY_OUTPUT. We should force the emergency mode
    > here when it is set. It should be cleared together with the normal
    > PRINTK_PENDING_OUTPUT.
    >
    > Or do you think that this is a corner case that we could
    > ignore for now?

    hm, I guess we don't really count on irq_work in emergency
    situations. but I need more time to think. good questions, Petr.

    -ss

    \
     
     \ /
      Last update: 2017-04-04 17:17    [W:2.679 / U:0.176 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site