diff options
author | Masami Hiramatsu <mhiramat@redhat.com> | 2009-10-27 16:43:02 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-10-29 03:47:48 -0400 |
commit | 46ab49267d338eb5056d0077e16346509b9e9284 (patch) | |
tree | 5d7e108e3ad8d157e665eac53fa43d50b37f2428 /tools/perf/builtin-probe.c | |
parent | 8030c5f5a57e018fcdeb1f395d7adc123b48ced6 (diff) |
perf/probes: Improve command-line option of perf-probe
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>
Diffstat (limited to 'tools/perf/builtin-probe.c')
-rw-r--r-- | tools/perf/builtin-probe.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index dcb406c7f82d..3370dabed15d 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c | |||
@@ -65,8 +65,8 @@ static struct { | |||
65 | 65 | ||
66 | #define semantic_error(msg ...) die("Semantic error :" msg) | 66 | #define semantic_error(msg ...) die("Semantic error :" msg) |
67 | 67 | ||
68 | static int parse_probepoint(const struct option *opt __used, | 68 | /* Parse a probe point. Note that any error must die. */ |
69 | const char *str, int unset __used) | 69 | static void parse_probepoint(const char *str) |
70 | { | 70 | { |
71 | char *argv[MAX_PROBE_ARGS + 2]; /* Event + probe + args */ | 71 | char *argv[MAX_PROBE_ARGS + 2]; /* Event + probe + args */ |
72 | int argc, i; | 72 | int argc, i; |
@@ -75,9 +75,6 @@ static int parse_probepoint(const struct option *opt __used, | |||
75 | char **event = &session.events[session.nr_probe]; | 75 | char **event = &session.events[session.nr_probe]; |
76 | int retp = 0; | 76 | int retp = 0; |
77 | 77 | ||
78 | if (!str) /* The end of probe points */ | ||
79 | return 0; | ||
80 | |||
81 | pr_debug("probe-definition(%d): %s\n", session.nr_probe, str); | 78 | pr_debug("probe-definition(%d): %s\n", session.nr_probe, str); |
82 | if (++session.nr_probe == MAX_PROBES) | 79 | if (++session.nr_probe == MAX_PROBES) |
83 | semantic_error("Too many probes"); | 80 | semantic_error("Too many probes"); |
@@ -176,6 +173,13 @@ static int parse_probepoint(const struct option *opt __used, | |||
176 | } | 173 | } |
177 | 174 | ||
178 | pr_debug("%d arguments\n", pp->nr_args); | 175 | pr_debug("%d arguments\n", pp->nr_args); |
176 | } | ||
177 | |||
178 | static int opt_add_probepoint(const struct option *opt __used, | ||
179 | const char *str, int unset __used) | ||
180 | { | ||
181 | if (str) | ||
182 | parse_probepoint(str); | ||
179 | return 0; | 183 | return 0; |
180 | } | 184 | } |
181 | 185 | ||
@@ -211,7 +215,8 @@ static int open_default_vmlinux(void) | |||
211 | #endif | 215 | #endif |
212 | 216 | ||
213 | static const char * const probe_usage[] = { | 217 | static const char * const probe_usage[] = { |
214 | "perf probe [<options>] -P 'PROBEDEF' [-P 'PROBEDEF' ...]", | 218 | "perf probe [<options>] 'PROBEDEF' ['PROBEDEF' ...]", |
219 | "perf probe [<options>] --add 'PROBEDEF' [--add 'PROBEDEF' ...]", | ||
215 | NULL | 220 | NULL |
216 | }; | 221 | }; |
217 | 222 | ||
@@ -222,7 +227,7 @@ static const struct option options[] = { | |||
222 | OPT_STRING('k', "vmlinux", &session.vmlinux, "file", | 227 | OPT_STRING('k', "vmlinux", &session.vmlinux, "file", |
223 | "vmlinux/module pathname"), | 228 | "vmlinux/module pathname"), |
224 | #endif | 229 | #endif |
225 | OPT_CALLBACK('P', "probe", NULL, | 230 | OPT_CALLBACK('a', "add", NULL, |
226 | #ifdef NO_LIBDWARF | 231 | #ifdef NO_LIBDWARF |
227 | "p|r:[GRP/]NAME FUNC[+OFFS] [ARG ...]", | 232 | "p|r:[GRP/]NAME FUNC[+OFFS] [ARG ...]", |
228 | #else | 233 | #else |
@@ -243,7 +248,7 @@ static const struct option options[] = { | |||
243 | "\t\tARG:\tProbe argument (local variable name or\n" | 248 | "\t\tARG:\tProbe argument (local variable name or\n" |
244 | #endif | 249 | #endif |
245 | "\t\t\tkprobe-tracer argument format is supported.)\n", | 250 | "\t\t\tkprobe-tracer argument format is supported.)\n", |
246 | parse_probepoint), | 251 | opt_add_probepoint), |
247 | OPT_END() | 252 | OPT_END() |
248 | }; | 253 | }; |
249 | 254 | ||
@@ -296,8 +301,11 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used) | |||
296 | char buf[MAX_CMDLEN]; | 301 | char buf[MAX_CMDLEN]; |
297 | 302 | ||
298 | argc = parse_options(argc, argv, options, probe_usage, | 303 | argc = parse_options(argc, argv, options, probe_usage, |
299 | PARSE_OPT_STOP_AT_NON_OPTION); | 304 | PARSE_OPT_STOP_AT_NON_OPTION); |
300 | if (argc || session.nr_probe == 0) | 305 | for (i = 0; i < argc; i++) |
306 | parse_probe_event(argv[i]); | ||
307 | |||
308 | if (session.nr_probe == 0) | ||
301 | usage_with_options(probe_usage, options); | 309 | usage_with_options(probe_usage, options); |
302 | 310 | ||
303 | #ifdef NO_LIBDWARF | 311 | #ifdef NO_LIBDWARF |