Prev: [PATCH] x86: Wrong /proc/cpuinfo core id on AMD fam_f model_9
Next: rtc/m41t80: use rtc_valid_tm() to check returned tm
From: Stephane Eranian on 12 Aug 2010 17:30 On Thu, Aug 12, 2010 at 7:59 PM, Tom Zanussi <tzanussi(a)gmail.com> wrote: > The perf trace report shell scripts hard-code the exec path of the > scripts into their command-lines, which doesn't work if perf has been > installed somewhere else. > > Instead, perf trace should create the paths at run-time. This patch > does that and removes the hard-coded paths from all the report scripts. > > v2 changes: The first version inadvertantly caused scripts run from > outside the perf exec path to fail e.g. 'perf trace -s test.py'. The > fix is to try the script name without the exec path first, then the > version using the exec path, which restores the expected behavior. > > Reported-by: Stephane Eranian <eranian(a)google.com> > Signed-off-by: Tom Zanussi <tzanussi(a)gmail.com> > --- > tools/perf/builtin-trace.c | 22 ++++++++++++++++--- > tools/perf/scripts/perl/bin/failed-syscalls-report | 2 +- > tools/perf/scripts/perl/bin/rw-by-file-report | 2 +- > tools/perf/scripts/perl/bin/rw-by-pid-report | 2 +- > tools/perf/scripts/perl/bin/rwtop-report | 2 +- > tools/perf/scripts/perl/bin/wakeup-latency-report | 2 +- > tools/perf/scripts/perl/bin/workqueue-stats-report | 2 +- > .../python/bin/failed-syscalls-by-pid-report | 2 +- > .../perf/scripts/python/bin/sched-migration-report | 2 +- > tools/perf/scripts/python/bin/sctop-report | 2 +- > .../python/bin/syscall-counts-by-pid-report | 2 +- > .../perf/scripts/python/bin/syscall-counts-report | 3 +- > 12 files changed, 30 insertions(+), 15 deletions(-) > > diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c > index 40a6a29..88a1883 100644 > --- a/tools/perf/builtin-trace.c > +++ b/tools/perf/builtin-trace.c > @@ -573,6 +573,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) > const char *suffix = NULL; > const char **__argv; > char *script_path; > + struct stat perf_stat; > int i, err; > > if (argc >= 2 && strncmp(argv[1], "rec", strlen("rec")) == 0) { > @@ -689,8 +690,6 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) > return -EINVAL; > > if (generate_script_lang) { > - struct stat perf_stat; > - > int input = open(input_name, O_RDONLY); > if (input < 0) { > perror("failed to open file"); > @@ -719,10 +718,25 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) > } > > if (script_name) { > - err = scripting_ops->start_script(script_name, argc, argv); > + char script_exec_path[MAXPATHLEN]; > + > + snprintf(script_exec_path, MAXPATHLEN, "%s", script_name); > + err = stat(script_exec_path, &perf_stat); Why not simply use access() instead of stat() here? > + if (err < 0) { > + snprintf(script_exec_path, MAXPATHLEN, "%s/scripts/%s", > + perf_exec_path(), script_name); > + err = stat(script_exec_path, &perf_stat); And here? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Stephane Eranian on 12 Aug 2010 17:30 On Thu, Aug 12, 2010 at 8:20 PM, Arnaldo Carvalho de Melo <acme(a)infradead.org> wrote: > Em Thu, Aug 12, 2010 at 12:59:18PM -0500, Tom Zanussi escreveu: >> The perf trace report shell scripts hard-code the exec path of the >> scripts into their command-lines, which doesn't work if perf has been >> installed somewhere else. >> >> Instead, perf trace should create the paths at run-time. This patch >> does that and removes the hard-coded paths from all the report scripts. >> >> v2 changes: The first version inadvertantly caused scripts run from >> outside the perf exec path to fail e.g. 'perf trace -s test.py'. The >> fix is to try the script name without the exec path first, then the >> version using the exec path, which restores the expected behavior. >> >> Reported-by: Stephane Eranian <eranian(a)google.com> >> Signed-off-by: Tom Zanussi <tzanussi(a)gmail.com> > > Stephane, > > Lemme know when you tried this patch so that I can merge it with > a Tested-by: you tag, ok? > Will get back to you tomorrow morning (your time). -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Tom Zanussi on 12 Aug 2010 18:00 On Thu, Aug 12, 2010 at 4:28 PM, Stephane Eranian <eranian(a)google.com> wrote: > On Thu, Aug 12, 2010 at 7:59 PM, Tom Zanussi <tzanussi(a)gmail.com> wrote: >> The perf trace report shell scripts hard-code the exec path of the >> scripts into their command-lines, which doesn't work if perf has been >> installed somewhere else. >> >> Instead, perf trace should create the paths at run-time. �This patch >> does that and removes the hard-coded paths from all the report scripts. >> >> v2 changes: The first version inadvertantly caused scripts run from >> outside the perf exec path to fail e.g. 'perf trace -s test.py'. �The >> fix is to try the script name without the exec path first, then the >> version using the exec path, which restores the expected behavior. >> >> Reported-by: Stephane Eranian <eranian(a)google.com> >> Signed-off-by: Tom Zanussi <tzanussi(a)gmail.com> >> --- >> �tools/perf/builtin-trace.c � � � � � � � � � � � � | � 22 ++++++++++++++++--- >> �tools/perf/scripts/perl/bin/failed-syscalls-report | � �2 +- >> �tools/perf/scripts/perl/bin/rw-by-file-report � � �| � �2 +- >> �tools/perf/scripts/perl/bin/rw-by-pid-report � � � | � �2 +- >> �tools/perf/scripts/perl/bin/rwtop-report � � � � � | � �2 +- >> �tools/perf/scripts/perl/bin/wakeup-latency-report �| � �2 +- >> �tools/perf/scripts/perl/bin/workqueue-stats-report | � �2 +- >> �.../python/bin/failed-syscalls-by-pid-report � � � | � �2 +- >> �.../perf/scripts/python/bin/sched-migration-report | � �2 +- >> �tools/perf/scripts/python/bin/sctop-report � � � � | � �2 +- >> �.../python/bin/syscall-counts-by-pid-report � � � �| � �2 +- >> �.../perf/scripts/python/bin/syscall-counts-report �| � �3 +- >> �12 files changed, 30 insertions(+), 15 deletions(-) >> >> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c >> index 40a6a29..88a1883 100644 >> --- a/tools/perf/builtin-trace.c >> +++ b/tools/perf/builtin-trace.c >> @@ -573,6 +573,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) >> � � � �const char *suffix = NULL; >> � � � �const char **__argv; >> � � � �char *script_path; >> + � � � struct stat perf_stat; >> � � � �int i, err; >> >> � � � �if (argc >= 2 && strncmp(argv[1], "rec", strlen("rec")) == 0) { >> @@ -689,8 +690,6 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) >> � � � � � � � �return -EINVAL; >> >> � � � �if (generate_script_lang) { >> - � � � � � � � struct stat perf_stat; >> - >> � � � � � � � �int input = open(input_name, O_RDONLY); >> � � � � � � � �if (input < 0) { >> � � � � � � � � � � � �perror("failed to open file"); >> @@ -719,10 +718,25 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) >> � � � �} >> >> � � � �if (script_name) { >> - � � � � � � � err = scripting_ops->start_script(script_name, argc, argv); >> + � � � � � � � char script_exec_path[MAXPATHLEN]; >> + >> + � � � � � � � snprintf(script_exec_path, MAXPATHLEN, "%s", script_name); >> + � � � � � � � err = stat(script_exec_path, &perf_stat); > > Why not simply use access() instead of stat() here? Yeah, that would probably be better - if this patch works for you, I can submit a follow-on patch to do that along with some other small patches I'm hoping to get to over the weekend... Thanks, Tom -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Stephane Eranian on 13 Aug 2010 04:40
Tom, Here is version that works for me. Besides the stat() to access() change, I fixed the pathname you were building, it was missing the language name. The way I solved that is by leveraging the scripting_ops->name field, but for that I had to make sure it would match the subdir name, i.e., all lower-case. I also add an error message when the script is not found, so users understand what went wrong without turning on any sort of debugging. Reported-by: Stephane Eranian <eranian(a)google.com> Signed-off-by: Tom Zanussi <tzanussi(a)gmail.com> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 40a6a29..db1d950 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -719,10 +719,29 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) } if (script_name) { - err = scripting_ops->start_script(script_name, argc, argv); + char script_exec_path[MAXPATHLEN]; + + snprintf(script_exec_path, MAXPATHLEN, "%s", script_name); + + if (access(script_exec_path, R_OK)) { + + snprintf(script_exec_path, MAXPATHLEN, "%s/scripts/%s/%s", + perf_exec_path(), scripting_ops->name, script_name); + + err = access(script_exec_path, R_OK); + if (err) { + fprintf(stderr, "script %s not found\n", script_name); + goto out; + } + } + + err = scripting_ops->start_script(script_exec_path, + argc, argv); if (err) goto out; - pr_debug("perf trace started with script %s\n\n", script_name); + + pr_debug("perf trace started with script %s\n\n", + script_exec_path); } err = __cmd_trace(session); diff --git a/tools/perf/scripts/perl/bin/failed-syscalls-report b/tools/perf/scripts/perl/bin/failed-syscalls-report index e3a5e55..47cf0b7 100644 --- a/tools/perf/scripts/perl/bin/failed-syscalls-report +++ b/tools/perf/scripts/perl/bin/failed-syscalls-report @@ -7,4 +7,4 @@ if [ $# -gt 0 ] ; then shift fi fi -perf trace $@ -s ~/libexec/perf-core/scripts/perl/failed-syscalls.pl $comm +perf trace $@ -s perl/failed-syscalls.pl $comm diff --git a/tools/perf/scripts/perl/bin/rw-by-file-report b/tools/perf/scripts/perl/bin/rw-by-file-report index d83070b..407ec70 100644 --- a/tools/perf/scripts/perl/bin/rw-by-file-report +++ b/tools/perf/scripts/perl/bin/rw-by-file-report @@ -7,7 +7,7 @@ if [ $# -lt 1 ] ; then fi comm=$1 shift -perf trace $@ -s ~/libexec/perf-core/scripts/perl/rw-by-file.pl $comm +perf trace $@ -s perl/rw-by-file.pl $comm diff --git a/tools/perf/scripts/perl/bin/rw-by-pid-report b/tools/perf/scripts/perl/bin/rw-by-pid-report index 7ef4698..0c129e1 100644 --- a/tools/perf/scripts/perl/bin/rw-by-pid-report +++ b/tools/perf/scripts/perl/bin/rw-by-pid-report @@ -1,6 +1,6 @@ #!/bin/bash # description: system-wide r/w activity -perf trace $@ -s ~/libexec/perf-core/scripts/perl/rw-by-pid.pl +perf trace $@ -s perl/rw-by-pid.pl diff --git a/tools/perf/scripts/perl/bin/rwtop-report b/tools/perf/scripts/perl/bin/rwtop-report index 93e698c..5bac5bb 100644 --- a/tools/perf/scripts/perl/bin/rwtop-report +++ b/tools/perf/scripts/perl/bin/rwtop-report @@ -17,7 +17,7 @@ if [ "$n_args" -gt 0 ] ; then interval=$1 shift fi -perf trace $@ -s ~/libexec/perf-core/scripts/perl/rwtop.pl $interval +perf trace $@ -s perl/rwtop.pl $interval diff --git a/tools/perf/scripts/perl/bin/wakeup-latency-report b/tools/perf/scripts/perl/bin/wakeup-latency-report index a0d898f..dcfdd05 100644 --- a/tools/perf/scripts/perl/bin/wakeup-latency-report +++ b/tools/perf/scripts/perl/bin/wakeup-latency-report @@ -1,6 +1,6 @@ #!/bin/bash # description: system-wide min/max/avg wakeup latency -perf trace $@ -s ~/libexec/perf-core/scripts/perl/wakeup-latency.pl +perf trace $@ -s perl/wakeup-latency.pl diff --git a/tools/perf/scripts/perl/bin/workqueue-stats-report b/tools/perf/scripts/perl/bin/workqueue-stats-report index 3508113..6ce9247 100644 --- a/tools/perf/scripts/perl/bin/workqueue-stats-report +++ b/tools/perf/scripts/perl/bin/workqueue-stats-report @@ -1,6 +1,6 @@ #!/bin/bash # description: workqueue stats (ins/exe/create/destroy) -perf trace $@ -s ~/libexec/perf-core/scripts/perl/workqueue-stats.pl +perf trace $@ -s perl/workqueue-stats.pl diff --git a/tools/perf/scripts/python/bin/failed-syscalls-by-pid-report b/tools/perf/scripts/python/bin/failed-syscalls-by-pid-report index 3029354..b39182f 100644 --- a/tools/perf/scripts/python/bin/failed-syscalls-by-pid-report +++ b/tools/perf/scripts/python/bin/failed-syscalls-by-pid-report @@ -7,4 +7,4 @@ if [ $# -gt 0 ] ; then shift fi fi -perf trace $@ -s ~/libexec/perf-core/scripts/python/failed-syscalls-by-pid.py $comm +perf trace $@ -s python/failed-syscalls-by-pid.py $comm diff --git a/tools/perf/scripts/python/bin/sched-migration-report b/tools/perf/scripts/python/bin/sched-migration-report index 61d05f7..8299b69 100644 --- a/tools/perf/scripts/python/bin/sched-migration-report +++ b/tools/perf/scripts/python/bin/sched-migration-report @@ -1,3 +1,3 @@ #!/bin/bash # description: sched migration overview -perf trace $@ -s ~/libexec/perf-core/scripts/python/sched-migration.py +perf trace $@ -s python/sched-migration.py diff --git a/tools/perf/scripts/python/bin/sctop-report b/tools/perf/scripts/python/bin/sctop-report index b01c842..9fe812c 100644 --- a/tools/perf/scripts/python/bin/sctop-report +++ b/tools/perf/scripts/python/bin/sctop-report @@ -21,4 +21,4 @@ elif [ "$n_args" -gt 0 ] ; then interval=$1 shift fi -perf trace $@ -s ~/libexec/perf-core/scripts/python/sctop.py $comm $interval +perf trace $@ -s python/sctop.py $comm $interval diff --git a/tools/perf/scripts/python/bin/syscall-counts-by-pid-report b/tools/perf/scripts/python/bin/syscall-counts-by-pid-report index 9e9d8dd..ec9d4d9 100644 --- a/tools/perf/scripts/python/bin/syscall-counts-by-pid-report +++ b/tools/perf/scripts/python/bin/syscall-counts-by-pid-report @@ -7,4 +7,4 @@ if [ $# -gt 0 ] ; then shift fi fi -perf trace $@ -s ~/libexec/perf-core/scripts/python/syscall-counts-by-pid.py $comm +perf trace $@ -s python/syscall-counts-by-pid.py $comm diff --git a/tools/perf/scripts/python/bin/syscall-counts-report b/tools/perf/scripts/python/bin/syscall-counts-report index dc076b6..9ed7854 100644 --- a/tools/perf/scripts/python/bin/syscall-counts-report +++ b/tools/perf/scripts/python/bin/syscall-counts-report @@ -1,3 +1,4 @@ + #!/bin/bash # description: system-wide syscall counts # args: [comm] @@ -7,4 +8,4 @@ if [ $# -gt 0 ] ; then shift fi fi -perf trace $@ -s ~/libexec/perf-core/scripts/python/syscall-counts.py $comm +perf trace $@ -s python/syscall-counts.py $comm diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c index b059dc5..97e8c6d 100644 --- a/tools/perf/util/scripting-engines/trace-event-perl.c +++ b/tools/perf/util/scripting-engines/trace-event-perl.c @@ -557,7 +557,7 @@ static int perl_generate_script(const char *outfile) } struct scripting_ops perl_scripting_ops = { - .name = "Perl", + .name = "perl", .start_script = perl_start_script, .stop_script = perl_stop_script, .process_event = perl_process_event, diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index 33a6325..49655a8 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -586,7 +586,7 @@ static int python_generate_script(const char *outfile) } struct scripting_ops python_scripting_ops = { - .name = "Python", + .name = "python", .start_script = python_start_script, .stop_script = python_stop_script, .process_event = python_process_event, -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |