Commit b5aa0be2 authored by Daniel Bristot de Oliveira's avatar Daniel Bristot de Oliveira Committed by Steven Rostedt (Google)
Browse files

rtla/trace: Add trace events helpers

Add a set of helper functions to allow the rtla tools to enable
additional tracepoints in the trace instance.

Link: https://lkml.kernel.org/r/932398b36c1bbaa22c7810d7a40ca9b8c5595b94.1646247211.git.bristot@kernel.org



Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
Cc: Clark Williams <williams@redhat.com>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: default avatarDaniel Bristot de Oliveira <bristot@kernel.org>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 173a3b01
Loading
Loading
Loading
Loading
+104 −0
Original line number Diff line number Diff line
@@ -190,3 +190,107 @@ int trace_instance_start(struct trace_instance *trace)
{
	return tracefs_trace_on(trace->inst);
}

/*
 * trace_events_free - free a list of trace events
 */
static void trace_events_free(struct trace_events *events)
{
	struct trace_events *tevent = events;
	struct trace_events *free_event;

	while (tevent) {
		free_event = tevent;

		tevent = tevent->next;

		free(free_event->system);
		free(free_event);
	}
}

/*
 * trace_event_alloc - alloc and parse a single trace event
 */
struct trace_events *trace_event_alloc(const char *event_string)
{
	struct trace_events *tevent;

	tevent = calloc(1, sizeof(*tevent));
	if (!tevent)
		return NULL;

	tevent->system = strdup(event_string);
	if (!tevent->system) {
		free(tevent);
		return NULL;
	}

	tevent->event = strstr(tevent->system, ":");
	if (tevent->event) {
		*tevent->event = '\0';
		tevent->event = &tevent->event[1];
	}

	return tevent;
}

/*
 * trace_events_disable - disable all trace events
 */
void trace_events_disable(struct trace_instance *instance,
			  struct trace_events *events)
{
	struct trace_events *tevent = events;

	if (!events)
		return;

	while (tevent) {
		debug_msg("Disabling event %s:%s\n", tevent->system, tevent->event ? : "*");
		if (tevent->enabled)
			tracefs_event_disable(instance->inst, tevent->system, tevent->event);

		tevent->enabled = 0;
		tevent = tevent->next;
	}
}

/*
 * trace_events_enable - enable all events
 */
int trace_events_enable(struct trace_instance *instance,
			struct trace_events *events)
{
	struct trace_events *tevent = events;
	int retval;

	while (tevent) {
		debug_msg("Enabling event %s:%s\n", tevent->system, tevent->event ? : "*");
		retval = tracefs_event_enable(instance->inst, tevent->system, tevent->event);
		if (retval < 0) {
			err_msg("Error enabling event %s:%s\n", tevent->system,
				tevent->event ? : "*");
			return 1;
		}


		tevent->enabled = 1;
		tevent = tevent->next;
	}

	return 0;
}

/*
 * trace_events_destroy - disable and free all trace events
 */
void trace_events_destroy(struct trace_instance *instance,
			  struct trace_events *events)
{
	if (!events)
		return;

	trace_events_disable(instance, events);
	trace_events_free(events);
}
+15 −0
Original line number Diff line number Diff line
@@ -2,6 +2,13 @@
#include <tracefs.h>
#include <stddef.h>

struct trace_events {
	struct trace_events *next;
	char *system;
	char *event;
	char enabled;
};

struct trace_instance {
	struct tracefs_instance		*inst;
	struct tep_handle		*tep;
@@ -25,3 +32,11 @@ void destroy_instance(struct tracefs_instance *inst);
int save_trace_to_file(struct tracefs_instance *inst, const char *filename);
int collect_registered_events(struct tep_event *tep, struct tep_record *record,
			      int cpu, void *context);

struct trace_events *trace_event_alloc(const char *event_string);
void trace_events_disable(struct trace_instance *instance,
			  struct trace_events *events);
void trace_events_destroy(struct trace_instance *instance,
			  struct trace_events *events);
int trace_events_enable(struct trace_instance *instance,
			  struct trace_events *events);