Skip to content

Commit 117c392

Browse files
vdonnefortrostedt
authored andcommitted
ring-buffer: Introducing ring-buffer mapping functions
In preparation for allowing the user-space to map a ring-buffer, add a set of mapping functions: ring_buffer_{map,unmap}() And controls on the ring-buffer: ring_buffer_map_get_reader() /* swap reader and head */ Mapping the ring-buffer also involves: A unique ID for each subbuf of the ring-buffer, currently they are only identified through their in-kernel VA. A meta-page, where are stored ring-buffer statistics and a description for the current reader The linear mapping exposes the meta-page, and each subbuf of the ring-buffer, ordered following their unique ID, assigned during the first mapping. Once mapped, no subbuf can get in or out of the ring-buffer: the buffer size will remain unmodified and the splice enabling functions will in reality simply memcpy the data instead of swapping subbufs. Link: https://lore.kernel.org/linux-trace-kernel/[email protected] CC: <[email protected]> Signed-off-by: Vincent Donnefort <[email protected]> Acked-by: David Hildenbrand <[email protected]> Signed-off-by: Steven Rostedt (Google) <[email protected]>
1 parent c09d416 commit 117c392

File tree

3 files changed

+463
-3
lines changed

3 files changed

+463
-3
lines changed

include/linux/ring_buffer.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include <linux/seq_file.h>
77
#include <linux/poll.h>
88

9+
#include <uapi/linux/trace_mmap.h>
10+
911
struct trace_buffer;
1012
struct ring_buffer_iter;
1113

@@ -223,4 +225,8 @@ int trace_rb_cpu_prepare(unsigned int cpu, struct hlist_node *node);
223225
#define trace_rb_cpu_prepare NULL
224226
#endif
225227

228+
int ring_buffer_map(struct trace_buffer *buffer, int cpu,
229+
struct vm_area_struct *vma);
230+
int ring_buffer_unmap(struct trace_buffer *buffer, int cpu);
231+
int ring_buffer_map_get_reader(struct trace_buffer *buffer, int cpu);
226232
#endif /* _LINUX_RING_BUFFER_H */

include/uapi/linux/trace_mmap.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2+
#ifndef _TRACE_MMAP_H_
3+
#define _TRACE_MMAP_H_
4+
5+
#include <linux/types.h>
6+
7+
/**
8+
* struct trace_buffer_meta - Ring-buffer Meta-page description
9+
* @meta_page_size: Size of this meta-page.
10+
* @meta_struct_len: Size of this structure.
11+
* @subbuf_size: Size of each sub-buffer.
12+
* @nr_subbufs: Number of subbfs in the ring-buffer, including the reader.
13+
* @reader.lost_events: Number of events lost at the time of the reader swap.
14+
* @reader.id: subbuf ID of the current reader. ID range [0 : @nr_subbufs - 1]
15+
* @reader.read: Number of bytes read on the reader subbuf.
16+
* @flags: Placeholder for now, 0 until new features are supported.
17+
* @entries: Number of entries in the ring-buffer.
18+
* @overrun: Number of entries lost in the ring-buffer.
19+
* @read: Number of entries that have been read.
20+
* @Reserved1: Internal use only.
21+
* @Reserved2: Internal use only.
22+
*/
23+
struct trace_buffer_meta {
24+
__u32 meta_page_size;
25+
__u32 meta_struct_len;
26+
27+
__u32 subbuf_size;
28+
__u32 nr_subbufs;
29+
30+
struct {
31+
__u64 lost_events;
32+
__u32 id;
33+
__u32 read;
34+
} reader;
35+
36+
__u64 flags;
37+
38+
__u64 entries;
39+
__u64 overrun;
40+
__u64 read;
41+
42+
__u64 Reserved1;
43+
__u64 Reserved2;
44+
};
45+
46+
#endif /* _TRACE_MMAP_H_ */

0 commit comments

Comments
 (0)