Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Vincent Donnefort and committed by
Steven Rostedt (Google)
e682207b 7d776a36

+11 -8
+11 -8
kernel/trace/ring_buffer.c
··· 555 555 unsigned int mapped; 556 556 unsigned int user_mapped; /* user space mapping */ 557 557 struct mutex mapping_lock; 558 - unsigned long *subbuf_ids; /* ID to subbuf VA */ 558 + struct buffer_page **subbuf_ids; /* ID to subbuf VA */ 559 559 struct trace_buffer_meta *meta_page; 560 560 struct ring_buffer_cpu_meta *ring_meta; 561 561 ··· 7036 7036 } 7037 7037 7038 7038 static void rb_setup_ids_meta_page(struct ring_buffer_per_cpu *cpu_buffer, 7039 - unsigned long *subbuf_ids) 7039 + struct buffer_page **subbuf_ids) 7040 7040 { 7041 7041 struct trace_buffer_meta *meta = cpu_buffer->meta_page; 7042 7042 unsigned int nr_subbufs = cpu_buffer->nr_pages + 1; ··· 7045 7045 int id = 0; 7046 7046 7047 7047 id = rb_page_id(cpu_buffer, cpu_buffer->reader_page, id); 7048 - subbuf_ids[id++] = (unsigned long)cpu_buffer->reader_page->page; 7048 + subbuf_ids[id++] = cpu_buffer->reader_page; 7049 7049 cnt++; 7050 7050 7051 7051 first_subbuf = subbuf = rb_set_head_page(cpu_buffer); ··· 7055 7055 if (WARN_ON(id >= nr_subbufs)) 7056 7056 break; 7057 7057 7058 - subbuf_ids[id] = (unsigned long)subbuf->page; 7058 + subbuf_ids[id] = subbuf; 7059 7059 7060 7060 rb_inc_page(&subbuf); 7061 7061 id++; ··· 7064 7064 7065 7065 WARN_ON(cnt != nr_subbufs); 7066 7066 7067 - /* install subbuf ID to kern VA translation */ 7067 + /* install subbuf ID to bpage translation */ 7068 7068 cpu_buffer->subbuf_ids = subbuf_ids; 7069 7069 7070 7070 meta->meta_struct_len = sizeof(*meta); ··· 7220 7220 } 7221 7221 7222 7222 while (p < nr_pages) { 7223 + struct buffer_page *subbuf; 7223 7224 struct page *page; 7224 7225 int off = 0; 7225 7226 7226 7227 if (WARN_ON_ONCE(s >= nr_subbufs)) 7227 7228 return -EINVAL; 7228 7229 7229 - page = virt_to_page((void *)cpu_buffer->subbuf_ids[s]); 7230 + subbuf = cpu_buffer->subbuf_ids[s]; 7231 + page = virt_to_page((void *)subbuf->page); 7230 7232 7231 7233 for (; off < (1 << (subbuf_order)); off++, page++) { 7232 7234 if (p >= nr_pages) ··· 7255 7253 struct vm_area_struct *vma) 7256 7254 { 7257 7255 struct ring_buffer_per_cpu *cpu_buffer; 7258 - unsigned long flags, *subbuf_ids; 7256 + struct buffer_page **subbuf_ids; 7257 + unsigned long flags; 7259 7258 int err; 7260 7259 7261 7260 if (!cpumask_test_cpu(cpu, buffer->cpumask)) ··· 7280 7277 if (err) 7281 7278 return err; 7282 7279 7283 - /* subbuf_ids include the reader while nr_pages does not */ 7280 + /* subbuf_ids includes the reader while nr_pages does not */ 7284 7281 subbuf_ids = kcalloc(cpu_buffer->nr_pages + 1, sizeof(*subbuf_ids), GFP_KERNEL); 7285 7282 if (!subbuf_ids) { 7286 7283 rb_free_meta_page(cpu_buffer);