On 2020-06-25, Petr Mladek <pmladek@xxxxxxxx> wrote: > On Thu 2020-06-18 16:55:19, John Ogness wrote: >> --- a/kernel/printk/printk.c >> +++ b/kernel/printk/printk.c >> @@ -1609,11 +1633,15 @@ int do_syslog(int type, char __user *buf, int len, int source) >> break; >> /* Number of chars in the log buffer */ >> case SYSLOG_ACTION_SIZE_UNREAD: >> + if (source != SYSLOG_FROM_PROC) { >> + text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); >> + if (!text) >> + return -ENOMEM; > > The buffer is needed only to count lines to count the size of added > prefixes. Could we use the new prb_read_valid_info() that allows to > get the number of lines without actually reading the buffer? Yes! For the next version I introduce a macro to iterate just the meta data: #define prb_for_each_info(from, rb, s, i, lc) \ for ((s) = from; prb_read_valid_info(rb, s, i, lc); (s) = (i)->seq + 1) This can be used in all 3 locations where prb_count_lines() is used. In all three places, there is no need to be copying the data. And for SYSLOG_ACTION_SIZE_UNREAD, there is no need for the record and kmalloc'd buffer. This also means that prb_count_lines() will become a private static helper of the ringbuffer. John Ogness _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec