* [PATCH] perf script: Find script file relative to exec path
@ 2021-05-22 9:50 Adrian Hunter
2021-05-22 9:52 ` Adrian Hunter
0 siblings, 1 reply; 2+ messages in thread
From: Adrian Hunter @ 2021-05-22 9:50 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa; +Cc: linux-kernel
Allow perf script to find a script in the exec path.
Example:
Before:
$ perf record -a -e intel_pt/branch=0/ sleep 0.1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.954 MB perf.data ]
$ perf script intel-pt-events.py 2>&1 | head -3
Error: Couldn't find script `intel-pt-events.py'
See perf script -l for available scripts.
$ perf script -s intel-pt-events.py 2>&1 | head -3
Can't open python script "intel-pt-events.py": No such file or directory
$ perf script ~/libexec/perf-core/scripts/python/intel-pt-events.py 2>&1 | head -3
Error: Couldn't find script `/home/ahunter/libexec/perf-core/scripts/python/intel-pt-events.py'
See perf script -l for available scripts.
$
After:
$ perf script intel-pt-events.py 2>&1 | head -3
Intel PT Power Events and PTWRITE
perf 8123/8123 [000] 551.230753986 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
perf 8123/8123 [001] 551.230808216 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
$ perf script -s intel-pt-events.py 2>&1 | head -3
Intel PT Power Events and PTWRITE
perf 8123/8123 [000] 551.230753986 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
perf 8123/8123 [001] 551.230808216 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
$ perf script ~/libexec/perf-core/scripts/python/intel-pt-events.py 2>&1 | head -3
Intel PT Power Events and PTWRITE
perf 8123/8123 [000] 551.230753986 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
perf 8123/8123 [001] 551.230808216 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
$
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
tools/perf/builtin-script.c | 42 ++++++++++++++++++-
.../util/scripting-engines/trace-event-perl.c | 1 +
.../scripting-engines/trace-event-python.c | 1 +
tools/perf/util/trace-event-scripting.c | 2 +
tools/perf/util/trace-event.h | 1 +
5 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 1280cbfad4db..ec5ea36eaa4e 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -2665,6 +2665,36 @@ static void list_available_languages(void)
fprintf(stderr, "\n");
}
+/* Find script file relative to current directory or exec path */
+static char *find_script(const char *script)
+{
+ if (!scripting_ops) {
+ const char *ext = strrchr(script, '.');
+
+ if (!ext)
+ return NULL;
+
+ scripting_ops = script_spec__lookup(++ext);
+ if (!scripting_ops)
+ return NULL;
+ }
+
+ if (access(script, R_OK)) {
+ char *exec_path = get_argv_exec_path();
+ char path[PATH_MAX];
+
+ if (!exec_path)
+ return NULL;
+ snprintf(path, sizeof(path), "%s/scripts/%s/%s",
+ exec_path, scripting_ops->dirname, script);
+ free(exec_path);
+ script = path;
+ if (access(script, R_OK))
+ return NULL;
+ }
+ return strdup(script);
+}
+
static int parse_scriptname(const struct option *opt __maybe_unused,
const char *str, int unset __maybe_unused)
{
@@ -2706,7 +2736,9 @@ static int parse_scriptname(const struct option *opt __maybe_unused,
}
}
- script_name = strdup(script);
+ script_name = find_script(script);
+ if (!script_name)
+ script_name = strdup(script);
return 0;
}
@@ -3718,6 +3750,12 @@ int cmd_script(int argc, const char **argv)
rep_script_path = get_script_path(argv[0], REPORT_SUFFIX);
if (!rec_script_path && !rep_script_path) {
+ script_name = find_script(argv[0]);
+ if (script_name) {
+ argc -= 1;
+ argv += 1;
+ goto script_found;
+ }
usage_with_options_msg(script_usage, options,
"Couldn't find script `%s'\n\n See perf"
" script -l for available scripts.\n", argv[0]);
@@ -3810,7 +3848,7 @@ int cmd_script(int argc, const char **argv)
free(__argv);
exit(-1);
}
-
+script_found:
if (rec_script_path)
script_path = rec_script_path;
if (rep_script_path)
diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
index 0e608a5ef599..865d310968fb 100644
--- a/tools/perf/util/scripting-engines/trace-event-perl.c
+++ b/tools/perf/util/scripting-engines/trace-event-perl.c
@@ -750,6 +750,7 @@ sub print_backtrace\n\
struct scripting_ops perl_scripting_ops = {
.name = "Perl",
+ .dirname = "perl",
.start_script = perl_start_script,
.flush_script = perl_flush_script,
.stop_script = perl_stop_script,
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 4e4aa4c97ac5..db8f24341406 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -1876,6 +1876,7 @@ static int python_generate_script(struct tep_handle *pevent, const char *outfile
struct scripting_ops python_scripting_ops = {
.name = "Python",
+ .dirname = "python",
.start_script = python_start_script,
.flush_script = python_flush_script,
.stop_script = python_stop_script,
diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c
index 714581b0de65..721f38c0d5cf 100644
--- a/tools/perf/util/trace-event-scripting.c
+++ b/tools/perf/util/trace-event-scripting.c
@@ -63,6 +63,7 @@ static int python_generate_script_unsupported(struct tep_handle *pevent
struct scripting_ops python_scripting_unsupported_ops = {
.name = "Python",
+ .dirname = "python",
.start_script = python_start_script_unsupported,
.flush_script = flush_script_unsupported,
.stop_script = stop_script_unsupported,
@@ -126,6 +127,7 @@ static int perl_generate_script_unsupported(struct tep_handle *pevent
struct scripting_ops perl_scripting_unsupported_ops = {
.name = "Perl",
+ .dirname = "perf",
.start_script = perl_start_script_unsupported,
.flush_script = flush_script_unsupported,
.stop_script = stop_script_unsupported,
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 72fdf2a3577c..39fb39ed6612 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -71,6 +71,7 @@ struct perf_stat_config;
struct scripting_ops {
const char *name;
+ const char *dirname; /* For script path .../scripts/<dirname>/... */
int (*start_script) (const char *script, int argc, const char **argv);
int (*flush_script) (void);
int (*stop_script) (void);
--
2.17.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] perf script: Find script file relative to exec path
2021-05-22 9:50 [PATCH] perf script: Find script file relative to exec path Adrian Hunter
@ 2021-05-22 9:52 ` Adrian Hunter
0 siblings, 0 replies; 2+ messages in thread
From: Adrian Hunter @ 2021-05-22 9:52 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa; +Cc: linux-kernel
On 22/05/21 12:50 pm, Adrian Hunter wrote:
> Allow perf script to find a script in the exec path.
>
> Example:
>
> Before:
>
> $ perf record -a -e intel_pt/branch=0/ sleep 0.1
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.954 MB perf.data ]
> $ perf script intel-pt-events.py 2>&1 | head -3
> Error: Couldn't find script `intel-pt-events.py'
> See perf script -l for available scripts.
> $ perf script -s intel-pt-events.py 2>&1 | head -3
> Can't open python script "intel-pt-events.py": No such file or directory
> $ perf script ~/libexec/perf-core/scripts/python/intel-pt-events.py 2>&1 | head -3
> Error: Couldn't find script `/home/ahunter/libexec/perf-core/scripts/python/intel-pt-events.py'
> See perf script -l for available scripts.
> $
>
> After:
>
> $ perf script intel-pt-events.py 2>&1 | head -3
> Intel PT Power Events and PTWRITE
> perf 8123/8123 [000] 551.230753986 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
> perf 8123/8123 [001] 551.230808216 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
> $ perf script -s intel-pt-events.py 2>&1 | head -3
> Intel PT Power Events and PTWRITE
> perf 8123/8123 [000] 551.230753986 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
> perf 8123/8123 [001] 551.230808216 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
> $ perf script ~/libexec/perf-core/scripts/python/intel-pt-events.py 2>&1 | head -3
> Intel PT Power Events and PTWRITE
> perf 8123/8123 [000] 551.230753986 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
> perf 8123/8123 [001] 551.230808216 cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown])
> $
>
> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
> ---
> tools/perf/builtin-script.c | 42 ++++++++++++++++++-
> .../util/scripting-engines/trace-event-perl.c | 1 +
> .../scripting-engines/trace-event-python.c | 1 +
> tools/perf/util/trace-event-scripting.c | 2 +
> tools/perf/util/trace-event.h | 1 +
> 5 files changed, 45 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> index 1280cbfad4db..ec5ea36eaa4e 100644
> --- a/tools/perf/builtin-script.c
> +++ b/tools/perf/builtin-script.c
> @@ -2665,6 +2665,36 @@ static void list_available_languages(void)
> fprintf(stderr, "\n");
> }
>
> +/* Find script file relative to current directory or exec path */
> +static char *find_script(const char *script)
> +{
> + if (!scripting_ops) {
> + const char *ext = strrchr(script, '.');
> +
> + if (!ext)
> + return NULL;
> +
> + scripting_ops = script_spec__lookup(++ext);
> + if (!scripting_ops)
> + return NULL;
> + }
> +
> + if (access(script, R_OK)) {
> + char *exec_path = get_argv_exec_path();
> + char path[PATH_MAX];
'path' should be declared in the outer scope. I'll send V2
> +
> + if (!exec_path)
> + return NULL;
> + snprintf(path, sizeof(path), "%s/scripts/%s/%s",
> + exec_path, scripting_ops->dirname, script);
> + free(exec_path);
> + script = path;
> + if (access(script, R_OK))
> + return NULL;
> + }
> + return strdup(script);
> +}
> +
> static int parse_scriptname(const struct option *opt __maybe_unused,
> const char *str, int unset __maybe_unused)
> {
> @@ -2706,7 +2736,9 @@ static int parse_scriptname(const struct option *opt __maybe_unused,
> }
> }
>
> - script_name = strdup(script);
> + script_name = find_script(script);
> + if (!script_name)
> + script_name = strdup(script);
>
> return 0;
> }
> @@ -3718,6 +3750,12 @@ int cmd_script(int argc, const char **argv)
> rep_script_path = get_script_path(argv[0], REPORT_SUFFIX);
>
> if (!rec_script_path && !rep_script_path) {
> + script_name = find_script(argv[0]);
> + if (script_name) {
> + argc -= 1;
> + argv += 1;
> + goto script_found;
> + }
> usage_with_options_msg(script_usage, options,
> "Couldn't find script `%s'\n\n See perf"
> " script -l for available scripts.\n", argv[0]);
> @@ -3810,7 +3848,7 @@ int cmd_script(int argc, const char **argv)
> free(__argv);
> exit(-1);
> }
> -
> +script_found:
> if (rec_script_path)
> script_path = rec_script_path;
> if (rep_script_path)
> diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
> index 0e608a5ef599..865d310968fb 100644
> --- a/tools/perf/util/scripting-engines/trace-event-perl.c
> +++ b/tools/perf/util/scripting-engines/trace-event-perl.c
> @@ -750,6 +750,7 @@ sub print_backtrace\n\
>
> struct scripting_ops perl_scripting_ops = {
> .name = "Perl",
> + .dirname = "perl",
> .start_script = perl_start_script,
> .flush_script = perl_flush_script,
> .stop_script = perl_stop_script,
> diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> index 4e4aa4c97ac5..db8f24341406 100644
> --- a/tools/perf/util/scripting-engines/trace-event-python.c
> +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> @@ -1876,6 +1876,7 @@ static int python_generate_script(struct tep_handle *pevent, const char *outfile
>
> struct scripting_ops python_scripting_ops = {
> .name = "Python",
> + .dirname = "python",
> .start_script = python_start_script,
> .flush_script = python_flush_script,
> .stop_script = python_stop_script,
> diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c
> index 714581b0de65..721f38c0d5cf 100644
> --- a/tools/perf/util/trace-event-scripting.c
> +++ b/tools/perf/util/trace-event-scripting.c
> @@ -63,6 +63,7 @@ static int python_generate_script_unsupported(struct tep_handle *pevent
>
> struct scripting_ops python_scripting_unsupported_ops = {
> .name = "Python",
> + .dirname = "python",
> .start_script = python_start_script_unsupported,
> .flush_script = flush_script_unsupported,
> .stop_script = stop_script_unsupported,
> @@ -126,6 +127,7 @@ static int perl_generate_script_unsupported(struct tep_handle *pevent
>
> struct scripting_ops perl_scripting_unsupported_ops = {
> .name = "Perl",
> + .dirname = "perf",
> .start_script = perl_start_script_unsupported,
> .flush_script = flush_script_unsupported,
> .stop_script = stop_script_unsupported,
> diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
> index 72fdf2a3577c..39fb39ed6612 100644
> --- a/tools/perf/util/trace-event.h
> +++ b/tools/perf/util/trace-event.h
> @@ -71,6 +71,7 @@ struct perf_stat_config;
>
> struct scripting_ops {
> const char *name;
> + const char *dirname; /* For script path .../scripts/<dirname>/... */
> int (*start_script) (const char *script, int argc, const char **argv);
> int (*flush_script) (void);
> int (*stop_script) (void);
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-05-22 9:52 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-22 9:50 [PATCH] perf script: Find script file relative to exec path Adrian Hunter
2021-05-22 9:52 ` Adrian Hunter
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.