xref: /aosp_15_r20/external/libtraceevent/Documentation/libtraceevent-kbuffer-create.txt (revision 436bf2bcd5202612ffffe471bbcc1f277cc8d28e)
1*436bf2bcSAndroid Build Coastguard Workerlibtraceevent(3)
2*436bf2bcSAndroid Build Coastguard Worker================
3*436bf2bcSAndroid Build Coastguard Worker
4*436bf2bcSAndroid Build Coastguard WorkerNAME
5*436bf2bcSAndroid Build Coastguard Worker----
6*436bf2bcSAndroid Build Coastguard Workerkbuffer_alloc, kbuffer_dup, kbuffer_free, kbuffer_load_subbuffer, kbuffer_subbuffer,
7*436bf2bcSAndroid Build Coastguard Workerkbuffer_refresh, kbuffer_subbuffer_size, kbuffer_start_of_data - Creating of kbuffer element to parse
8*436bf2bcSAndroid Build Coastguard Workerthe Linux kernel tracing ring buffer
9*436bf2bcSAndroid Build Coastguard Worker
10*436bf2bcSAndroid Build Coastguard WorkerSYNOPSIS
11*436bf2bcSAndroid Build Coastguard Worker--------
12*436bf2bcSAndroid Build Coastguard Worker[verse]
13*436bf2bcSAndroid Build Coastguard Worker--
14*436bf2bcSAndroid Build Coastguard Worker*#include <kbuffer.h>*
15*436bf2bcSAndroid Build Coastguard Worker
16*436bf2bcSAndroid Build Coastguard Workerenum kbuffer_endian {
17*436bf2bcSAndroid Build Coastguard Worker	KBUFFER_ENDIAN_BIG,
18*436bf2bcSAndroid Build Coastguard Worker	KBUFFER_ENDIAN_LITTLE,
19*436bf2bcSAndroid Build Coastguard Worker	KBUFFER_ENDIAN_SAME_AS_HOST,
20*436bf2bcSAndroid Build Coastguard Worker};
21*436bf2bcSAndroid Build Coastguard Worker
22*436bf2bcSAndroid Build Coastguard Workerenum kbuffer_long_size {
23*436bf2bcSAndroid Build Coastguard Worker	KBUFFER_LSIZE_4,
24*436bf2bcSAndroid Build Coastguard Worker	KBUFFER_LSIZE_8,
25*436bf2bcSAndroid Build Coastguard Worker	KBUFFER_LSIZE_SAME_AS_HOST,
26*436bf2bcSAndroid Build Coastguard Worker};
27*436bf2bcSAndroid Build Coastguard Worker
28*436bf2bcSAndroid Build Coastguard Workerstruct kbuffer;
29*436bf2bcSAndroid Build Coastguard Workerstruct tep_handle;
30*436bf2bcSAndroid Build Coastguard Worker
31*436bf2bcSAndroid Build Coastguard Workerstruct kbuffer pass:[*]*kbuffer_alloc*(enum kbuffer_long_size _size_, enum kbuffer_endian _endian_);
32*436bf2bcSAndroid Build Coastguard Workerstruct kbuffer pass:[*]*kbuffer_dup*(struct kbuffer pass:[*]_kbuf_);
33*436bf2bcSAndroid Build Coastguard Workervoid *kbuffer_free*(struct kbuffer pass:[*]_kbuf_);
34*436bf2bcSAndroid Build Coastguard Workerint *kbuffer_load_subbuffer*(struct kbuffer pass:[*]_kbuf_, void pass:[*]_subbuffer_);
35*436bf2bcSAndroid Build Coastguard Workerint *kbuffer_subbuffer_size*(struct kbuffer pass:[*]_kbuf_);
36*436bf2bcSAndroid Build Coastguard Workerint *kbuffer_refresh*(struct kbuffer pass:[*]_kbuf_);
37*436bf2bcSAndroid Build Coastguard Workerint *kbuffer_start_of_data*(struct kbuffer pass:[*]_kbuf_);
38*436bf2bcSAndroid Build Coastguard Workervoid pass:[*]*kbuffer_subbuffer*(struct kbuffer pass:[*]_kbuf);
39*436bf2bcSAndroid Build Coastguard Worker--
40*436bf2bcSAndroid Build Coastguard Worker
41*436bf2bcSAndroid Build Coastguard WorkerDESCRIPTION
42*436bf2bcSAndroid Build Coastguard Worker-----------
43*436bf2bcSAndroid Build Coastguard WorkerThese functions create a _kbuffer_ handle that can be used to parse the raw sub buffers
44*436bf2bcSAndroid Build Coastguard Workerof the Linux kernel tracing ring buffer. The ring buffer is found in the tracefs
45*436bf2bcSAndroid Build Coastguard Workerdirectory, and can be retrieved by *tracefs_instance_get_file(3)* at
46*436bf2bcSAndroid Build Coastguard Worker*per_cpu/cpuX/trace_pipe_raw* where *X* is replaced by the per CPU number of
47*436bf2bcSAndroid Build Coastguard Workerthe specified ring buffer. The ring buffer inside the kernel is split up per
48*436bf2bcSAndroid Build Coastguard WorkerCPU, such that the raw ring buffer must be retrieved per CPU as well.
49*436bf2bcSAndroid Build Coastguard Worker
50*436bf2bcSAndroid Build Coastguard WorkerThe *kbuffer_alloc()* will create a descriptor that can be used to manage a sub buffer
51*436bf2bcSAndroid Build Coastguard Workerread by the ring buffer. The _size_ parameter denotes what the word size is
52*436bf2bcSAndroid Build Coastguard Workerfor the given buffer (note, this works from reading raw data from machines other
53*436bf2bcSAndroid Build Coastguard Workerthan the machine that is calling this function). The _endian_ denotes the endian
54*436bf2bcSAndroid Build Coastguard Workerfor the machine.
55*436bf2bcSAndroid Build Coastguard Worker
56*436bf2bcSAndroid Build Coastguard WorkerIf _endian_ is set to _KBUFFER_ENDIAN_SAME_AS_HOST_ the endian will be set to the same
57*436bf2bcSAndroid Build Coastguard Workeras the host endianess, which is useful when the application is reading the
58*436bf2bcSAndroid Build Coastguard Workerring buffer data directly from the same machine it is running on.
59*436bf2bcSAndroid Build Coastguard Worker
60*436bf2bcSAndroid Build Coastguard WorkerIf _size_ is set to _KBUFFER_LSIZE_SAME_AS_HOST_, if the word size is 8, it will
61*436bf2bcSAndroid Build Coastguard Workerset the kbuffer descriptor to long size of 8. But if the size is 4, then it
62*436bf2bcSAndroid Build Coastguard Workerwill then perform a *uname(2)* call, and if the _machine_ field has the string "64"
63*436bf2bcSAndroid Build Coastguard Workerin it, it will be set to 8 byte long size and not 4 byte. This is because the
64*436bf2bcSAndroid Build Coastguard Workerring buffer long size is dependent on the kernel and not user space.
65*436bf2bcSAndroid Build Coastguard Worker
66*436bf2bcSAndroid Build Coastguard WorkerThe *kbuffer_dup()* function will duplicate an existing kbuffer structure with
67*436bf2bcSAndroid Build Coastguard Workeran allocated new one. It will have all the properties of the passed in _kbuf_,
68*436bf2bcSAndroid Build Coastguard Workerincluding pointing to the same subbuffer that was loaded in the _kbuf_.
69*436bf2bcSAndroid Build Coastguard WorkerIt must be freed with *kbuffer_free()*.
70*436bf2bcSAndroid Build Coastguard Worker
71*436bf2bcSAndroid Build Coastguard WorkerThe *kbuffer_free()* function will free the resources created by *kbuffer_alloc()*.
72*436bf2bcSAndroid Build Coastguard Worker
73*436bf2bcSAndroid Build Coastguard WorkerThe *kbuffer_load_subbuffer()* will take a _subbuffer_ which is a raw data blob
74*436bf2bcSAndroid Build Coastguard Workerfrom the tracefs *trace_pipe_raw* file. The Linux tracing ring buffer is broken up
75*436bf2bcSAndroid Build Coastguard Workerinto sub buffers. Each sub buffer is as stand alone data segment that has all the
76*436bf2bcSAndroid Build Coastguard Workerinformation to split out the individual events and time stamps. This sub buffer
77*436bf2bcSAndroid Build Coastguard Workeris what kbuffer uses to walk the events.
78*436bf2bcSAndroid Build Coastguard Worker
79*436bf2bcSAndroid Build Coastguard WorkerThe *kbuffer_subbuffer_size()* returns the location of the end of the last event
80*436bf2bcSAndroid Build Coastguard Workeron the sub-buffer. It does not return the size of the sub-buffer itself.
81*436bf2bcSAndroid Build Coastguard Worker
82*436bf2bcSAndroid Build Coastguard WorkerThe *kbuffer_refresh()* is to be used if more writes were done on the loaded kbuffer
83*436bf2bcSAndroid Build Coastguard Workerwhere the size of the kbuffer needs to be refreshed to be able to read the new
84*436bf2bcSAndroid Build Coastguard Workerevents that were written since the last *kbuffer_load_subbuffer()* was called on it.
85*436bf2bcSAndroid Build Coastguard Worker
86*436bf2bcSAndroid Build Coastguard WorkerNote, no memory barriers are implemented with this function and any synchronization
87*436bf2bcSAndroid Build Coastguard Workerwith the writer is the responsibility of the application.
88*436bf2bcSAndroid Build Coastguard Worker
89*436bf2bcSAndroid Build Coastguard WorkerThe *kbuffer_start_of_data()* function returns the offset of where the actual
90*436bf2bcSAndroid Build Coastguard Workerdata load of the sub-buffer begins.
91*436bf2bcSAndroid Build Coastguard Worker
92*436bf2bcSAndroid Build Coastguard WorkerThe *kbuffer_subbuffer()* function returns the pointer to the currently loaded
93*436bf2bcSAndroid Build Coastguard Workersubbuffer. That is, the last subbuffer that was loaded by *kbuffer_load_subbuffer()*.
94*436bf2bcSAndroid Build Coastguard WorkerIf no subbuffer was loaded NULL is returned.
95*436bf2bcSAndroid Build Coastguard Worker
96*436bf2bcSAndroid Build Coastguard WorkerRETURN VALUE
97*436bf2bcSAndroid Build Coastguard Worker------------
98*436bf2bcSAndroid Build Coastguard Worker*kbuffer_alloc()* returns an allocated kbuffer descriptor or NULL on error.
99*436bf2bcSAndroid Build Coastguard WorkerThe returned descriptor must be freed with *kbuffer_free()*
100*436bf2bcSAndroid Build Coastguard Worker
101*436bf2bcSAndroid Build Coastguard Worker*kbuffer_load_subbuffer()* returns 0 on success and -1 on error.
102*436bf2bcSAndroid Build Coastguard Worker
103*436bf2bcSAndroid Build Coastguard Worker*kbuffer_subbuffer_size()* returns the index on the subbuffer where the end
104*436bf2bcSAndroid Build Coastguard Workerof the last event is located.
105*436bf2bcSAndroid Build Coastguard Worker
106*436bf2bcSAndroid Build Coastguard Worker*kbuffer_start_of_data()* returns the offset of where the data begins on the
107*436bf2bcSAndroid Build Coastguard Workersub-buffer loaded in _kbuf_.
108*436bf2bcSAndroid Build Coastguard Worker
109*436bf2bcSAndroid Build Coastguard Worker*kbuffer_subbuffer()* returns the last loaded subbuffer to _kbuf_ that was loaded
110*436bf2bcSAndroid Build Coastguard Workerby *kbuffer_load_subbuffer()* or NULL if none was loaded.
111*436bf2bcSAndroid Build Coastguard Worker
112*436bf2bcSAndroid Build Coastguard Worker*kbuffer_refresh()* returns 0 on success and -1 if _kbuf_ is NULL or it does not
113*436bf2bcSAndroid Build Coastguard Workerhave a subbuffer loaded via *kbuffer_load_subbuffer()*.
114*436bf2bcSAndroid Build Coastguard Worker
115*436bf2bcSAndroid Build Coastguard WorkerEXAMPLE
116*436bf2bcSAndroid Build Coastguard Worker-------
117*436bf2bcSAndroid Build Coastguard Worker[source,c]
118*436bf2bcSAndroid Build Coastguard Worker--
119*436bf2bcSAndroid Build Coastguard Worker#include <stdio.h>
120*436bf2bcSAndroid Build Coastguard Worker#include <stdlib.h>
121*436bf2bcSAndroid Build Coastguard Worker#include <fcntl.h>
122*436bf2bcSAndroid Build Coastguard Worker#include <unistd.h>
123*436bf2bcSAndroid Build Coastguard Worker#include <sys/stat.h>
124*436bf2bcSAndroid Build Coastguard Worker
125*436bf2bcSAndroid Build Coastguard Worker#include <kbuffer.h>
126*436bf2bcSAndroid Build Coastguard Worker
127*436bf2bcSAndroid Build Coastguard Workerint main (int argc, char **argv)
128*436bf2bcSAndroid Build Coastguard Worker{
129*436bf2bcSAndroid Build Coastguard Worker	unsigned long long ts;
130*436bf2bcSAndroid Build Coastguard Worker	struct kbuffer *kbuf;
131*436bf2bcSAndroid Build Coastguard Worker	struct stat st;
132*436bf2bcSAndroid Build Coastguard Worker	char *buf;
133*436bf2bcSAndroid Build Coastguard Worker	void *event;
134*436bf2bcSAndroid Build Coastguard Worker	int ret;
135*436bf2bcSAndroid Build Coastguard Worker	int fd;
136*436bf2bcSAndroid Build Coastguard Worker	int i = 0;
137*436bf2bcSAndroid Build Coastguard Worker
138*436bf2bcSAndroid Build Coastguard Worker	if (argc < 2) {
139*436bf2bcSAndroid Build Coastguard Worker		printf("usage: %s raw-subbuffer-page\n", argv[0]);
140*436bf2bcSAndroid Build Coastguard Worker		printf(" Try: dd count=1 bs=4096 if=/sys/kernel/tracing/per_cpu/cpu0/trace_pipe_raw of=/tmp/file\n");
141*436bf2bcSAndroid Build Coastguard Worker		exit(0);
142*436bf2bcSAndroid Build Coastguard Worker	}
143*436bf2bcSAndroid Build Coastguard Worker
144*436bf2bcSAndroid Build Coastguard Worker	if (stat(argv[1], &st) < 0) {
145*436bf2bcSAndroid Build Coastguard Worker		perror("stat");
146*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
147*436bf2bcSAndroid Build Coastguard Worker	}
148*436bf2bcSAndroid Build Coastguard Worker
149*436bf2bcSAndroid Build Coastguard Worker	buf = malloc(st.st_size);
150*436bf2bcSAndroid Build Coastguard Worker	if (!buf) {
151*436bf2bcSAndroid Build Coastguard Worker		perror("Allocating buffer");
152*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
153*436bf2bcSAndroid Build Coastguard Worker	}
154*436bf2bcSAndroid Build Coastguard Worker
155*436bf2bcSAndroid Build Coastguard Worker	fd = open(argv[1], O_RDONLY);
156*436bf2bcSAndroid Build Coastguard Worker	if (fd < 0) {
157*436bf2bcSAndroid Build Coastguard Worker		perror(argv[1]);
158*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
159*436bf2bcSAndroid Build Coastguard Worker	}
160*436bf2bcSAndroid Build Coastguard Worker
161*436bf2bcSAndroid Build Coastguard Worker	ret = read(fd, buf, st.st_size);
162*436bf2bcSAndroid Build Coastguard Worker	if (ret < 0) {
163*436bf2bcSAndroid Build Coastguard Worker		perror("Reading buffer");
164*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
165*436bf2bcSAndroid Build Coastguard Worker	}
166*436bf2bcSAndroid Build Coastguard Worker	close(fd);
167*436bf2bcSAndroid Build Coastguard Worker
168*436bf2bcSAndroid Build Coastguard Worker	kbuf = kbuffer_alloc(KBUFFER_ENDIAN_SAME_AS_HOST,
169*436bf2bcSAndroid Build Coastguard Worker			     KBUFFER_LSIZE_SAME_AS_HOST);
170*436bf2bcSAndroid Build Coastguard Worker	if (!kbuf) {
171*436bf2bcSAndroid Build Coastguard Worker		perror("Creating kbuffer");
172*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
173*436bf2bcSAndroid Build Coastguard Worker	}
174*436bf2bcSAndroid Build Coastguard Worker	ret = kbuffer_load_subbuffer(kbuf, buf);
175*436bf2bcSAndroid Build Coastguard Worker	if (ret < 0) {
176*436bf2bcSAndroid Build Coastguard Worker		perror("Loading sub bufer");
177*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
178*436bf2bcSAndroid Build Coastguard Worker	}
179*436bf2bcSAndroid Build Coastguard Worker
180*436bf2bcSAndroid Build Coastguard Worker	if (kbuffer_subbuffer_size(kbuf) > st.st_size) {
181*436bf2bcSAndroid Build Coastguard Worker		fprintf(stderr, "kbuffer is bigger than raw size %d > %ld\n",
182*436bf2bcSAndroid Build Coastguard Worker			kbuffer_subbuffer_size(kbuf), st.st_size);
183*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
184*436bf2bcSAndroid Build Coastguard Worker	}
185*436bf2bcSAndroid Build Coastguard Worker
186*436bf2bcSAndroid Build Coastguard Worker	printf("Kbuffer data starts at %d\n", kbuffer_start_of_data(kbuf));
187*436bf2bcSAndroid Build Coastguard Worker	do {
188*436bf2bcSAndroid Build Coastguard Worker		event = kbuffer_read_event(kbuf, &ts);
189*436bf2bcSAndroid Build Coastguard Worker		if (event) {
190*436bf2bcSAndroid Build Coastguard Worker			printf(" event %3d ts:%lld\n", i++, ts);
191*436bf2bcSAndroid Build Coastguard Worker			event = kbuffer_next_event(kbuf, NULL);
192*436bf2bcSAndroid Build Coastguard Worker		}
193*436bf2bcSAndroid Build Coastguard Worker	} while (event);
194*436bf2bcSAndroid Build Coastguard Worker
195*436bf2bcSAndroid Build Coastguard Worker	if (!event)
196*436bf2bcSAndroid Build Coastguard Worker		printf("Finished sub buffer\n");
197*436bf2bcSAndroid Build Coastguard Worker
198*436bf2bcSAndroid Build Coastguard Worker	kbuffer_free(kbuf);
199*436bf2bcSAndroid Build Coastguard Worker
200*436bf2bcSAndroid Build Coastguard Worker	return 0;
201*436bf2bcSAndroid Build Coastguard Worker}
202*436bf2bcSAndroid Build Coastguard Worker--
203*436bf2bcSAndroid Build Coastguard WorkerFILES
204*436bf2bcSAndroid Build Coastguard Worker-----
205*436bf2bcSAndroid Build Coastguard Worker[verse]
206*436bf2bcSAndroid Build Coastguard Worker--
207*436bf2bcSAndroid Build Coastguard Worker*event-parse.h*
208*436bf2bcSAndroid Build Coastguard Worker	Header file to include in order to have access to the library APIs.
209*436bf2bcSAndroid Build Coastguard Worker*-ltraceevent*
210*436bf2bcSAndroid Build Coastguard Worker	Linker switch to add when building a program that uses the library.
211*436bf2bcSAndroid Build Coastguard Worker--
212*436bf2bcSAndroid Build Coastguard Worker
213*436bf2bcSAndroid Build Coastguard WorkerSEE ALSO
214*436bf2bcSAndroid Build Coastguard Worker--------
215*436bf2bcSAndroid Build Coastguard Worker*libtraceevent*(3), *trace-cmd*(1)
216*436bf2bcSAndroid Build Coastguard Worker
217*436bf2bcSAndroid Build Coastguard WorkerAUTHOR
218*436bf2bcSAndroid Build Coastguard Worker------
219*436bf2bcSAndroid Build Coastguard Worker[verse]
220*436bf2bcSAndroid Build Coastguard Worker--
221*436bf2bcSAndroid Build Coastguard Worker*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
222*436bf2bcSAndroid Build Coastguard Worker--
223*436bf2bcSAndroid Build Coastguard WorkerREPORTING BUGS
224*436bf2bcSAndroid Build Coastguard Worker--------------
225*436bf2bcSAndroid Build Coastguard WorkerReport bugs to  <[email protected]>
226*436bf2bcSAndroid Build Coastguard Worker
227*436bf2bcSAndroid Build Coastguard WorkerLICENSE
228*436bf2bcSAndroid Build Coastguard Worker-------
229*436bf2bcSAndroid Build Coastguard Workerlibtraceevent is Free Software licensed under the GNU LGPL 2.1
230*436bf2bcSAndroid Build Coastguard Worker
231*436bf2bcSAndroid Build Coastguard WorkerRESOURCES
232*436bf2bcSAndroid Build Coastguard Worker---------
233*436bf2bcSAndroid Build Coastguard Workerhttps://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/
234