[PATCH] printk_ringbuffer: Fix space_used() when blk_lpos->next overflows
From: Wang Wensheng
Date: Sun Oct 04 2026 - 03:59:09 EST
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@xxxxxxx>
---
kernel/printk/printk_ringbuffer.c | 8 +++-----
1 file 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
--
2.43.0