Commit ca3958b1 authored by Tzvetomir Stoyanov's avatar Tzvetomir Stoyanov Committed by Arnaldo Carvalho de Melo
Browse files

tools lib traceevent: Introduce new libtracevent API: tep_override_comm()



This patch adds a new API of tracevent library: tep_override_comm() It
registers a pid / command mapping. If a mapping with the same pid
already exists, the entry is updated with the new command.

Signed-off-by: default avatarTzvetomir Stoyanov <tstoyanov@vmware.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/20181130154648.038915912@goodmis.org


Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 21327c78
Loading
Loading
Loading
Loading
+54 −15
Original line number Diff line number Diff line
@@ -232,11 +232,13 @@ int tep_pid_is_registered(struct tep_handle *pevent, int pid)
 * we must add this pid. This is much slower than when cmdlines
 * are added before the array is initialized.
 */
static int add_new_comm(struct tep_handle *pevent, const char *comm, int pid)
static int add_new_comm(struct tep_handle *pevent,
			const char *comm, int pid, bool override)
{
	struct cmdline *cmdlines = pevent->cmdlines;
	const struct cmdline *cmdline;
	struct cmdline *cmdline;
	struct cmdline key;
	char *new_comm;

	if (!pid)
		return 0;
@@ -247,9 +249,20 @@ static int add_new_comm(struct tep_handle *pevent, const char *comm, int pid)
	cmdline = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
		       sizeof(*pevent->cmdlines), cmdline_cmp);
	if (cmdline) {
		if (!override) {
			errno = EEXIST;
			return -1;
		}
		new_comm = strdup(comm);
		if (!new_comm) {
			errno = ENOMEM;
			return -1;
		}
		free(cmdline->comm);
		cmdline->comm = new_comm;

		return 0;
	}

	cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (pevent->cmdline_count + 1));
	if (!cmdlines) {
@@ -275,21 +288,13 @@ static int add_new_comm(struct tep_handle *pevent, const char *comm, int pid)
	return 0;
}

/**
 * tep_register_comm - register a pid / comm mapping
 * @pevent: handle for the pevent
 * @comm: the command line to register
 * @pid: the pid to map the command line to
 *
 * This adds a mapping to search for command line names with
 * a given pid. The comm is duplicated.
 */
int tep_register_comm(struct tep_handle *pevent, const char *comm, int pid)
static int _tep_register_comm(struct tep_handle *pevent,
			      const char *comm, int pid, bool override)
{
	struct cmdline_list *item;

	if (pevent->cmdlines)
		return add_new_comm(pevent, comm, pid);
		return add_new_comm(pevent, comm, pid, override);

	item = malloc(sizeof(*item));
	if (!item)
@@ -312,6 +317,40 @@ int tep_register_comm(struct tep_handle *pevent, const char *comm, int pid)
	return 0;
}

/**
 * tep_register_comm - register a pid / comm mapping
 * @pevent: handle for the pevent
 * @comm: the command line to register
 * @pid: the pid to map the command line to
 *
 * This adds a mapping to search for command line names with
 * a given pid. The comm is duplicated. If a command with the same pid
 * already exist, -1 is returned and errno is set to EEXIST
 */
int tep_register_comm(struct tep_handle *pevent, const char *comm, int pid)
{
	return _tep_register_comm(pevent, comm, pid, false);
}

/**
 * tep_override_comm - register a pid / comm mapping
 * @pevent: handle for the pevent
 * @comm: the command line to register
 * @pid: the pid to map the command line to
 *
 * This adds a mapping to search for command line names with
 * a given pid. The comm is duplicated. If a command with the same pid
 * already exist, the command string is udapted with the new one
 */
int tep_override_comm(struct tep_handle *pevent, const char *comm, int pid)
{
	if (!pevent->cmdlines && cmdline_init(pevent)) {
		errno = ENOMEM;
		return -1;
	}
	return _tep_register_comm(pevent, comm, pid, true);
}

int tep_register_trace_clock(struct tep_handle *pevent, const char *trace_clock)
{
	pevent->trace_clock = strdup(trace_clock);
+1 −0
Original line number Diff line number Diff line
@@ -432,6 +432,7 @@ int tep_set_function_resolver(struct tep_handle *pevent,
			      tep_func_resolver_t *func, void *priv);
void tep_reset_function_resolver(struct tep_handle *pevent);
int tep_register_comm(struct tep_handle *pevent, const char *comm, int pid);
int tep_override_comm(struct tep_handle *pevent, const char *comm, int pid);
int tep_register_trace_clock(struct tep_handle *pevent, const char *trace_clock);
int tep_register_function(struct tep_handle *pevent, char *name,
			  unsigned long long addr, char *mod);