Skip to content

Commit 3cb3091

Browse files
committed
ring-buffer: Use subbuf_order for buffer page masking
The comparisons to PAGE_SIZE were all converted to use the buffer->subbuf_order, but the use of PAGE_MASK was missed. Convert all the PAGE_MASK usages over to: (PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1 Link: https://lore.kernel.org/linux-trace-kernel/20231219173800.66eefb7a@gandalf.local.home Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Tzvetomir Stoyanov <tz.stoyanov@gmail.com> Cc: Vincent Donnefort <vdonnefort@google.com> Cc: Kent Overstreet <kent.overstreet@gmail.com> Fixes: 139f840 ("ring-buffer: Page size per ring buffer") Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
1 parent 2f84b39 commit 3cb3091

1 file changed

Lines changed: 11 additions & 8 deletions

File tree

kernel/trace/ring_buffer.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2269,11 +2269,13 @@ rb_commit_index(struct ring_buffer_per_cpu *cpu_buffer)
22692269
}
22702270

22712271
static __always_inline unsigned
2272-
rb_event_index(struct ring_buffer_event *event)
2272+
rb_event_index(struct ring_buffer_per_cpu *cpu_buffer, struct ring_buffer_event *event)
22732273
{
22742274
unsigned long addr = (unsigned long)event;
22752275

2276-
return (addr & ~PAGE_MASK) - BUF_PAGE_HDR_SIZE;
2276+
addr &= (PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1;
2277+
2278+
return addr - BUF_PAGE_HDR_SIZE;
22772279
}
22782280

22792281
static void rb_inc_iter(struct ring_buffer_iter *iter)
@@ -2646,15 +2648,16 @@ rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer,
26462648

26472649
/* Slow path */
26482650
static struct ring_buffer_event *
2649-
rb_add_time_stamp(struct ring_buffer_event *event, u64 delta, bool abs)
2651+
rb_add_time_stamp(struct ring_buffer_per_cpu *cpu_buffer,
2652+
struct ring_buffer_event *event, u64 delta, bool abs)
26502653
{
26512654
if (abs)
26522655
event->type_len = RINGBUF_TYPE_TIME_STAMP;
26532656
else
26542657
event->type_len = RINGBUF_TYPE_TIME_EXTEND;
26552658

26562659
/* Not the first event on the page, or not delta? */
2657-
if (abs || rb_event_index(event)) {
2660+
if (abs || rb_event_index(cpu_buffer, event)) {
26582661
event->time_delta = delta & TS_MASK;
26592662
event->array[0] = delta >> TS_SHIFT;
26602663
} else {
@@ -2728,7 +2731,7 @@ static void rb_add_timestamp(struct ring_buffer_per_cpu *cpu_buffer,
27282731
if (!abs)
27292732
info->delta = 0;
27302733
}
2731-
*event = rb_add_time_stamp(*event, info->delta, abs);
2734+
*event = rb_add_time_stamp(cpu_buffer, *event, info->delta, abs);
27322735
*length -= RB_LEN_TIME_EXTEND;
27332736
*delta = 0;
27342737
}
@@ -2812,10 +2815,10 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer,
28122815
struct buffer_page *bpage;
28132816
unsigned long addr;
28142817

2815-
new_index = rb_event_index(event);
2818+
new_index = rb_event_index(cpu_buffer, event);
28162819
old_index = new_index + rb_event_ts_length(event);
28172820
addr = (unsigned long)event;
2818-
addr &= PAGE_MASK;
2821+
addr &= ~((PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1);
28192822

28202823
bpage = READ_ONCE(cpu_buffer->tail_page);
28212824

@@ -3726,7 +3729,7 @@ rb_decrement_entry(struct ring_buffer_per_cpu *cpu_buffer,
37263729
struct buffer_page *bpage = cpu_buffer->commit_page;
37273730
struct buffer_page *start;
37283731

3729-
addr &= PAGE_MASK;
3732+
addr &= ~((PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1);
37303733

37313734
/* Do the likely case first */
37323735
if (likely(bpage->page == (void *)addr)) {

0 commit comments

Comments
 (0)