diff options
author | Tom Zanussi <tzanussi@gmail.com> | 2009-12-15 03:53:35 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-12-15 04:31:31 -0500 |
commit | 586bc5cce88be993dad584c3936c49f945368551 (patch) | |
tree | f335951b59c1106918ced48a6e1242e131808225 /tools | |
parent | c249a4ce796b30b742bb4854bf3039ced12ef8e5 (diff) |
perf trace/scripting: Add support for script args
One oversight of the original scripting_ops patch was a lack of
support for passing args to handler scripts. This adds
argc/argv to the start_script() scripting_op, and changes the
rw-by-file script to take 'comm' arg rather than the 'perf'
value currently hard-coded. It also takes the opportunity to do
some related minor cleanup.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
Cc: fweisbec@gmail.com
Cc: rostedt@goodmis.org
LKML-Reference: <1260867220-15699-2-git-send-email-tzanussi@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/builtin-trace.c | 19 | ||||
-rw-r--r-- | tools/perf/scripts/perl/bin/rw-by-file-report | 2 | ||||
-rw-r--r-- | tools/perf/scripts/perl/rw-by-file.pl | 5 | ||||
-rw-r--r-- | tools/perf/util/trace-event-perl.c | 36 | ||||
-rw-r--r-- | tools/perf/util/trace-event.h | 2 |
5 files changed, 38 insertions, 26 deletions
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 07da66511bd..88b0353d401 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
@@ -12,7 +12,9 @@ | |||
12 | static char const *script_name; | 12 | static char const *script_name; |
13 | static char const *generate_script_lang; | 13 | static char const *generate_script_lang; |
14 | 14 | ||
15 | static int default_start_script(const char *script __attribute((unused))) | 15 | static int default_start_script(const char *script __unused, |
16 | int argc __unused, | ||
17 | const char **argv __unused) | ||
16 | { | 18 | { |
17 | return 0; | 19 | return 0; |
18 | } | 20 | } |
@@ -22,7 +24,7 @@ static int default_stop_script(void) | |||
22 | return 0; | 24 | return 0; |
23 | } | 25 | } |
24 | 26 | ||
25 | static int default_generate_script(const char *outfile __attribute ((unused))) | 27 | static int default_generate_script(const char *outfile __unused) |
26 | { | 28 | { |
27 | return 0; | 29 | return 0; |
28 | } | 30 | } |
@@ -302,15 +304,8 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) | |||
302 | 304 | ||
303 | setup_scripting(); | 305 | setup_scripting(); |
304 | 306 | ||
305 | argc = parse_options(argc, argv, options, annotate_usage, 0); | 307 | argc = parse_options(argc, argv, options, annotate_usage, |
306 | if (argc) { | 308 | PARSE_OPT_STOP_AT_NON_OPTION); |
307 | /* | ||
308 | * Special case: if there's an argument left then assume tha | ||
309 | * it's a symbol filter: | ||
310 | */ | ||
311 | if (argc > 1) | ||
312 | usage_with_options(annotate_usage, options); | ||
313 | } | ||
314 | 309 | ||
315 | setup_pager(); | 310 | setup_pager(); |
316 | 311 | ||
@@ -350,7 +345,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) | |||
350 | } | 345 | } |
351 | 346 | ||
352 | if (script_name) { | 347 | if (script_name) { |
353 | err = scripting_ops->start_script(script_name); | 348 | err = scripting_ops->start_script(script_name, argc, argv); |
354 | if (err) | 349 | if (err) |
355 | goto out; | 350 | goto out; |
356 | } | 351 | } |
diff --git a/tools/perf/scripts/perl/bin/rw-by-file-report b/tools/perf/scripts/perl/bin/rw-by-file-report index f5dcf9cb5bd..1c0567516ab 100644 --- a/tools/perf/scripts/perl/bin/rw-by-file-report +++ b/tools/perf/scripts/perl/bin/rw-by-file-report | |||
@@ -1,5 +1,5 @@ | |||
1 | #!/bin/bash | 1 | #!/bin/bash |
2 | perf trace -s ~/libexec/perf-core/scripts/perl/rw-by-file.pl | 2 | perf trace -s ~/libexec/perf-core/scripts/perl/rw-by-file.pl $1 |
3 | 3 | ||
4 | 4 | ||
5 | 5 | ||
diff --git a/tools/perf/scripts/perl/rw-by-file.pl b/tools/perf/scripts/perl/rw-by-file.pl index 61f91561d84..2a39097687b 100644 --- a/tools/perf/scripts/perl/rw-by-file.pl +++ b/tools/perf/scripts/perl/rw-by-file.pl | |||
@@ -18,8 +18,9 @@ use lib "./Perf-Trace-Util/lib"; | |||
18 | use Perf::Trace::Core; | 18 | use Perf::Trace::Core; |
19 | use Perf::Trace::Util; | 19 | use Perf::Trace::Util; |
20 | 20 | ||
21 | # change this to the comm of the program you're interested in | 21 | my $usage = "perf trace -s rw-by-file.pl <comm>\n"; |
22 | my $for_comm = "perf"; | 22 | |
23 | my $for_comm = shift or die $usage; | ||
23 | 24 | ||
24 | my %reads; | 25 | my %reads; |
25 | my %writes; | 26 | my %writes; |
diff --git a/tools/perf/util/trace-event-perl.c b/tools/perf/util/trace-event-perl.c index a5ffe60db5d..6f10e760245 100644 --- a/tools/perf/util/trace-event-perl.c +++ b/tools/perf/util/trace-event-perl.c | |||
@@ -267,7 +267,7 @@ int common_lock_depth(struct scripting_context *context) | |||
267 | } | 267 | } |
268 | 268 | ||
269 | static void perl_process_event(int cpu, void *data, | 269 | static void perl_process_event(int cpu, void *data, |
270 | int size __attribute((unused)), | 270 | int size __unused, |
271 | unsigned long long nsecs, char *comm) | 271 | unsigned long long nsecs, char *comm) |
272 | { | 272 | { |
273 | struct format_field *field; | 273 | struct format_field *field; |
@@ -359,28 +359,42 @@ static void run_start_sub(void) | |||
359 | /* | 359 | /* |
360 | * Start trace script | 360 | * Start trace script |
361 | */ | 361 | */ |
362 | static int perl_start_script(const char *script) | 362 | static int perl_start_script(const char *script, int argc, const char **argv) |
363 | { | 363 | { |
364 | const char *command_line[2] = { "", NULL }; | 364 | const char **command_line; |
365 | int i, err = 0; | ||
365 | 366 | ||
367 | command_line = malloc((argc + 2) * sizeof(const char *)); | ||
368 | command_line[0] = ""; | ||
366 | command_line[1] = script; | 369 | command_line[1] = script; |
370 | for (i = 2; i < argc + 2; i++) | ||
371 | command_line[i] = argv[i - 2]; | ||
367 | 372 | ||
368 | my_perl = perl_alloc(); | 373 | my_perl = perl_alloc(); |
369 | perl_construct(my_perl); | 374 | perl_construct(my_perl); |
370 | 375 | ||
371 | if (perl_parse(my_perl, xs_init, 2, (char **)command_line, | 376 | if (perl_parse(my_perl, xs_init, argc + 2, (char **)command_line, |
372 | (char **)NULL)) | 377 | (char **)NULL)) { |
373 | return -1; | 378 | err = -1; |
379 | goto error; | ||
380 | } | ||
374 | 381 | ||
375 | perl_run(my_perl); | 382 | perl_run(my_perl); |
376 | if (SvTRUE(ERRSV)) | 383 | if (SvTRUE(ERRSV)) { |
377 | return -1; | 384 | err = -1; |
385 | goto error; | ||
386 | } | ||
378 | 387 | ||
379 | run_start_sub(); | 388 | run_start_sub(); |
380 | 389 | ||
390 | free(command_line); | ||
381 | fprintf(stderr, "perf trace started with Perl script %s\n\n", script); | 391 | fprintf(stderr, "perf trace started with Perl script %s\n\n", script); |
382 | |||
383 | return 0; | 392 | return 0; |
393 | error: | ||
394 | perl_free(my_perl); | ||
395 | free(command_line); | ||
396 | |||
397 | return err; | ||
384 | } | 398 | } |
385 | 399 | ||
386 | /* | 400 | /* |
@@ -579,7 +593,9 @@ static void print_unsupported_msg(void) | |||
579 | "\n etc.\n"); | 593 | "\n etc.\n"); |
580 | } | 594 | } |
581 | 595 | ||
582 | static int perl_start_script_unsupported(const char *script __unused) | 596 | static int perl_start_script_unsupported(const char *script __unused, |
597 | int argc __unused, | ||
598 | const char **argv __unused) | ||
583 | { | 599 | { |
584 | print_unsupported_msg(); | 600 | print_unsupported_msg(); |
585 | 601 | ||
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h index 81698d5e650..6ad405620c9 100644 --- a/tools/perf/util/trace-event.h +++ b/tools/perf/util/trace-event.h | |||
@@ -270,7 +270,7 @@ enum trace_flag_type { | |||
270 | 270 | ||
271 | struct scripting_ops { | 271 | struct scripting_ops { |
272 | const char *name; | 272 | const char *name; |
273 | int (*start_script) (const char *); | 273 | int (*start_script) (const char *script, int argc, const char **argv); |
274 | int (*stop_script) (void); | 274 | int (*stop_script) (void); |
275 | void (*process_event) (int cpu, void *data, int size, | 275 | void (*process_event) (int cpu, void *data, int size, |
276 | unsigned long long nsecs, char *comm); | 276 | unsigned long long nsecs, char *comm); |