[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20181108123049.GA30440@jagdpanzerIV>
Date: Thu, 8 Nov 2018 21:30:49 +0900
From: Sergey Senozhatsky <sergey.senozhatsky.work@...il.com>
To: Petr Mladek <pmladek@...e.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky.work@...il.com>,
Sergey Senozhatsky <sergey.senozhatsky@...il.com>,
Tetsuo Handa <penguin-kernel@...ove.sakura.ne.jp>,
Dmitriy Vyukov <dvyukov@...gle.com>,
Steven Rostedt <rostedt@...dmis.org>,
Alexander Potapenko <glider@...gle.com>,
Fengguang Wu <fengguang.wu@...el.com>,
Josh Poimboeuf <jpoimboe@...hat.com>,
LKML <linux-kernel@...r.kernel.org>,
Linus Torvalds <torvalds@...ux-foundation.org>,
Andrew Morton <akpm@...ux-foundation.org>, linux-mm@...ck.org,
Ingo Molnar <mingo@...hat.com>,
Peter Zijlstra <peterz@...radead.org>,
Will Deacon <will.deacon@....com>
Subject: Re: [PATCH v6 1/3] printk: Add line-buffered printk() API.
On (11/08/18 12:24), Petr Mladek wrote:
> I believe that I mentioned this more times. 16 buffers is the first
> attempt. We could improve it later in several ways
Sure. Like I said - maybe it is a normal development pattern; I really
don't know.
> > Let's have one more look at what we will fix and what we will break.
> >
> > 'cont' has premature flushes.
> >
> > Why is it good.
> > It preserves the correct order of events.
> >
> > pr_cont("calling foo->init()....");
> > foo->init()
> > printk("Can't allocate buffer\n"); // premature flush
> > pr_cont("...blah\h");
> >
> > Will end up in the logbuf as:
> > [12345.123] calling foo->init()....
> > [12345.124] Can't allocate buffer
> > [12345.125] ...blah
> >
> > Where buffered printk will endup as:
> > [12345.123] Can't allocate buffer
> > [12345.124] calling foo->init().......blah
>
> We will always have this problem with API using explicit buffers.
Exactly.
> What do you suggest instead, please?
So this is why "let's not remove 'cont'" thing. Buffered printk
is not 100% identical to 'cont'. And 'cont' does a good job sometimes,
Because 'cont' looks like a buffered printk, but it behaves like a
normal printk when things go bad. Buffered printk is always buffered;
and not even aware of the fact that things go bad around.
> > If our problem is OOM and lockdep print outs, then let's address only
> > those two; let's not "fix" the rest of the kernel, especially the early
> > boot, - we can break more things than we can mend.
>
> Do you have any alternative proposal how to handle OOM and lockdep, please?
You misunderstood me. I'm not against the buffered printk in lockdep and
OOM. Albeit I must admit that lockdep patch looks quite big. I don't like
the idea of "we will remove 'cont' and replace it with buffered printk
through out the kernel".
[..]
> > - It seems that buffered printk attempts to solve too many problems.
> > I'd prefer it to address just one.
>
> This API tries to handle continuous lines more reliably.
> Do I miss anything, please?
This part:
+ /* Flush already completed lines if any. */
+ for (pos = ptr->len - 1; pos >= 0; pos--) {
+ if (ptr->buf[pos] != '\n')
+ continue;
+ ptr->buf[pos++] = '\0';
+ printk("%s\n", ptr->buf);
+ ptr->len -= pos;
+ memmove(ptr->buf, ptr->buf + pos, ptr->len);
+ /* This '\0' will be overwritten by next vsnprintf() above. */
+ ptr->buf[ptr->len] = '\0';
+ break;
+ }
+ return r;
If I'm not mistaken, this is for the futute "printk injection" work.
Right now printk("foo\nbar\n") will end up to be a single logbuf
entry, with \n in the middle and at the end. So it will look like
two lines on the serial console:
[123.123] foo
bar
Tetsuo does this \n lookup (on every vprintk_buffered) and split lines
(via memove) for "printk injection", so the output will be
[123.123] foo
[123.124] bar
Which makes it simpler to "inject" printk origin into every printed
line.
Without it we can just do
len = vsprintf();
if (len && text[len - 1] == '\n' || overflow)
flush();
Can't we?
-ss
Powered by blists - more mailing lists