mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 23:19:34 +02:00
ring-buffer: Store bpage pointers into subbuf_ids
The subbuf_ids field allows to point to a specific page from the ring-buffer based on its ID. As a preparation or the upcoming ring-buffer remote support, point this array to the buffer_page instead of the buffer_data_page. Link: https://patch.msgid.link/20260309162516.2623589-3-vdonnefort@google.com Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org> Signed-off-by: Vincent Donnefort <vdonnefort@google.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
committed by
Steven Rostedt (Google)
parent
7d776a3627
commit
e682207bf7
@@ -555,7 +555,7 @@ struct ring_buffer_per_cpu {
|
||||
unsigned int mapped;
|
||||
unsigned int user_mapped; /* user space mapping */
|
||||
struct mutex mapping_lock;
|
||||
unsigned long *subbuf_ids; /* ID to subbuf VA */
|
||||
struct buffer_page **subbuf_ids; /* ID to subbuf VA */
|
||||
struct trace_buffer_meta *meta_page;
|
||||
struct ring_buffer_cpu_meta *ring_meta;
|
||||
|
||||
@@ -7036,7 +7036,7 @@ static void rb_free_meta_page(struct ring_buffer_per_cpu *cpu_buffer)
|
||||
}
|
||||
|
||||
static void rb_setup_ids_meta_page(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
unsigned long *subbuf_ids)
|
||||
struct buffer_page **subbuf_ids)
|
||||
{
|
||||
struct trace_buffer_meta *meta = cpu_buffer->meta_page;
|
||||
unsigned int nr_subbufs = cpu_buffer->nr_pages + 1;
|
||||
@@ -7045,7 +7045,7 @@ static void rb_setup_ids_meta_page(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
int id = 0;
|
||||
|
||||
id = rb_page_id(cpu_buffer, cpu_buffer->reader_page, id);
|
||||
subbuf_ids[id++] = (unsigned long)cpu_buffer->reader_page->page;
|
||||
subbuf_ids[id++] = cpu_buffer->reader_page;
|
||||
cnt++;
|
||||
|
||||
first_subbuf = subbuf = rb_set_head_page(cpu_buffer);
|
||||
@@ -7055,7 +7055,7 @@ static void rb_setup_ids_meta_page(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
if (WARN_ON(id >= nr_subbufs))
|
||||
break;
|
||||
|
||||
subbuf_ids[id] = (unsigned long)subbuf->page;
|
||||
subbuf_ids[id] = subbuf;
|
||||
|
||||
rb_inc_page(&subbuf);
|
||||
id++;
|
||||
@@ -7064,7 +7064,7 @@ static void rb_setup_ids_meta_page(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
|
||||
WARN_ON(cnt != nr_subbufs);
|
||||
|
||||
/* install subbuf ID to kern VA translation */
|
||||
/* install subbuf ID to bpage translation */
|
||||
cpu_buffer->subbuf_ids = subbuf_ids;
|
||||
|
||||
meta->meta_struct_len = sizeof(*meta);
|
||||
@@ -7220,13 +7220,15 @@ static int __rb_map_vma(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
}
|
||||
|
||||
while (p < nr_pages) {
|
||||
struct buffer_page *subbuf;
|
||||
struct page *page;
|
||||
int off = 0;
|
||||
|
||||
if (WARN_ON_ONCE(s >= nr_subbufs))
|
||||
return -EINVAL;
|
||||
|
||||
page = virt_to_page((void *)cpu_buffer->subbuf_ids[s]);
|
||||
subbuf = cpu_buffer->subbuf_ids[s];
|
||||
page = virt_to_page((void *)subbuf->page);
|
||||
|
||||
for (; off < (1 << (subbuf_order)); off++, page++) {
|
||||
if (p >= nr_pages)
|
||||
@@ -7253,7 +7255,8 @@ int ring_buffer_map(struct trace_buffer *buffer, int cpu,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
struct ring_buffer_per_cpu *cpu_buffer;
|
||||
unsigned long flags, *subbuf_ids;
|
||||
struct buffer_page **subbuf_ids;
|
||||
unsigned long flags;
|
||||
int err;
|
||||
|
||||
if (!cpumask_test_cpu(cpu, buffer->cpumask))
|
||||
@@ -7277,7 +7280,7 @@ int ring_buffer_map(struct trace_buffer *buffer, int cpu,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* subbuf_ids include the reader while nr_pages does not */
|
||||
/* subbuf_ids includes the reader while nr_pages does not */
|
||||
subbuf_ids = kcalloc(cpu_buffer->nr_pages + 1, sizeof(*subbuf_ids), GFP_KERNEL);
|
||||
if (!subbuf_ids) {
|
||||
rb_free_meta_page(cpu_buffer);
|
||||
|
||||
Reference in New Issue
Block a user