From: Arnaldo Carvalho de Melo <a...@redhat.com>

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

Cc: Adrian Hunter <adrian.hun...@intel.com>
Cc: David Ahern <dsah...@gmail.com>
Cc: Frederic Weisbecker <fweis...@gmail.com>
Cc: Mike Galbraith <efa...@gmx.de>
Cc: Paul Mackerras <pau...@samba.org>
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Stephane Eranian <eran...@google.com>
Link: http://lkml.kernel.org/n/tip-9j6hvap23qanyl96wx4mr...@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <a...@redhat.com>
---
 tools/perf/Documentation/perf-trace.txt |  2 ++
 tools/perf/builtin-trace.c              | 28 +++++++++++++++++++---------
 2 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/tools/perf/Documentation/perf-trace.txt 
b/tools/perf/Documentation/perf-trace.txt
index cb3371e..4754f11 100644
--- a/tools/perf/Documentation/perf-trace.txt
+++ b/tools/perf/Documentation/perf-trace.txt
@@ -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=::
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 9891d8c..6ab7a7a 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -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,13 +235,17 @@ 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)) {
-               sc->filtered = true;
-               /*
-                * No need to do read tracepoint information since this will be
-                * filtered out.
-                */
-               return 0;
+       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
+                        * filtered out.
+                        */
+                       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);
-- 
1.8.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to