Messages in this thread | | | Date | Fri, 14 Apr 2023 11:00:55 +0200 | From | Petr Mladek <> | Subject | Re: [PATCHv2] seq_buf: add seq_buf_do_printk() helper |
| |
On Tue 2023-04-11 23:38:52, Sergey Senozhatsky wrote: > Sometimes we use seq_buf to format a string buffer, which > we then pass to printk(). However, in certain situations > the seq_buf string buffer can get too big, exceeding the > PRINTKRB_RECORD_MAX bytes limit, and causing printk() to > truncate the string. > > Add a new seq_buf helper. This helper prints the seq_buf > string buffer line by line, using \n as a delimiter, > rather than passing the whole string buffer to printk() > at once. > > --- a/lib/seq_buf.c > +++ b/lib/seq_buf.c > @@ -93,6 +93,40 @@ int seq_buf_printf(struct seq_buf *s, const char *fmt, ...) > } > EXPORT_SYMBOL_GPL(seq_buf_printf); > > +/** > + * seq_buf_do_printk - printk seq_buf line by line > + * @s: seq_buf descriptor > + * @lvl: printk level > + * > + * printk()-s a multi-line sequential buffer line by line. The function > + * makes sure that the buffer in @s is nul terminated and safe to read > + * as a string. > + */ > +void seq_buf_do_printk(struct seq_buf *s, const char *lvl) > +{ > + const char *start, *lf; > + int len; > + > + if (s->size == 0 || s->len == 0) > + return; > + > + seq_buf_terminate(s); > + > + start = s->buffer; > + while ((lf = strchr(start, '\n'))) { > + len = lf - start + 1; > + printk("%s%.*s", lvl, len, start); > + start = ++lf; > + } > + > + /* No trailing LF */ > + if (start < s->buffer + s->len) { > + len = s->buffer + s->len - start; > + printk("%s%.*s\n", lvl, len, start);
We know that the string is '\0' terminated, so the last print might be easier:
if (start < s->buffer + s->len) printk("%s%s\n", lvl, start);
Anyway, it looks good. With or without this change:
Reviewed-by: Petr Mladek <pmladek@suse.com>
Best Regards, Petr
| |