Re: [RFC][PATCH 0/7] printk: use alt_printk to handle printk() recursive calls
From: Petr Mladek
Date: Fri Sep 30 2016 - 07:27:56 EST
On Fri 2016-09-30 11:43:07, Sergey Senozhatsky wrote:
> On (09/29/16 15:25), Petr Mladek wrote:
> > On Tue 2016-09-27 23:22:30, Sergey Senozhatsky wrote:
> > > Hello,
> > >
> > > RFC
> > >
> > > This patch set extends a lock-less NMI per-cpu buffers idea to
> > > handle recursive printk() calls. The basic mechanism is pretty much the
> > > same -- at the beginning of a deadlock-prone section we switch to lock-less
> > > printk callback, and return back to a default printk implementation at the
> > > end; the messages are getting flushed to a logbuf buffer from a safer
> > > context.
> > I was skeptical but I really like this way now.
> > The switching of the buffers is a bit hairy in this version but I
> > think that we could make it much better.
> > Other than that it looks like a big win. It kills a lot of
> > printk-related pain points. And it will not be that complicated
> > after all.
> many thanks for looking at this train wreck.
> so, like I said, it addresses printk()-recursion in *ideally* quite
> a minimalistic way -- just several alt_printk_enter/exit calls in
> printk.c, without ever touching any other parts of the kernel.
> gunning down printk deadlocks in general, however, requires much more
> effort; or even a completely different approach.
> a) a lock-less printk() by default
> um, `#define printk alt_printk'. but this will break printk() from irq.
> and the ordering of messages from per-cpu buffers may be far from correct.
Well, the current vprintk_nmi() is lockless. The alternative printk()
is going to use the same code, so it will be lockless as well. It
means that even this patchset is supposed to avoid all possible
deadlocks via printk() calls.
There is still a risk of an infinite recursion. But vprintk_nmi()
bails out early when the buffer is full. This should minimalize
the risk. In fact, the recursion would become rather theoretical