Messages in this thread | | | Subject | Re: [PATCH printk 3/5] printk: use buffer pool for sprint buffers | From | Rasmus Villemoes <> | Date | Thu, 24 Sep 2020 14:32:49 +0200 |
| |
On 24/09/2020 11.54, Rasmus Villemoes wrote: > On 23/09/2020 17.11, Petr Mladek wrote: >> On Tue 2020-09-22 17:44:14, John Ogness wrote: >>> vprintk_store() is using a single static buffer as a temporary >>> sprint buffer for the message text. This will not work once >>> @logbuf_lock is removed. Replace the single static buffer with a >>> pool of buffers. >> >> The buffer is used because we do not know the length of the >> formatted message to reserve the right space in the ring buffer >> in advance. >> >> There was the idea to call vsprintf(NULL, fmt, args) to count >> the length in advance. > > sprintf is dog slow. If you do this, perhaps say "we can afford to use > 128 bytes of stack" and do vsprintf(stackbuf, 128, fmt, args) to do the > counting, and in the vast majority of cases where the text fits we don't > need to do vsprintf() again.
Or, since 128 bytes of stack may be too much, combine the "pre-allocate a few buffers" with "but fall back to vsprintf(NULL) if we can't get one". That should allow choosing the X in X*1024 smaller than what worst-case requires (which will never actually be used, assuming the machine is doing something useful rather than just printk'ing all day long) and still works even when a tmp buffer can't be obtained.
Rasmus
| |