Re: [RFC PATCH v2 1/2] printk-rb: add a new printk ringbuffer implementation

From: Sergey Senozhatsky
Date: Tue Jun 25 2019 - 03:15:08 EST


On (06/25/19 15:45), Sergey Senozhatsky wrote:
> On (06/19/19 00:12), John Ogness wrote:
> > On 2019-06-18, Sergey Senozhatsky <sergey.senozhatsky.work@xxxxxxxxx> wrote:
> > >> + struct prb_reserved_entry e;
> > >> + char *s;
> > >> +
> > >> + s = prb_reserve(&e, &rb, 32);
> > >> + if (s) {
> > >> + sprintf(s, "Hello, world!");
> > >> + prb_commit(&e);
> > >> + }
> > >
> > > A nit: snprintf().
> > >
> > > sprintf() is tricky, it may write "slightly more than was
> > > anticipated" bytes - all those string_nocheck(" disabled"),
> > > error_string("pK-error"), etc.
> >
> > Agreed. Documentation should show good examples.
>
> In vprintk_emit(), are we going to always reserve 1024-byte
> records, since we don't know the size in advance, e.g.
>
> printk("%pS %s\n", regs->ip, current->name)
> prb_reserve(&e, &rb, ????);
>
> or are we going to run vscnprintf() on a NULL buffer first,
> then reserve the exactly required number of bytes and afterwards
> vscnprintf(s) -> prb_commit(&e)?

I'm asking this because, well, if the most common usage
pattern (printk->prb_reserve) will always reserve fixed
size records (aka data blocks), then you _probably_ (??)
can drop the 'variable size records' requirement from prb
design and start looking at records (aka data blocks) as
fixed sized chunks of bytes, which are always located at
fixed offsets.

-ss