222 lines
5.4 KiB
Plaintext
222 lines
5.4 KiB
Plaintext
libtracefs(3)
|
|
=============
|
|
|
|
NAME
|
|
----
|
|
tracefs_tracer_set, tracefs_tracer_clear - Enable or disable a tracer in an instance or the top level
|
|
|
|
SYNOPSIS
|
|
--------
|
|
[verse]
|
|
--
|
|
*#include <tracefs.h>*
|
|
|
|
int *tracefs_tracer_set*(struct tracefs_instance pass:[*]_instance_, enum tracefs_tracers _tracer_);
|
|
int *tracefs_tracer_set*(struct tracefs_instance pass:[*]_instance_, enum tracefs_tracers _tracer_, const char pass:[*]_name_);
|
|
int *tracefs_tracer_clear*(struct tracefs_instance pass:[*]_instance_);
|
|
--
|
|
|
|
DESCRIPTION
|
|
-----------
|
|
*tracefs_tracer_set* enables a tracer in the given instance, defined by the
|
|
_instance_ parameter. If _instance_ is NULL, then the top level instance is
|
|
changed. If _tracer_ is set to *TRACFES_TRACER_CUSTOM* then a _name_
|
|
string must be passed in as the third parameter, and that is written into the
|
|
instance to enable the tracer with that name. This is useful for newer or
|
|
custom kernels that contain tracers that are not yet identified by the
|
|
tracefs_tracers enum.
|
|
|
|
*tracefs_tracer_clear* disables the tracer for the given instance defined by
|
|
the _instance_ variable, or the top level instance if it is NULL.
|
|
This is the same as calling *tracefs_tracer_set* with TRACEFS_TRACER_NOP as
|
|
the _tracer_ parameter.
|
|
|
|
TRACEFS_TRACER ENUMS
|
|
--------------------
|
|
|
|
The currently defined enums that are accepted are:
|
|
|
|
*TRACEFS_TRACER_NOP* :
|
|
This is the idle tracer, which does nothing and is used to clear any
|
|
active tracer.
|
|
|
|
*TRACEFS_TRACER_FUNCTION* :
|
|
Enables most functions in the kernel to be traced.
|
|
|
|
*TRACEFS_TRACER_FUNCTION_GRAPH* :
|
|
Enables most functions in the kernel to be traced as well as the return
|
|
of the function.
|
|
|
|
*TRACEFS_TRACER_IRQSOFF* :
|
|
Tracers the latency of interrupts disabled.
|
|
|
|
*TRACEFS_TRACER_PREEMPTOFF* :
|
|
Tracers the latency of preemption disabled (the time in the kernel that
|
|
tasks can not be scheduled from the CPU).
|
|
|
|
*TRACEFS_TRACER_PREEMPTIRQSOFF* :
|
|
Traces the combined total latency of when interrupts are disabled as well as when
|
|
preemption is disabled.
|
|
|
|
*TRACEFS_TRACER_WAKEUP* :
|
|
Traces the latency of when the highest priority task takes to wake up.
|
|
|
|
*TRACEFS_TRACER_WAKEUP_RT* :
|
|
Traces the latency of when the highest priority real-time task takes to wake up.
|
|
All other tasks are ignored.
|
|
|
|
*TRACEFS_TRACER_WAKEUP_DL* :
|
|
Traces the latency of when the highest priority DEADLINE task takes to wake up.
|
|
All other tasks are ignored.
|
|
|
|
*TRACEFS_TRACER_MMIOTRACE* :
|
|
Traces the interaction of devices with the kernel.
|
|
|
|
*TRACEFS_TRACER_HWLAT* :
|
|
Detects latency caused by the hardware that is outside the scope of the kernel.
|
|
|
|
*TRACEFS_TRACER_BRANCH* :
|
|
Traces when likely or unlikely branches are taken.
|
|
|
|
*TRACEFS_TRACER_BLOCK* :
|
|
Special tracer for the block devices.
|
|
|
|
Note that the above tracers may not be available in the kernel and
|
|
*tracefs_tracer_set()* will return an error with errno set to ENODEV,
|
|
if the kernel does not support the _tracer_ option, or the custom one
|
|
if TRACEFS_TRACER_CUSTOM is used.
|
|
|
|
RETURN VALUE
|
|
------------
|
|
Returns 0 on success, or -1 on error.
|
|
|
|
ERRORS
|
|
------
|
|
|
|
*tracefs_tracer_set*() can fail with the following errors:
|
|
|
|
*EINVAL* The _tracer_ parameter is outside the scope of what is defined.
|
|
|
|
*ENOMEM* Memory allocation error.
|
|
|
|
*ENOENT* Tracers are not supported on the running kernel.
|
|
|
|
*ENODEV* The specified tracer is not supported on the running kernel.
|
|
|
|
Other errors may also happen caused by internal system calls.
|
|
|
|
EXAMPLE
|
|
-------
|
|
[source,c]
|
|
--
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <getopt.h>
|
|
#include <errno.h>
|
|
#include <tracefs.h>
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
struct tracefs_instance *inst = NULL;
|
|
enum tracefs_tracers t = TRACEFS_TRACER_NOP;
|
|
const char *buf = NULL;
|
|
const char *cust;
|
|
int ret;
|
|
int ch;
|
|
|
|
while ((ch = getopt(argc, argv, "nfgiwdc:B:")) > 0) {
|
|
switch (ch) {
|
|
case 'f': t = TRACEFS_TRACER_FUNCTION; break;
|
|
case 'g': t = TRACEFS_TRACER_FUNCTION_GRAPH; break;
|
|
case 'i': t = TRACEFS_TRACER_PREEMPTIRQSOFF; break;
|
|
case 'w': t = TRACEFS_TRACER_WAKEUP_RT; break;
|
|
case 'd': t = TRACEFS_TRACER_WAKEUP_DL; break;
|
|
case 'c':
|
|
t = TRACEFS_TRACER_CUSTOM;
|
|
cust = optarg;
|
|
break;
|
|
case 'B':
|
|
buf = optarg;
|
|
break;
|
|
case 'n':
|
|
/* nop */
|
|
break;
|
|
default:
|
|
printf("Unknow arg %c\n", ch);
|
|
exit(-1);
|
|
}
|
|
}
|
|
|
|
if (buf) {
|
|
inst = tracefs_instance_create(buf);
|
|
if (!inst) {
|
|
printf("failed to create instance\n");
|
|
exit(-1);
|
|
}
|
|
}
|
|
|
|
if (t == TRACEFS_TRACER_CUSTOM)
|
|
ret = tracefs_tracer_set(inst, t, cust);
|
|
else
|
|
ret = tracefs_tracer_set(inst, t);
|
|
|
|
if (ret < 0) {
|
|
if (inst) {
|
|
tracefs_instance_destroy(inst);
|
|
tracefs_instance_free(inst);
|
|
}
|
|
if (errno == ENODEV)
|
|
printf("Tracer not supported by kernel\n");
|
|
else
|
|
perror("Error");
|
|
exit(-1);
|
|
}
|
|
|
|
if (inst)
|
|
tracefs_instance_free(inst);
|
|
|
|
exit(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>
|
|
*sameeruddin shaik* <sameeruddin.shaik8@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).
|