Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b059efdf authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

perf trace: Support ! in -e expressions

So that we can ask for all but a set of syscalls to be traced.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-9j6hvap23qanyl96wx4mrj9k@git.kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 8c9dc528
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ OPTIONS
-e::
--expr::
	List of events to show, currently only syscall names.
	Prefixing with ! shows all syscalls but the ones specified.  You may
	need to escape it.

-o::
--output=::
+19 −9
Original line number Diff line number Diff line
@@ -114,8 +114,9 @@ struct trace {
	struct machine		host;
	u64			base_time;
	FILE			*output;
	struct strlist		*ev_qualifier;
	unsigned long		nr_events;
	struct strlist		*ev_qualifier;
	bool			not_ev_qualifier;
	bool			sched;
	bool			multiple_threads;
	double			duration_filter;
@@ -234,7 +235,10 @@ static int trace__read_syscall_info(struct trace *trace, int id)
	sc = trace->syscalls.table + id;
	sc->name = name;

	if (trace->ev_qualifier && !strlist__find(trace->ev_qualifier, name)) {
	if (trace->ev_qualifier) {
		bool in = strlist__find(trace->ev_qualifier, name) != NULL;

		if (!(in ^ trace->not_ev_qualifier)) {
			sc->filtered = true;
			/*
			 * No need to do read tracepoint information since this will be
@@ -242,6 +246,7 @@ static int trace__read_syscall_info(struct trace *trace, int id)
			 */
			return 0;
		}
	}

	sc->fmt  = syscall_fmt__find(sc->name);

@@ -725,7 +730,12 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
	}

	if (ev_qualifier_str != NULL) {
		trace.ev_qualifier = strlist__new(true, ev_qualifier_str);
		const char *s = ev_qualifier_str;

		trace.not_ev_qualifier = *s == '!';
		if (trace.not_ev_qualifier)
			++s;
		trace.ev_qualifier = strlist__new(true, s);
		if (trace.ev_qualifier == NULL) {
			fputs("Not enough memory to parse event qualifier",
			      trace.output);