linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V2] perf script: Find script file relative to exec path
@ 2021-05-22 10:01 Adrian Hunter
  2021-05-23 16:02 ` Jiri Olsa
  0 siblings, 1 reply; 3+ messages in thread
From: Adrian Hunter @ 2021-05-22 10:01 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                   | 43 ++++++++++++++++++-
 .../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, 46 insertions(+), 2 deletions(-)

diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 1280cbfad4db..2a062466c69f 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -2665,6 +2665,37 @@ 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)
+{
+	char path[PATH_MAX];
+
+	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();
+
+		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 +2737,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 +3751,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 +3849,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] 3+ messages in thread

* Re: [PATCH V2] perf script: Find script file relative to exec path
  2021-05-22 10:01 [PATCH V2] perf script: Find script file relative to exec path Adrian Hunter
@ 2021-05-23 16:02 ` Jiri Olsa
  2021-05-24  6:41   ` Adrian Hunter
  0 siblings, 1 reply; 3+ messages in thread
From: Jiri Olsa @ 2021-05-23 16:02 UTC (permalink / raw)
  To: Adrian Hunter; +Cc: Arnaldo Carvalho de Melo, linux-kernel

On Sat, May 22, 2021 at 01:01:51PM +0300, Adrian Hunter wrote:

SNIP

> 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",

looks like typo.. usually means that you run perf way too often ;-)

jirka

>  	.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	[flat|nested] 3+ messages in thread

* Re: [PATCH V2] perf script: Find script file relative to exec path
  2021-05-23 16:02 ` Jiri Olsa
@ 2021-05-24  6:41   ` Adrian Hunter
  0 siblings, 0 replies; 3+ messages in thread
From: Adrian Hunter @ 2021-05-24  6:41 UTC (permalink / raw)
  To: Jiri Olsa; +Cc: Arnaldo Carvalho de Melo, linux-kernel

On 23/05/21 7:02 pm, Jiri Olsa wrote:
> On Sat, May 22, 2021 at 01:01:51PM +0300, Adrian Hunter wrote:
> 
> SNIP
> 
>> 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",
> 
> looks like typo.. usually means that you run perf way too often ;-)

Betrayed by muscle memory! :-)

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-05-24  6:41 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-22 10:01 [PATCH V2] perf script: Find script file relative to exec path Adrian Hunter
2021-05-23 16:02 ` Jiri Olsa
2021-05-24  6:41   ` Adrian Hunter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).