xref: /aosp_15_r20/external/libtracefs/Documentation/libtracefs-hist-cont.txt (revision 287e80b3a36113050663245e7f2c00d274188f18)
1*287e80b3SSadaf Ebrahimilibtracefs(3)
2*287e80b3SSadaf Ebrahimi=============
3*287e80b3SSadaf Ebrahimi
4*287e80b3SSadaf EbrahimiNAME
5*287e80b3SSadaf Ebrahimi----
6*287e80b3SSadaf Ebrahimitracefs_hist_start, tracefs_hist_destroy, tracefs_hist_pause,
7*287e80b3SSadaf Ebrahimitracefs_hist_continue, tracefs_hist_reset - Pause, continue, or clear an existing histogram
8*287e80b3SSadaf Ebrahimi
9*287e80b3SSadaf EbrahimiSYNOPSIS
10*287e80b3SSadaf Ebrahimi--------
11*287e80b3SSadaf Ebrahimi[verse]
12*287e80b3SSadaf Ebrahimi--
13*287e80b3SSadaf Ebrahimi*#include <tracefs.h>*
14*287e80b3SSadaf Ebrahimi
15*287e80b3SSadaf Ebrahimiint *tracefs_hist_start*(struct tracefs_instance pass:[*]_instance_, struct tracefs_hist pass:[*]_hist_);
16*287e80b3SSadaf Ebrahimiint *tracefs_hist_destroy*(struct tracefs_instance pass:[*]_instance_, struct tracefs_hist pass:[*]_hist_);
17*287e80b3SSadaf Ebrahimiint *tracefs_hist_pause*(struct tracefs_instance pass:[*]_instance_, struct tracefs_hist pass:[*]_hist_);
18*287e80b3SSadaf Ebrahimiint *tracefs_hist_continue*(struct tracefs_instance pass:[*]_instance_, struct tracefs_hist pass:[*]_hist_);
19*287e80b3SSadaf Ebrahimiint *tracefs_hist_reset*(struct tracefs_instance pass:[*]_instance_, struct tracefs_hist pass:[*]_hist_);
20*287e80b3SSadaf Ebrahimi
21*287e80b3SSadaf Ebrahimi--
22*287e80b3SSadaf Ebrahimi
23*287e80b3SSadaf EbrahimiDESCRIPTION
24*287e80b3SSadaf Ebrahimi-----------
25*287e80b3SSadaf Ebrahimi
26*287e80b3SSadaf Ebrahimi*tracefs_hist_start()* is called to actually start the histogram _hist_.
27*287e80b3SSadaf EbrahimiThe _instance_ is the instance to start the histogram in, NULL if it
28*287e80b3SSadaf Ebrahimishould start at the top level.
29*287e80b3SSadaf Ebrahimi
30*287e80b3SSadaf Ebrahimi*tracefs_hist_pause()* is called to pause the histogram _hist_.
31*287e80b3SSadaf EbrahimiThe _instance_ is the instance to pause the histogram in, NULL if it
32*287e80b3SSadaf Ebrahimiis in the top level.
33*287e80b3SSadaf Ebrahimi
34*287e80b3SSadaf Ebrahimi*tracefs_hist_continue()* is called to continue a paused histogram _hist_.
35*287e80b3SSadaf EbrahimiThe _instance_ is the instance to continue the histogram, NULL if it
36*287e80b3SSadaf Ebrahimiis in the top level.
37*287e80b3SSadaf Ebrahimi
38*287e80b3SSadaf Ebrahimi*tracefs_hist_reset()* is called to clear / reset the histogram _hist_.
39*287e80b3SSadaf EbrahimiThe _instance_ is the instance to clear the histogram, NULL if it
40*287e80b3SSadaf Ebrahimiis in the top level.
41*287e80b3SSadaf Ebrahimi
42*287e80b3SSadaf Ebrahimi*tracefs_hist_destroy()* is called to delete the histogram where it will no longer
43*287e80b3SSadaf Ebrahimiexist.  The _instance_ is the instance to delete the histogram from, NULL if it
44*287e80b3SSadaf Ebrahimiis in the top level.
45*287e80b3SSadaf Ebrahimi
46*287e80b3SSadaf EbrahimiRETURN VALUE
47*287e80b3SSadaf Ebrahimi------------
48*287e80b3SSadaf EbrahimiAll the return zero on success or -1 on error.
49*287e80b3SSadaf Ebrahimi
50*287e80b3SSadaf EbrahimiEXAMPLE
51*287e80b3SSadaf Ebrahimi-------
52*287e80b3SSadaf Ebrahimi[source,c]
53*287e80b3SSadaf Ebrahimi--
54*287e80b3SSadaf Ebrahimi#include <stdlib.h>
55*287e80b3SSadaf Ebrahimi#include <tracefs.h>
56*287e80b3SSadaf Ebrahimi
57*287e80b3SSadaf Ebrahimienum commands {
58*287e80b3SSadaf Ebrahimi	START,
59*287e80b3SSadaf Ebrahimi	PAUSE,
60*287e80b3SSadaf Ebrahimi	CONT,
61*287e80b3SSadaf Ebrahimi	RESET,
62*287e80b3SSadaf Ebrahimi	DELETE,
63*287e80b3SSadaf Ebrahimi	SHOW,
64*287e80b3SSadaf Ebrahimi};
65*287e80b3SSadaf Ebrahimi
66*287e80b3SSadaf Ebrahimiint main (int argc, char **argv, char **env)
67*287e80b3SSadaf Ebrahimi{
68*287e80b3SSadaf Ebrahimi	struct tracefs_instance *instance;
69*287e80b3SSadaf Ebrahimi	struct tracefs_hist *hist;
70*287e80b3SSadaf Ebrahimi	struct tep_handle *tep;
71*287e80b3SSadaf Ebrahimi	enum commands cmd;
72*287e80b3SSadaf Ebrahimi	char *cmd_str;
73*287e80b3SSadaf Ebrahimi	int ret;
74*287e80b3SSadaf Ebrahimi
75*287e80b3SSadaf Ebrahimi	if (argc < 2) {
76*287e80b3SSadaf Ebrahimi		fprintf(stderr, "usage: %s command\n", argv[0]);
77*287e80b3SSadaf Ebrahimi		exit(-1);
78*287e80b3SSadaf Ebrahimi	}
79*287e80b3SSadaf Ebrahimi
80*287e80b3SSadaf Ebrahimi	cmd_str = argv[1];
81*287e80b3SSadaf Ebrahimi
82*287e80b3SSadaf Ebrahimi	if (!strcmp(cmd_str, "start"))
83*287e80b3SSadaf Ebrahimi		cmd = START;
84*287e80b3SSadaf Ebrahimi	else if (!strcmp(cmd_str, "pause"))
85*287e80b3SSadaf Ebrahimi		cmd = PAUSE;
86*287e80b3SSadaf Ebrahimi	else if (!strcmp(cmd_str, "cont"))
87*287e80b3SSadaf Ebrahimi		cmd = CONT;
88*287e80b3SSadaf Ebrahimi	else if (!strcmp(cmd_str, "reset"))
89*287e80b3SSadaf Ebrahimi		cmd = RESET;
90*287e80b3SSadaf Ebrahimi	else if (!strcmp(cmd_str, "delete"))
91*287e80b3SSadaf Ebrahimi		cmd = DELETE;
92*287e80b3SSadaf Ebrahimi	else if (!strcmp(cmd_str, "show"))
93*287e80b3SSadaf Ebrahimi		cmd = SHOW;
94*287e80b3SSadaf Ebrahimi	else {
95*287e80b3SSadaf Ebrahimi		fprintf(stderr, "Unknown command %s\n", cmd_str);
96*287e80b3SSadaf Ebrahimi		exit(-1);
97*287e80b3SSadaf Ebrahimi	}
98*287e80b3SSadaf Ebrahimi
99*287e80b3SSadaf Ebrahimi	tep = tracefs_local_events(NULL);
100*287e80b3SSadaf Ebrahimi	if (!tep) {
101*287e80b3SSadaf Ebrahimi		perror("Reading tracefs");
102*287e80b3SSadaf Ebrahimi		exit(-1);
103*287e80b3SSadaf Ebrahimi	}
104*287e80b3SSadaf Ebrahimi
105*287e80b3SSadaf Ebrahimi	instance = tracefs_instance_create("hist_test");
106*287e80b3SSadaf Ebrahimi	if (!instance) {
107*287e80b3SSadaf Ebrahimi		fprintf(stderr, "Failed instance create\n");
108*287e80b3SSadaf Ebrahimi		exit(-1);
109*287e80b3SSadaf Ebrahimi	}
110*287e80b3SSadaf Ebrahimi
111*287e80b3SSadaf Ebrahimi	hist = tracefs_hist_alloc_2d(tep, "kmem", "kmalloc",
112*287e80b3SSadaf Ebrahimi				     "call_site",TRACEFS_HIST_KEY_SYM,
113*287e80b3SSadaf Ebrahimi				     "bytes_req", 0);
114*287e80b3SSadaf Ebrahimi	if (!hist) {
115*287e80b3SSadaf Ebrahimi		fprintf(stderr, "Failed hist create\n");
116*287e80b3SSadaf Ebrahimi		exit(-1);
117*287e80b3SSadaf Ebrahimi	}
118*287e80b3SSadaf Ebrahimi
119*287e80b3SSadaf Ebrahimi	ret = tracefs_hist_add_value(hist, "bytes_alloc");
120*287e80b3SSadaf Ebrahimi	ret |= tracefs_hist_add_sort_key(hist, "bytes_req");
121*287e80b3SSadaf Ebrahimi	ret |= tracefs_hist_add_sort_key(hist, "bytes_alloc");
122*287e80b3SSadaf Ebrahimi
123*287e80b3SSadaf Ebrahimi	ret |= tracefs_hist_sort_key_direction(hist, "bytes_alloc",
124*287e80b3SSadaf Ebrahimi					       TRACEFS_HIST_SORT_DESCENDING);
125*287e80b3SSadaf Ebrahimi	if (ret) {
126*287e80b3SSadaf Ebrahimi		fprintf(stderr, "Failed modifying histogram\n");
127*287e80b3SSadaf Ebrahimi		exit(-1);
128*287e80b3SSadaf Ebrahimi	}
129*287e80b3SSadaf Ebrahimi
130*287e80b3SSadaf Ebrahimi	tracefs_error_clear(instance);
131*287e80b3SSadaf Ebrahimi
132*287e80b3SSadaf Ebrahimi	switch (cmd) {
133*287e80b3SSadaf Ebrahimi	case START:
134*287e80b3SSadaf Ebrahimi		ret = tracefs_hist_start(instance, hist);
135*287e80b3SSadaf Ebrahimi		if (ret) {
136*287e80b3SSadaf Ebrahimi			char *err = tracefs_error_last(instance);
137*287e80b3SSadaf Ebrahimi			if (err)
138*287e80b3SSadaf Ebrahimi				fprintf(stderr, "\n%s\n", err);
139*287e80b3SSadaf Ebrahimi		}
140*287e80b3SSadaf Ebrahimi		break;
141*287e80b3SSadaf Ebrahimi	case PAUSE:
142*287e80b3SSadaf Ebrahimi		ret = tracefs_hist_pause(instance, hist);
143*287e80b3SSadaf Ebrahimi		break;
144*287e80b3SSadaf Ebrahimi	case CONT:
145*287e80b3SSadaf Ebrahimi		ret = tracefs_hist_continue(instance, hist);
146*287e80b3SSadaf Ebrahimi		break;
147*287e80b3SSadaf Ebrahimi	case RESET:
148*287e80b3SSadaf Ebrahimi		ret = tracefs_hist_reset(instance, hist);
149*287e80b3SSadaf Ebrahimi		break;
150*287e80b3SSadaf Ebrahimi	case DELETE:
151*287e80b3SSadaf Ebrahimi		ret = tracefs_hist_destroy(instance, hist);
152*287e80b3SSadaf Ebrahimi		break;
153*287e80b3SSadaf Ebrahimi	case SHOW: {
154*287e80b3SSadaf Ebrahimi		char *content;
155*287e80b3SSadaf Ebrahimi		content = tracefs_event_file_read(instance, "kmem", "kmalloc",
156*287e80b3SSadaf Ebrahimi						  "hist", NULL);
157*287e80b3SSadaf Ebrahimi		ret = content ? 0 : -1;
158*287e80b3SSadaf Ebrahimi		if (content) {
159*287e80b3SSadaf Ebrahimi			printf("%s\n", content);
160*287e80b3SSadaf Ebrahimi			free(content);
161*287e80b3SSadaf Ebrahimi		}
162*287e80b3SSadaf Ebrahimi		break;
163*287e80b3SSadaf Ebrahimi	}
164*287e80b3SSadaf Ebrahimi	}
165*287e80b3SSadaf Ebrahimi	if (ret)
166*287e80b3SSadaf Ebrahimi		fprintf(stderr, "Failed: command\n");
167*287e80b3SSadaf Ebrahimi	exit(ret);
168*287e80b3SSadaf Ebrahimi}
169*287e80b3SSadaf Ebrahimi
170*287e80b3SSadaf Ebrahimi--
171*287e80b3SSadaf Ebrahimi
172*287e80b3SSadaf EbrahimiFILES
173*287e80b3SSadaf Ebrahimi-----
174*287e80b3SSadaf Ebrahimi[verse]
175*287e80b3SSadaf Ebrahimi--
176*287e80b3SSadaf Ebrahimi*tracefs.h*
177*287e80b3SSadaf Ebrahimi	Header file to include in order to have access to the library APIs.
178*287e80b3SSadaf Ebrahimi*-ltracefs*
179*287e80b3SSadaf Ebrahimi	Linker switch to add when building a program that uses the library.
180*287e80b3SSadaf Ebrahimi--
181*287e80b3SSadaf Ebrahimi
182*287e80b3SSadaf EbrahimiSEE ALSO
183*287e80b3SSadaf Ebrahimi--------
184*287e80b3SSadaf Ebrahimi*libtracefs*(3),
185*287e80b3SSadaf Ebrahimi*libtraceevent*(3),
186*287e80b3SSadaf Ebrahimi*trace-cmd*(1),
187*287e80b3SSadaf Ebrahimi*tracefs_hist_alloc*(3),
188*287e80b3SSadaf Ebrahimi*tracefs_hist_alloc_2d*(3),
189*287e80b3SSadaf Ebrahimi*tracefs_hist_alloc_nd*(3),
190*287e80b3SSadaf Ebrahimi*tracefs_hist_free*(3),
191*287e80b3SSadaf Ebrahimi*tracefs_hist_add_key*(3),
192*287e80b3SSadaf Ebrahimi*tracefs_hist_add_value*(3),
193*287e80b3SSadaf Ebrahimi*tracefs_hist_add_name*(3),
194*287e80b3SSadaf Ebrahimi*tracefs_hist_start*(3),
195*287e80b3SSadaf Ebrahimi*tracefs_hist_destory*(3),
196*287e80b3SSadaf Ebrahimi*tracefs_hist_add_sort_key*(3),
197*287e80b3SSadaf Ebrahimi*tracefs_hist_sort_key_direction*(3)
198*287e80b3SSadaf Ebrahimi
199*287e80b3SSadaf EbrahimiAUTHOR
200*287e80b3SSadaf Ebrahimi------
201*287e80b3SSadaf Ebrahimi[verse]
202*287e80b3SSadaf Ebrahimi--
203*287e80b3SSadaf Ebrahimi*Steven Rostedt* <[email protected]>
204*287e80b3SSadaf Ebrahimi*Tzvetomir Stoyanov* <[email protected]>
205*287e80b3SSadaf Ebrahimi*sameeruddin shaik* <[email protected]>
206*287e80b3SSadaf Ebrahimi--
207*287e80b3SSadaf EbrahimiREPORTING BUGS
208*287e80b3SSadaf Ebrahimi--------------
209*287e80b3SSadaf EbrahimiReport bugs to  <[email protected]>
210*287e80b3SSadaf Ebrahimi
211*287e80b3SSadaf EbrahimiLICENSE
212*287e80b3SSadaf Ebrahimi-------
213*287e80b3SSadaf Ebrahimilibtracefs is Free Software licensed under the GNU LGPL 2.1
214*287e80b3SSadaf Ebrahimi
215*287e80b3SSadaf EbrahimiRESOURCES
216*287e80b3SSadaf Ebrahimi---------
217*287e80b3SSadaf Ebrahimihttps://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/
218*287e80b3SSadaf Ebrahimi
219*287e80b3SSadaf EbrahimiCOPYING
220*287e80b3SSadaf Ebrahimi-------
221*287e80b3SSadaf EbrahimiCopyright \(C) 2020 VMware, Inc. Free use of this software is granted under
222*287e80b3SSadaf Ebrahimithe terms of the GNU Public License (GPL).
223