xref: /aosp_15_r20/external/libtracefs/Documentation/libtracefs-instances-affinity.txt (revision 287e80b3a36113050663245e7f2c00d274188f18)
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