perf probe: Accept multiple filter options
authorMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Fri, 24 Apr 2015 09:47:48 +0000 (18:47 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 4 May 2015 15:43:55 +0000 (12:43 -0300)
Accept multiple filter options. Each filters are combined by logical-or.
E.g. --filter abc* --filter *def is same as --filter abc*|*def

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20150424094748.23967.63355.stgit@localhost.localdomain
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-probe.c

index 92dcce065e6813208d9275e52ac48c80970fece2..be170757ebd641a31d246b9e29174ca4b63c54ea 100644 (file)
@@ -262,21 +262,25 @@ static int opt_set_filter(const struct option *opt __maybe_unused,
                          const char *str, int unset __maybe_unused)
 {
        const char *err;
+       int ret = 0;
 
        if (str) {
                pr_debug2("Set filter: %s\n", str);
-               if (params.filter)
-                       strfilter__delete(params.filter);
-               params.filter = strfilter__new(str, &err);
                if (!params.filter) {
+                       params.filter = strfilter__new(str, &err);
+                       if (!params.filter)
+                               ret = err ? -EINVAL : -ENOMEM;
+               } else
+                       ret = strfilter__or(params.filter, str, &err);
+
+               if (ret == -EINVAL) {
                        pr_err("Filter parse error at %td.\n", err - str + 1);
                        pr_err("Source: \"%s\"\n", str);
                        pr_err("         %*c\n", (int)(err - str + 1), '^');
-                       return -EINVAL;
                }
        }
 
-       return 0;
+       return ret;
 }
 
 static int init_params(void)