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>
This commit is contained in:
@@ -267,7 +267,7 @@ int common_lock_depth(struct scripting_context *context)
|
||||
}
|
||||
|
||||
static void perl_process_event(int cpu, void *data,
|
||||
int size __attribute((unused)),
|
||||
int size __unused,
|
||||
unsigned long long nsecs, char *comm)
|
||||
{
|
||||
struct format_field *field;
|
||||
@@ -359,28 +359,42 @@ static void run_start_sub(void)
|
||||
/*
|
||||
* Start trace script
|
||||
*/
|
||||
static int perl_start_script(const char *script)
|
||||
static int perl_start_script(const char *script, int argc, const char **argv)
|
||||
{
|
||||
const char *command_line[2] = { "", NULL };
|
||||
const char **command_line;
|
||||
int i, err = 0;
|
||||
|
||||
command_line = malloc((argc + 2) * sizeof(const char *));
|
||||
command_line[0] = "";
|
||||
command_line[1] = script;
|
||||
for (i = 2; i < argc + 2; i++)
|
||||
command_line[i] = argv[i - 2];
|
||||
|
||||
my_perl = perl_alloc();
|
||||
perl_construct(my_perl);
|
||||
|
||||
if (perl_parse(my_perl, xs_init, 2, (char **)command_line,
|
||||
(char **)NULL))
|
||||
return -1;
|
||||
if (perl_parse(my_perl, xs_init, argc + 2, (char **)command_line,
|
||||
(char **)NULL)) {
|
||||
err = -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
perl_run(my_perl);
|
||||
if (SvTRUE(ERRSV))
|
||||
return -1;
|
||||
if (SvTRUE(ERRSV)) {
|
||||
err = -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
run_start_sub();
|
||||
|
||||
free(command_line);
|
||||
fprintf(stderr, "perf trace started with Perl script %s\n\n", script);
|
||||
|
||||
return 0;
|
||||
error:
|
||||
perl_free(my_perl);
|
||||
free(command_line);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -579,7 +593,9 @@ static void print_unsupported_msg(void)
|
||||
"\n etc.\n");
|
||||
}
|
||||
|
||||
static int perl_start_script_unsupported(const char *script __unused)
|
||||
static int perl_start_script_unsupported(const char *script __unused,
|
||||
int argc __unused,
|
||||
const char **argv __unused)
|
||||
{
|
||||
print_unsupported_msg();
|
||||
|
||||
|
Reference in New Issue
Block a user