summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJohn Ogness <john.ogness@linutronix.de>2021-02-11 18:37:52 +0106
committerPetr Mladek <pmladek@suse.com>2021-02-12 17:54:59 +0100
commit13791c80b0cdf54d92fc54221cdf490683b109de (patch)
tree946c0a82da85fe3de36186c3f9ffbab8ea3190e8 /lib
parent9bc284ca0b6a1fdbb71fc5b6a0e1b65d743cf2ad (diff)
downloadlinux-stable-13791c80b0cdf54d92fc54221cdf490683b109de.tar.gz
linux-stable-13791c80b0cdf54d92fc54221cdf490683b109de.tar.bz2
linux-stable-13791c80b0cdf54d92fc54221cdf490683b109de.zip
printk: avoid prb_first_valid_seq() where possible
If message sizes average larger than expected (more than 32 characters), the data_ring will wrap before the desc_ring. Once the data_ring wraps, it will start invalidating descriptors. These invalid descriptors hang around until they are eventually recycled when the desc_ring wraps. Readers do not care about invalid descriptors, but they still need to iterate past them. If the average message size is much larger than 32 characters, then there will be many invalid descriptors preceding the valid descriptors. The function prb_first_valid_seq() always begins at the oldest descriptor and searches for the first valid descriptor. This can be rather expensive for the above scenario. And, in fact, because of its heavy usage in /dev/kmsg, there have been reports of long delays and even RCU stalls. For code that does not need to search from the oldest record, replace prb_first_valid_seq() usage with prb_read_valid_*() functions, which provide a start sequence number to search from. Fixes: 896fbe20b4e2333fb55 ("printk: use the lockless ringbuffer") Reported-by: kernel test robot <oliver.sang@intel.com> Reported-by: J. Avila <elavila@google.com> Signed-off-by: John Ogness <john.ogness@linutronix.de> Reviewed-by: Petr Mladek <pmladek@suse.com> Signed-off-by: Petr Mladek <pmladek@suse.com> Link: https://lore.kernel.org/r/20210211173152.1629-1-john.ogness@linutronix.de
Diffstat (limited to 'lib')
0 files changed, 0 insertions, 0 deletions