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