perf/probes: Improve command-line option of perf-probe
authorMasami Hiramatsu <mhiramat@redhat.com>
Tue, 27 Oct 2009 20:43:02 +0000 (16:43 -0400)
committerIngo Molnar <mingo@elte.hu>
Thu, 29 Oct 2009 07:47:48 +0000 (08:47 +0100)
Change command-line option from -P to --add, and accepting
probes without --add too.

  perf probe --add "probe-define"

or, just:

  perf probe "probe-define"

Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jim Keniston <jkenisto@us.ibm.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Frank Ch. Eigler <fche@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jason Baron <jbaron@redhat.com>
Cc: K.Prasad <prasad@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
LKML-Reference: <20091027204301.30545.48600.stgit@harusame>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/builtin-probe.c

index dcb406c..3370dab 100644 (file)
@@ -65,8 +65,8 @@ static struct {
 
 #define semantic_error(msg ...) die("Semantic error :" msg)
 
-static int parse_probepoint(const struct option *opt __used,
-                           const char *str, int unset __used)
+/* Parse a probe point. Note that any error must die. */
+static void parse_probepoint(const char *str)
 {
        char *argv[MAX_PROBE_ARGS + 2]; /* Event + probe + args */
        int argc, i;
@@ -75,9 +75,6 @@ static int parse_probepoint(const struct option *opt __used,
        char **event = &session.events[session.nr_probe];
        int retp = 0;
 
-       if (!str)       /* The end of probe points */
-               return 0;
-
        pr_debug("probe-definition(%d): %s\n", session.nr_probe, str);
        if (++session.nr_probe == MAX_PROBES)
                semantic_error("Too many probes");
@@ -176,6 +173,13 @@ static int parse_probepoint(const struct option *opt __used,
                }
 
        pr_debug("%d arguments\n", pp->nr_args);
+}
+
+static int opt_add_probepoint(const struct option *opt __used,
+                             const char *str, int unset __used)
+{
+       if (str)
+               parse_probepoint(str);
        return 0;
 }
 
@@ -211,7 +215,8 @@ static int open_default_vmlinux(void)
 #endif
 
 static const char * const probe_usage[] = {
-       "perf probe [<options>] -P 'PROBEDEF' [-P 'PROBEDEF' ...]",
+       "perf probe [<options>] 'PROBEDEF' ['PROBEDEF' ...]",
+       "perf probe [<options>] --add 'PROBEDEF' [--add 'PROBEDEF' ...]",
        NULL
 };
 
@@ -222,7 +227,7 @@ static const struct option options[] = {
        OPT_STRING('k', "vmlinux", &session.vmlinux, "file",
                "vmlinux/module pathname"),
 #endif
-       OPT_CALLBACK('P', "probe", NULL,
+       OPT_CALLBACK('a', "add", NULL,
 #ifdef NO_LIBDWARF
                "p|r:[GRP/]NAME FUNC[+OFFS] [ARG ...]",
 #else
@@ -243,7 +248,7 @@ static const struct option options[] = {
                "\t\tARG:\tProbe argument (local variable name or\n"
 #endif
                "\t\t\tkprobe-tracer argument format is supported.)\n",
-               parse_probepoint),
+               opt_add_probepoint),
        OPT_END()
 };
 
@@ -296,8 +301,11 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
        char buf[MAX_CMDLEN];
 
        argc = parse_options(argc, argv, options, probe_usage,
-               PARSE_OPT_STOP_AT_NON_OPTION);
-       if (argc || session.nr_probe == 0)
+                            PARSE_OPT_STOP_AT_NON_OPTION);
+       for (i = 0; i < argc; i++)
+               parse_probe_event(argv[i]);
+
+       if (session.nr_probe == 0)
                usage_with_options(probe_usage, options);
 
 #ifdef NO_LIBDWARF