summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWang Wensheng <wsw9603@163.com>2026-10-04 15:57:55 +0800
committerPetr Mladek <pmladek@suse.com>2026-10-27 14:52:23 +0100
commit2b2dc9dd356aed030e7ac11469d12f736793bc89 (patch)
tree7129a00cb048b4276d5624842f60f6442949292c
parent5b212610d0b8f474f1eef70b9a5aa4b2ecfff788 (diff)
printk_ringbuffer: Fix space_used() when blk_lpos->next overflows
Since commit 67e1b0052f6b ("printk_ringbuffer: don't needlessly wrap data blocks around") blk_lpos is treated as not wrapped when blk_lpos->next overflows to the start of data_ring. We use the indices of blk_lpos->next and blk_lpos->start to calculate the size of the data_block. This computes zero minus a small positive value, resulting in underflow and an unexpectedly large value. Simply using the original lpos with wrap-counts solves the problem. Fixes: 67e1b0052f6b ("printk_ringbuffer: don't needlessly wrap data blocks around") Signed-off-by: Wang Wensheng <wsw9603@163.com> Reviewed-by: John Ogness <john.ogness@linutronix.de> Reviewed-by: Petr Mladek <pmladek@suse.com> Link: https://patch.msgid.link/20261004075755.363989-1-wsw9603@163.com Signed-off-by: Petr Mladek <pmladek@suse.com>
-rw-r--r--kernel/printk/printk_ringbuffer.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/kernel/printk/printk_ringbuffer.c b/kernel/printk/printk_ringbuffer.c
index d38e7c2f6887..46a79ec0940a 100644
--- a/kernel/printk/printk_ringbuffer.c
+++ b/kernel/printk/printk_ringbuffer.c
@@ -1237,11 +1237,9 @@ static unsigned int space_used(struct prb_data_ring *data_ring,
if (BLK_DATALESS(blk_lpos))
return 0;
- if (!is_blk_wrapped(data_ring, blk_lpos->begin, blk_lpos->next)) {
- /* Data block does not wrap. */
- return (DATA_INDEX(data_ring, blk_lpos->next) -
- DATA_INDEX(data_ring, blk_lpos->begin));
- }
+ /* Data block does not wrap. */
+ if (!is_blk_wrapped(data_ring, blk_lpos->begin, blk_lpos->next))
+ return blk_lpos->next - blk_lpos->begin;
/*
* For wrapping data blocks, the trailing (wasted) space is