From: Stephane Eranian on
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
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
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
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/