Re: printk: what is going on with additional newlines?

From: Sergey Senozhatsky
Date: Tue Aug 29 2017 - 20:56:46 EST


Hello,

On (08/29/17 10:52), Linus Torvalds wrote:
> On Tue, Aug 29, 2017 at 10:33 AM, Sergey Senozhatsky
> <sergey.senozhatsky@xxxxxxxxx> wrote:
> >
> > ok. that's something several people asked for -- some sort of buffered
> > printk mode; but people don't want to use a buffer allocated on the stack
> > (or kmalloc-ed, etc.) to do sprintf() on it and then feed it to printk("%s"),
> > because this adds some extra cost:
>
[..]
> Introduce a few helper functions for it:
>
> init_line_buffer(&buf);
> print_line(&buf, fmt, args);
> vprint_line(&buf, fmt, vararg);
> finish_line(&buf);
>
> or whatever, and it sounds like it should be pretty easy to use.

ok, I was short on details (sorry, it was almost 3am).

what I was talking/thinking about is not just a single complete continuation
line, but a whole bunch of printk calls (including continuation lines). like
OOM report with backtraces, and so on. the problem people are having (well,
according to emails I have got in my inbox) is the fact that
printk("a"); printk("b");

can appear in the logbuf (and serial console) pretty far; no one knows what
can happen between those calls. so the buffered-printk buffer is supposed to
be big enough for N lines and, more importantly, it stores those lines in
logbuf in consequent entries.

so the difference here is

while (buffer->whatever)
printk("%s\n", buffer->msg[i]);

vs

spin_lock(&logbuf_lock);
while (buffer->whatever)
log_store(buffer->msg[i]);
spin_unlock(&logbuf_lock);


a dynamic buffer with resizing probably may not work good enough in some
OOM cases.

-ss