summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-04-20 15:42:18 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2026-04-20 15:42:18 -0700
commitb66cb4f156fe47f52065e70eb1b2f12ccd0c2884 (patch)
treed01e64db991f12c1bcc3f278d4c6b6c9425b9c15 /kernel
parentccbc9fdb327d164f2a0f423e93499058e8add68c (diff)
parentadd9d911be9b141706ccf41d17b4043ed1bc12a1 (diff)
downloadlinux-b66cb4f156fe47f52065e70eb1b2f12ccd0c2884.tar.gz
linux-b66cb4f156fe47f52065e70eb1b2f12ccd0c2884.zip
Merge tag 'printk-for-7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux
Pull printk updates from Petr Mladek: - Fix printk ring buffer initialization and sanity checks - Workaround printf kunit test compilation with gcc < 12.1 - Add IPv6 address printf format tests - Misc code and documentation cleanup * tag 'printk-for-7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux: printf: Compile the kunit test with DISABLE_BRANCH_PROFILING DISABLE_BRANCH_PROFILING lib/vsprintf: use bool for local decode variable lib/hexdump: print_hex_dump_bytes() calls print_hex_dump_debug() printk: ringbuffer: fix errors in comments printk_ringbuffer: Add sanity check for 0-size data printk_ringbuffer: Fix get_data() size sanity check printf: add IPv6 address format tests printk: Fix _DESCS_COUNT type for 64-bit systems
Diffstat (limited to 'kernel')
-rw-r--r--kernel/printk/printk_ringbuffer.c27
-rw-r--r--kernel/printk/printk_ringbuffer.h4
2 files changed, 17 insertions, 14 deletions
diff --git a/kernel/printk/printk_ringbuffer.c b/kernel/printk/printk_ringbuffer.c
index 56c8e3d031f4..85c0c854b3ce 100644
--- a/kernel/printk/printk_ringbuffer.c
+++ b/kernel/printk/printk_ringbuffer.c
@@ -14,7 +14,7 @@
*
* Data Structure
* --------------
- * The printk_ringbuffer is made up of 3 internal ringbuffers:
+ * The printk_ringbuffer is made up of 2 internal ringbuffers:
*
* desc_ring
* A ring of descriptors and their meta data (such as sequence number,
@@ -224,7 +224,7 @@
*
* prb_rec_init_rd(&r, &info, &text_buf[0], sizeof(text_buf));
*
- * prb_for_each_record(0, &test_rb, &seq, &r) {
+ * prb_for_each_record(0, &test_rb, seq, &r) {
* if (info.seq != seq)
* pr_warn("lost %llu records\n", info.seq - seq);
*
@@ -1302,23 +1302,26 @@ static const char *get_data(struct prb_data_ring *data_ring,
return NULL;
}
- /* Sanity check. Data-less blocks were handled earlier. */
- if (WARN_ON_ONCE(!data_check_size(data_ring, *data_size) || !*data_size))
- return NULL;
-
/* A valid data block will always be aligned to the ID size. */
if (WARN_ON_ONCE(blk_lpos->begin != ALIGN(blk_lpos->begin, sizeof(db->id))) ||
WARN_ON_ONCE(blk_lpos->next != ALIGN(blk_lpos->next, sizeof(db->id)))) {
return NULL;
}
- /* A valid data block will always have at least an ID. */
- if (WARN_ON_ONCE(*data_size < sizeof(db->id)))
+ /*
+ * A regular data block will always have an ID and at least
+ * 1 byte of data. Data-less blocks were handled earlier.
+ */
+ if (WARN_ON_ONCE(*data_size <= sizeof(db->id)))
return NULL;
/* Subtract block ID space from size to reflect data size. */
*data_size -= sizeof(db->id);
+ /* Sanity check the max size of the regular data block. */
+ if (WARN_ON_ONCE(!data_check_size(data_ring, *data_size)))
+ return NULL;
+
return &db->data[0];
}
@@ -1365,7 +1368,7 @@ static struct prb_desc *desc_reopen_last(struct prb_desc_ring *desc_ring,
*
* WMB from _prb_commit:A to _prb_commit:B
* matching
- * MB If desc_reopen_last:A to prb_reserve_in_last:A
+ * MB from desc_reopen_last:A to prb_reserve_in_last:A
*/
if (!atomic_long_try_cmpxchg(&d->state_var, &prev_state_val,
DESC_SV(id, desc_reserved))) { /* LMM(desc_reopen_last:A) */
@@ -1770,9 +1773,9 @@ static void _prb_commit(struct prb_reserved_entry *e, unsigned long state_val)
*
* Relies on:
*
- * MB _prb_commit:B to prb_commit:A
+ * MB from _prb_commit:B to prb_commit:A
* matching
- * MB desc_reserve:D to desc_make_final:A
+ * MB from desc_reserve:D to desc_make_final:A
*/
if (!atomic_long_try_cmpxchg(&d->state_var, &prev_state_val,
DESC_SV(e->id, state_val))) { /* LMM(_prb_commit:B) */
@@ -2035,7 +2038,7 @@ u64 prb_first_seq(struct printk_ringbuffer *rb)
*
* MB from desc_push_tail:B to desc_reserve:F
* matching
- * RMB prb_first_seq:B to prb_first_seq:A
+ * RMB from prb_first_seq:B to prb_first_seq:A
*/
smp_rmb(); /* LMM(prb_first_seq:C) */
}
diff --git a/kernel/printk/printk_ringbuffer.h b/kernel/printk/printk_ringbuffer.h
index 1651b53ece34..2648da0a68b2 100644
--- a/kernel/printk/printk_ringbuffer.h
+++ b/kernel/printk/printk_ringbuffer.h
@@ -127,7 +127,7 @@ enum desc_state {
};
#define _DATA_SIZE(sz_bits) (1UL << (sz_bits))
-#define _DESCS_COUNT(ct_bits) (1U << (ct_bits))
+#define _DESCS_COUNT(ct_bits) (1UL << (ct_bits))
#define DESC_SV_BITS BITS_PER_LONG
#define DESC_FLAGS_SHIFT (DESC_SV_BITS - 2)
#define DESC_FLAGS_MASK (3UL << DESC_FLAGS_SHIFT)
@@ -388,7 +388,7 @@ for ((s) = from; prb_read_valid(rb, s, r); (s) = (r)->info->seq + 1)
*
* This is a macro for conveniently iterating over a ringbuffer.
* Note that @s may not be the sequence number of the record on each
- * iteration. For the sequence number, @r->info->seq should be checked.
+ * iteration. For the sequence number, @i->seq should be checked.
*
* Context: Any context.
*/