On (06/25/19 10:44), John Ogness wrote: > > 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)? > > (As suggested by Petr) I want to use vscnprintf() on a NULL > buffer. However, a NULL buffer is not sufficient because things like the > loglevel are sometimes added via %s (for example, in /dev/kmsg). So > rather than a NULL buffer, I would use a small buffer on the stack > (large enough to store loglevel/cont information). This way we can use > vscnprintf() to get the exact size _and_ printk_get_level() will see > enough of the formatted string to parse what it needs.
OK. I guess this should work except for the cases when we want to printk that we are running out of stack :) More seriously, tho, sometimes messages come with dictionaries of key/value pairs. I don't think we impose any strict limits on the number of key/value pair or on the overall size of the dictionary each record can have (up to a single PAGE, I'd guess. I really need to check printk code). Finding a sufficiently large buffer size might be a bit of a task. > > 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. > > The average printk message size is well under 128 bytes. Do you also count in dictionary of properties (key/value pairs) which records can carry? For printks from core kernel 128 bytes would be a good estimation, for dev_printk() and so on - I'm not exactly sure. cat /dev/kmsg This one, for instance, is a single logbuf record 6,560,2470340,-;hid-generic 0003:093A:2510.0001: input,hidraw0: USB HID v1.11 Mouse [PixArt USB Optical Mouse] on usb-0000:00:14.0-3/input0 SUBSYSTEM=hid DEVICE=+hid:0003:093A:2510.0001 I suspect that it's larger than 128 bytes. > It would be quite wasteful to always reserve 1K blocks. Agreed. -ss