diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-09-13 09:44:29 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-09-13 10:22:51 +0200 | 
| commit | 1fc35b29b4098aa3bf9fc9acb4c1615d0b5dd95d (patch) | |
| tree | f4646be85f1f52c5f239ca47930958e85ed119ff /tools/perf/builtin-sched.c | |
| parent | b5fae128e41021889777f8ead810cbd2a8b249fc (diff) | |
perf sched: Implement the 'perf sched record' subcommand
Implement the 'perf sched record' subcommand that adds a
default list of events, turns on raw sampling and system-wide
tracing and passes off the rest of the command to perf record.
This is more convenient than having to specify the events all
the time.
Before:
 $ perf record -a -R -e sched:sched_switch:r -e sched:sched_stat_wait:r -e sched:sched_stat_sleep:r -e sched:sched_stat_iowait:r -e sched:sched_process_exit:r -e sched:sched_process_fork:r -e sched:sched_wakeup:r -e sched:sched_migrate_task:r -c 1 sleep 1
After:
 $ perf sched record -f sleep 1
Also fix an assumption in the event string parser that assumed
that strings passed in can be modified. (In this case they wont
be as they come from a readonly constant section.)
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/builtin-sched.c')
| -rw-r--r-- | tools/perf/builtin-sched.c | 39 | 
1 files changed, 37 insertions, 2 deletions
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index b72544f2b96..ede40c1429a 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -1656,6 +1656,40 @@ static void setup_sorting(void)  	sort_dimension__add((char *)"pid", &cmp_pid);  } +static const char *record_args[] = { +	"record", +	"-a", +	"-R", +	"-c", "1", +	"-e", "sched:sched_switch:r", +	"-e", "sched:sched_stat_wait:r", +	"-e", "sched:sched_stat_sleep:r", +	"-e", "sched:sched_stat_iowait:r", +	"-e", "sched:sched_process_exit:r", +	"-e", "sched:sched_process_fork:r", +	"-e", "sched:sched_wakeup:r", +	"-e", "sched:sched_migrate_task:r", +}; + +static int __cmd_record(int argc, const char **argv) +{ +	unsigned int rec_argc, i, j; +	const char **rec_argv; + +	rec_argc = ARRAY_SIZE(record_args) + argc - 1; +	rec_argv = calloc(rec_argc + 1, sizeof(char *)); + +	for (i = 0; i < ARRAY_SIZE(record_args); i++) +		rec_argv[i] = strdup(record_args[i]); + +	for (j = 1; j < (unsigned int)argc; j++, i++) +		rec_argv[i] = argv[j]; + +	BUG_ON(i != rec_argc); + +	return cmd_record(i, rec_argv, NULL); +} +  int cmd_sched(int argc, const char **argv, const char *prefix __used)  {  	symbol__init(); @@ -1666,7 +1700,9 @@ int cmd_sched(int argc, const char **argv, const char *prefix __used)  	if (!argc)  		usage_with_options(sched_usage, sched_options); -	if (!strncmp(argv[0], "lat", 3)) { +	if (!strncmp(argv[0], "rec", 3)) { +		return __cmd_record(argc, argv); +	} else if (!strncmp(argv[0], "lat", 3)) {  		trace_handler = &lat_ops;  		if (argc > 1) {  			argc = parse_options(argc, argv, latency_options, latency_usage, 0); @@ -1687,6 +1723,5 @@ int cmd_sched(int argc, const char **argv, const char *prefix __used)  		usage_with_options(sched_usage, sched_options);  	} -  	return 0;  }  | 
