1*287e80b3SSadaf Ebrahimilibtracefs(3) 2*287e80b3SSadaf Ebrahimi============= 3*287e80b3SSadaf Ebrahimi 4*287e80b3SSadaf EbrahimiNAME 5*287e80b3SSadaf Ebrahimi---- 6*287e80b3SSadaf Ebrahimitracefs_instance_set_affinity, tracefs_instance_set_affinity_set, tracefs_instance_set_affinity_raw, 7*287e80b3SSadaf Ebrahimitracefs_instance_get_affinity, tracefs_instance_get_affinity_set, tracefs_instance_get_affinity_raw 8*287e80b3SSadaf Ebrahimi- Sets or retrieves the affinity for an instance or top level for what CPUs enable tracing. 9*287e80b3SSadaf Ebrahimi 10*287e80b3SSadaf EbrahimiSYNOPSIS 11*287e80b3SSadaf Ebrahimi-------- 12*287e80b3SSadaf Ebrahimi[verse] 13*287e80b3SSadaf Ebrahimi-- 14*287e80b3SSadaf Ebrahimi*#include <tracefs.h>* 15*287e80b3SSadaf Ebrahimi 16*287e80b3SSadaf Ebrahimiint *tracefs_instance_set_affinity*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_cpu_str_); 17*287e80b3SSadaf Ebrahimiint *tracefs_instance_set_affinity_set*(struct tracefs_instance pass:[*]_instance_, cpu_set_t pass:[*]_set_, size_t _set_size_); 18*287e80b3SSadaf Ebrahimiint *tracefs_instance_set_affinity_raw*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_mask_); 19*287e80b3SSadaf Ebrahimi 20*287e80b3SSadaf Ebrahimichar pass:[*]*tracefs_instance_get_affinity*(struct tracefs_instance pass:[*]_instance_); 21*287e80b3SSadaf Ebrahimiint *tracefs_instance_get_affinity_set*(struct tracefs_instance pass:[*]_instance_, cpu_set_t pass:[*]_set_, size_t _set_size_); 22*287e80b3SSadaf Ebrahimichar pass:[*]*tracefs_instance_get_affinity_raw*(struct tracefs_instance pass:[*]_instance_); 23*287e80b3SSadaf Ebrahimi-- 24*287e80b3SSadaf Ebrahimi 25*287e80b3SSadaf EbrahimiDESCRIPTION 26*287e80b3SSadaf Ebrahimi----------- 27*287e80b3SSadaf EbrahimiThese functions set or retrieve the CPU affinity that limits what CPUs will have tracing enabled 28*287e80b3SSadaf Ebrahimifor a given instance defined by the _instance_ parameter. If _instance_ is NULL, then 29*287e80b3SSadaf Ebrahimithe top level instance is affected. 30*287e80b3SSadaf Ebrahimi 31*287e80b3SSadaf EbrahimiThe *tracefs_instance_set_affinity()* function takes a string _cpu_str_ that is a 32*287e80b3SSadaf Ebrahimilist of CPUs to set the affinity for. If _cpu_str_ is NULL, then all the CPUs in 33*287e80b3SSadaf Ebrahimithe system will be set. The format of _cpu_str_ is a comma delimited string of 34*287e80b3SSadaf Ebrahimidecimal numbers with no spaces. A range may be specified by a hyphen. 35*287e80b3SSadaf Ebrahimi 36*287e80b3SSadaf EbrahimiFor example: "1,4,6-8" 37*287e80b3SSadaf Ebrahimi 38*287e80b3SSadaf EbrahimiThe numbers do not need to be in order except for ranges, where the second number 39*287e80b3SSadaf Ebrahimimust be equal to or greater than the first. 40*287e80b3SSadaf Ebrahimi 41*287e80b3SSadaf EbrahimiThe *tracefs_instance_set_affinity_set()* function takes a CPU set defined by 42*287e80b3SSadaf Ebrahimi*CPU_SET*(3). The size of the set defined by _set_size_ is the size in bytes of 43*287e80b3SSadaf Ebrahimi_set_. If _set_ is NULL then all the CPUs on the system will be set, and _set_size_ 44*287e80b3SSadaf Ebrahimiis ignored. 45*287e80b3SSadaf Ebrahimi 46*287e80b3SSadaf EbrahimiThe *tracefs_instance_set_affinity_raw()* function takes a string that holds 47*287e80b3SSadaf Ebrahimia hexidecimal bitmask, where each 32 bits is separated by a comma. For a 48*287e80b3SSadaf Ebrahimimachine with more that 32 CPUs, to set CPUS 1-10 and CPU 40: 49*287e80b3SSadaf Ebrahimi 50*287e80b3SSadaf Ebrahimi "100,000007fe" 51*287e80b3SSadaf Ebrahimi 52*287e80b3SSadaf EbrahimiWhere the above is a hex representation of bits 1-10 and bit 40 being set. 53*287e80b3SSadaf Ebrahimi 54*287e80b3SSadaf EbrahimiThe *tracefs_instance_get_affinity()* will retrieve the affinity in a human readable 55*287e80b3SSadaf Ebrahimiform. 56*287e80b3SSadaf Ebrahimi 57*287e80b3SSadaf EbrahimiFor example: "1,4,6-8" 58*287e80b3SSadaf Ebrahimi 59*287e80b3SSadaf EbrahimiThe string returned must be freed with *free*(3). 60*287e80b3SSadaf Ebrahimi 61*287e80b3SSadaf EbrahimiThe *tracefs_instance_get_affinity_set()* will set all the bits in the passed in 62*287e80b3SSadaf Ebrahimicpu set (from *CPU_SET*(3)). Note it will not clear any bits that are already set 63*287e80b3SSadaf Ebrahimiin the set but the CPUs are not. If only the bits for the CPUs that are enabled 64*287e80b3SSadaf Ebrahimishould be set, a CPU_ZERO_S() should be performed on the set before calling this 65*287e80b3SSadaf Ebrahimifunction. 66*287e80b3SSadaf Ebrahimi 67*287e80b3SSadaf EbrahimiThe *tracefs_instance_get_affinity_raw()* will simply read the instance tracing_cpumask 68*287e80b3SSadaf Ebrahimiand return that string. The returned string must be freed with *free*(3). 69*287e80b3SSadaf Ebrahimi 70*287e80b3SSadaf EbrahimiRETURN VALUE 71*287e80b3SSadaf Ebrahimi------------ 72*287e80b3SSadaf EbrahimiAll the set functions return 0 on success and -1 on error. 73*287e80b3SSadaf Ebrahimi 74*287e80b3SSadaf EbrahimiThe functions *tracefs_instance_get_affinity()* and *tracefs_instance_get_affinity_raw()* 75*287e80b3SSadaf Ebrahimireturns an allocated string that must be freed with *free*(3), or NULL on error. 76*287e80b3SSadaf Ebrahimi 77*287e80b3SSadaf EbrahimiThe function *tracefs_instance_get_affinity_set()* returns the number of CPUs that 78*287e80b3SSadaf Ebrahimiwere found set, or -1 on error. 79*287e80b3SSadaf Ebrahimi 80*287e80b3SSadaf Ebrahimi 81*287e80b3SSadaf EbrahimiERRORS 82*287e80b3SSadaf Ebrahimi------ 83*287e80b3SSadaf EbrahimiThe following errors are for all the above calls: 84*287e80b3SSadaf Ebrahimi 85*287e80b3SSadaf Ebrahimi*EFBIG* if a CPU is set that is greater than what is in the system. 86*287e80b3SSadaf Ebrahimi 87*287e80b3SSadaf Ebrahimi*EINVAL* One of the parameters was invalid. 88*287e80b3SSadaf Ebrahimi 89*287e80b3SSadaf EbrahimiThe following errors are for *tracefs_instance_set_affinity*() and *tracefs_instance_set_affinity_set*(): 90*287e80b3SSadaf Ebrahimi 91*287e80b3SSadaf Ebrahimi*ENOMEM* Memory allocation error. 92*287e80b3SSadaf Ebrahimi 93*287e80b3SSadaf Ebrahimi*ENODEV* dynamic events of requested type are not configured for the running kernel. 94*287e80b3SSadaf Ebrahimi 95*287e80b3SSadaf EbrahimiThe following errors are just for *tracefs_instance_set_affinity*() 96*287e80b3SSadaf Ebrahimi 97*287e80b3SSadaf Ebrahimi*EACCES* The _cpu_str_ was modified by another thread when processing it. 98*287e80b3SSadaf Ebrahimi 99*287e80b3SSadaf EbrahimiEXAMPLE 100*287e80b3SSadaf Ebrahimi------- 101*287e80b3SSadaf Ebrahimi[source,c] 102*287e80b3SSadaf Ebrahimi-- 103*287e80b3SSadaf Ebrahimi#include <sched.h> 104*287e80b3SSadaf Ebrahimi#include <stdio.h> 105*287e80b3SSadaf Ebrahimi#include <stdlib.h> 106*287e80b3SSadaf Ebrahimi#include <tracefs.h> 107*287e80b3SSadaf Ebrahimi 108*287e80b3SSadaf Ebrahimiint main (int argc, char **argv) 109*287e80b3SSadaf Ebrahimi{ 110*287e80b3SSadaf Ebrahimi struct trace_seq seq; 111*287e80b3SSadaf Ebrahimi cpu_set_t *set; 112*287e80b3SSadaf Ebrahimi size_t set_size; 113*287e80b3SSadaf Ebrahimi char *c; 114*287e80b3SSadaf Ebrahimi int cpu1; 115*287e80b3SSadaf Ebrahimi int cpu2; 116*287e80b3SSadaf Ebrahimi int i; 117*287e80b3SSadaf Ebrahimi 118*287e80b3SSadaf Ebrahimi c = tracefs_instance_get_affinity(NULL); 119*287e80b3SSadaf Ebrahimi printf("The affinity was %s\n", c); 120*287e80b3SSadaf Ebrahimi free(c); 121*287e80b3SSadaf Ebrahimi 122*287e80b3SSadaf Ebrahimi if (argc < 2) { 123*287e80b3SSadaf Ebrahimi tracefs_instance_set_affinity(NULL, NULL); 124*287e80b3SSadaf Ebrahimi exit(0); 125*287e80b3SSadaf Ebrahimi } 126*287e80b3SSadaf Ebrahimi /* Show example using a set */ 127*287e80b3SSadaf Ebrahimi if (argc == 2 && !strchr(argv[1],',')) { 128*287e80b3SSadaf Ebrahimi cpu1 = atoi(argv[1]); 129*287e80b3SSadaf Ebrahimi c = strchr(argv[1], '-'); 130*287e80b3SSadaf Ebrahimi if (c++) 131*287e80b3SSadaf Ebrahimi cpu2 = atoi(c); 132*287e80b3SSadaf Ebrahimi else 133*287e80b3SSadaf Ebrahimi cpu2 = cpu1; 134*287e80b3SSadaf Ebrahimi if (cpu2 < cpu1) { 135*287e80b3SSadaf Ebrahimi fprintf(stderr, "Invalid CPU range\n"); 136*287e80b3SSadaf Ebrahimi exit(-1); 137*287e80b3SSadaf Ebrahimi } 138*287e80b3SSadaf Ebrahimi set = CPU_ALLOC(cpu2 + 1); 139*287e80b3SSadaf Ebrahimi set_size = CPU_ALLOC_SIZE(cpu2 + 1); 140*287e80b3SSadaf Ebrahimi CPU_ZERO_S(set_size, set); 141*287e80b3SSadaf Ebrahimi for ( ; cpu1 <= cpu2; cpu1++) 142*287e80b3SSadaf Ebrahimi CPU_SET(cpu1, set); 143*287e80b3SSadaf Ebrahimi tracefs_instance_set_affinity_set(NULL, set, set_size); 144*287e80b3SSadaf Ebrahimi CPU_FREE(set); 145*287e80b3SSadaf Ebrahimi exit(0); 146*287e80b3SSadaf Ebrahimi } 147*287e80b3SSadaf Ebrahimi 148*287e80b3SSadaf Ebrahimi trace_seq_init(&seq); 149*287e80b3SSadaf Ebrahimi for (i = 1; i < argc; i++) { 150*287e80b3SSadaf Ebrahimi if (i > 1) 151*287e80b3SSadaf Ebrahimi trace_seq_putc(&seq, ','); 152*287e80b3SSadaf Ebrahimi trace_seq_puts(&seq, argv[i]); 153*287e80b3SSadaf Ebrahimi } 154*287e80b3SSadaf Ebrahimi trace_seq_terminate(&seq); 155*287e80b3SSadaf Ebrahimi tracefs_instance_set_affinity(NULL, seq.buffer); 156*287e80b3SSadaf Ebrahimi trace_seq_destroy(&seq); 157*287e80b3SSadaf Ebrahimi exit(0); 158*287e80b3SSadaf Ebrahimi 159*287e80b3SSadaf Ebrahimi return 0; 160*287e80b3SSadaf Ebrahimi} 161*287e80b3SSadaf Ebrahimi-- 162*287e80b3SSadaf EbrahimiFILES 163*287e80b3SSadaf Ebrahimi----- 164*287e80b3SSadaf Ebrahimi[verse] 165*287e80b3SSadaf Ebrahimi-- 166*287e80b3SSadaf Ebrahimi*tracefs.h* 167*287e80b3SSadaf Ebrahimi Header file to include in order to have access to the library APIs. 168*287e80b3SSadaf Ebrahimi*-ltracefs* 169*287e80b3SSadaf Ebrahimi Linker switch to add when building a program that uses the library. 170*287e80b3SSadaf Ebrahimi-- 171*287e80b3SSadaf Ebrahimi 172*287e80b3SSadaf EbrahimiSEE ALSO 173*287e80b3SSadaf Ebrahimi-------- 174*287e80b3SSadaf Ebrahimi*libtracefs*(3), 175*287e80b3SSadaf Ebrahimi*libtraceevent*(3), 176*287e80b3SSadaf Ebrahimi*trace-cmd*(1) 177*287e80b3SSadaf Ebrahimi 178*287e80b3SSadaf EbrahimiAUTHOR 179*287e80b3SSadaf Ebrahimi------ 180*287e80b3SSadaf Ebrahimi[verse] 181*287e80b3SSadaf Ebrahimi-- 182*287e80b3SSadaf Ebrahimi*Steven Rostedt* <[email protected]> 183*287e80b3SSadaf Ebrahimi*Tzvetomir Stoyanov* <[email protected]> 184*287e80b3SSadaf Ebrahimi-- 185*287e80b3SSadaf EbrahimiREPORTING BUGS 186*287e80b3SSadaf Ebrahimi-------------- 187*287e80b3SSadaf EbrahimiReport bugs to <[email protected]> 188*287e80b3SSadaf Ebrahimi 189*287e80b3SSadaf EbrahimiLICENSE 190*287e80b3SSadaf Ebrahimi------- 191*287e80b3SSadaf Ebrahimilibtracefs is Free Software licensed under the GNU LGPL 2.1 192*287e80b3SSadaf Ebrahimi 193*287e80b3SSadaf EbrahimiRESOURCES 194*287e80b3SSadaf Ebrahimi--------- 195*287e80b3SSadaf Ebrahimihttps://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/ 196*287e80b3SSadaf Ebrahimi 197*287e80b3SSadaf EbrahimiCOPYING 198*287e80b3SSadaf Ebrahimi------- 199*287e80b3SSadaf EbrahimiCopyright \(C) 2020 VMware, Inc. Free use of this software is granted under 200*287e80b3SSadaf Ebrahimithe terms of the GNU Public License (GPL). 201