Commit e682207b authored by Vincent Donnefort's avatar Vincent Donnefort Committed by Steven Rostedt (Google)
Browse files

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: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: default avatarVincent Donnefort <vdonnefort@google.com>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 7d776a36
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -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);