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).
