201 lines
5.7 KiB
Plaintext
201 lines
5.7 KiB
Plaintext
libtracefs(3)
|
|
=============
|
|
|
|
NAME
|
|
----
|
|
tracefs_instance_set_affinity, tracefs_instance_set_affinity_set, tracefs_instance_set_affinity_raw,
|
|
tracefs_instance_get_affinity, tracefs_instance_get_affinity_set, tracefs_instance_get_affinity_raw
|
|
- Sets or retrieves the affinity for an instance or top level for what CPUs enable tracing.
|
|
|
|
SYNOPSIS
|
|
--------
|
|
[verse]
|
|
--
|
|
*#include <tracefs.h>*
|
|
|
|
int *tracefs_instance_set_affinity*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_cpu_str_);
|
|
int *tracefs_instance_set_affinity_set*(struct tracefs_instance pass:[*]_instance_, cpu_set_t pass:[*]_set_, size_t _set_size_);
|
|
int *tracefs_instance_set_affinity_raw*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_mask_);
|
|
|
|
char pass:[*]*tracefs_instance_get_affinity*(struct tracefs_instance pass:[*]_instance_);
|
|
int *tracefs_instance_get_affinity_set*(struct tracefs_instance pass:[*]_instance_, cpu_set_t pass:[*]_set_, size_t _set_size_);
|
|
char pass:[*]*tracefs_instance_get_affinity_raw*(struct tracefs_instance pass:[*]_instance_);
|
|
--
|
|
|
|
DESCRIPTION
|
|
-----------
|
|
These functions set or retrieve the CPU affinity that limits what CPUs will have tracing enabled
|
|
for a given instance defined by the _instance_ parameter. If _instance_ is NULL, then
|
|
the top level instance is affected.
|
|
|
|
The *tracefs_instance_set_affinity()* function takes a string _cpu_str_ that is a
|
|
list of CPUs to set the affinity for. If _cpu_str_ is NULL, then all the CPUs in
|
|
the system will be set. The format of _cpu_str_ is a comma delimited string of
|
|
decimal numbers with no spaces. A range may be specified by a hyphen.
|
|
|
|
For example: "1,4,6-8"
|
|
|
|
The numbers do not need to be in order except for ranges, where the second number
|
|
must be equal to or greater than the first.
|
|
|
|
The *tracefs_instance_set_affinity_set()* function takes a CPU set defined by
|
|
*CPU_SET*(3). The size of the set defined by _set_size_ is the size in bytes of
|
|
_set_. If _set_ is NULL then all the CPUs on the system will be set, and _set_size_
|
|
is ignored.
|
|
|
|
The *tracefs_instance_set_affinity_raw()* function takes a string that holds
|
|
a hexidecimal bitmask, where each 32 bits is separated by a comma. For a
|
|
machine with more that 32 CPUs, to set CPUS 1-10 and CPU 40:
|
|
|
|
"100,000007fe"
|
|
|
|
Where the above is a hex representation of bits 1-10 and bit 40 being set.
|
|
|
|
The *tracefs_instance_get_affinity()* will retrieve the affinity in a human readable
|
|
form.
|
|
|
|
For example: "1,4,6-8"
|
|
|
|
The string returned must be freed with *free*(3).
|
|
|
|
The *tracefs_instance_get_affinity_set()* will set all the bits in the passed in
|
|
cpu set (from *CPU_SET*(3)). Note it will not clear any bits that are already set
|
|
in the set but the CPUs are not. If only the bits for the CPUs that are enabled
|
|
should be set, a CPU_ZERO_S() should be performed on the set before calling this
|
|
function.
|
|
|
|
The *tracefs_instance_get_affinity_raw()* will simply read the instance tracing_cpumask
|
|
and return that string. The returned string must be freed with *free*(3).
|
|
|
|
RETURN VALUE
|
|
------------
|
|
All the set functions return 0 on success and -1 on error.
|
|
|
|
The functions *tracefs_instance_get_affinity()* and *tracefs_instance_get_affinity_raw()*
|
|
returns an allocated string that must be freed with *free*(3), or NULL on error.
|
|
|
|
The function *tracefs_instance_get_affinity_set()* returns the number of CPUs that
|
|
were found set, or -1 on error.
|
|
|
|
|
|
ERRORS
|
|
------
|
|
The following errors are for all the above calls:
|
|
|
|
*EFBIG* if a CPU is set that is greater than what is in the system.
|
|
|
|
*EINVAL* One of the parameters was invalid.
|
|
|
|
The following errors are for *tracefs_instance_set_affinity*() and *tracefs_instance_set_affinity_set*():
|
|
|
|
*ENOMEM* Memory allocation error.
|
|
|
|
*ENODEV* dynamic events of requested type are not configured for the running kernel.
|
|
|
|
The following errors are just for *tracefs_instance_set_affinity*()
|
|
|
|
*EACCES* The _cpu_str_ was modified by another thread when processing it.
|
|
|
|
EXAMPLE
|
|
-------
|
|
[source,c]
|
|
--
|
|
#include <sched.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <tracefs.h>
|
|
|
|
int main (int argc, char **argv)
|
|
{
|
|
struct trace_seq seq;
|
|
cpu_set_t *set;
|
|
size_t set_size;
|
|
char *c;
|
|
int cpu1;
|
|
int cpu2;
|
|
int i;
|
|
|
|
c = tracefs_instance_get_affinity(NULL);
|
|
printf("The affinity was %s\n", c);
|
|
free(c);
|
|
|
|
if (argc < 2) {
|
|
tracefs_instance_set_affinity(NULL, NULL);
|
|
exit(0);
|
|
}
|
|
/* Show example using a set */
|
|
if (argc == 2 && !strchr(argv[1],',')) {
|
|
cpu1 = atoi(argv[1]);
|
|
c = strchr(argv[1], '-');
|
|
if (c++)
|
|
cpu2 = atoi(c);
|
|
else
|
|
cpu2 = cpu1;
|
|
if (cpu2 < cpu1) {
|
|
fprintf(stderr, "Invalid CPU range\n");
|
|
exit(-1);
|
|
}
|
|
set = CPU_ALLOC(cpu2 + 1);
|
|
set_size = CPU_ALLOC_SIZE(cpu2 + 1);
|
|
CPU_ZERO_S(set_size, set);
|
|
for ( ; cpu1 <= cpu2; cpu1++)
|
|
CPU_SET(cpu1, set);
|
|
tracefs_instance_set_affinity_set(NULL, set, set_size);
|
|
CPU_FREE(set);
|
|
exit(0);
|
|
}
|
|
|
|
trace_seq_init(&seq);
|
|
for (i = 1; i < argc; i++) {
|
|
if (i > 1)
|
|
trace_seq_putc(&seq, ',');
|
|
trace_seq_puts(&seq, argv[i]);
|
|
}
|
|
trace_seq_terminate(&seq);
|
|
tracefs_instance_set_affinity(NULL, seq.buffer);
|
|
trace_seq_destroy(&seq);
|
|
exit(0);
|
|
|
|
return 0;
|
|
}
|
|
--
|
|
FILES
|
|
-----
|
|
[verse]
|
|
--
|
|
*tracefs.h*
|
|
Header file to include in order to have access to the library APIs.
|
|
*-ltracefs*
|
|
Linker switch to add when building a program that uses the library.
|
|
--
|
|
|
|
SEE ALSO
|
|
--------
|
|
*libtracefs*(3),
|
|
*libtraceevent*(3),
|
|
*trace-cmd*(1)
|
|
|
|
AUTHOR
|
|
------
|
|
[verse]
|
|
--
|
|
*Steven Rostedt* <rostedt@goodmis.org>
|
|
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>
|
|
--
|
|
REPORTING BUGS
|
|
--------------
|
|
Report bugs to <linux-trace-devel@vger.kernel.org>
|
|
|
|
LICENSE
|
|
-------
|
|
libtracefs is Free Software licensed under the GNU LGPL 2.1
|
|
|
|
RESOURCES
|
|
---------
|
|
https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/
|
|
|
|
COPYING
|
|
-------
|
|
Copyright \(C) 2020 VMware, Inc. Free use of this software is granted under
|
|
the terms of the GNU Public License (GPL).
|