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