diff options
Diffstat (limited to 'tools/perf/builtin-sched.c')
| -rw-r--r-- | tools/perf/builtin-sched.c | 35 | 
1 files changed, 30 insertions, 5 deletions
| diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 954ce2f594e9..1ff10d4bccf3 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -670,7 +670,7 @@ static void create_tasks(struct perf_sched *sched)  	err = pthread_attr_init(&attr);  	BUG_ON(err);  	err = pthread_attr_setstacksize(&attr, -			(size_t) max(16 * 1024, PTHREAD_STACK_MIN)); +			(size_t) max(16 * 1024, (int)PTHREAD_STACK_MIN));  	BUG_ON(err);  	err = pthread_mutex_lock(&sched->start_work_mutex);  	BUG_ON(err); @@ -3335,6 +3335,16 @@ static void setup_sorting(struct perf_sched *sched, const struct option *options  	sort_dimension__add("pid", &sched->cmp_pid);  } +static bool schedstat_events_exposed(void) +{ +	/* +	 * Select "sched:sched_stat_wait" event to check +	 * whether schedstat tracepoints are exposed. +	 */ +	return IS_ERR(trace_event__tp_format("sched", "sched_stat_wait")) ? +		false : true; +} +  static int __cmd_record(int argc, const char **argv)  {  	unsigned int rec_argc, i, j; @@ -3346,21 +3356,33 @@ static int __cmd_record(int argc, const char **argv)  		"-m", "1024",  		"-c", "1",  		"-e", "sched:sched_switch", -		"-e", "sched:sched_stat_wait", -		"-e", "sched:sched_stat_sleep", -		"-e", "sched:sched_stat_iowait",  		"-e", "sched:sched_stat_runtime",  		"-e", "sched:sched_process_fork",  		"-e", "sched:sched_wakeup_new",  		"-e", "sched:sched_migrate_task",  	}; + +	/* +	 * The tracepoints trace_sched_stat_{wait, sleep, iowait} +	 * are not exposed to user if CONFIG_SCHEDSTATS is not set, +	 * to prevent "perf sched record" execution failure, determine +	 * whether to record schedstat events according to actual situation. +	 */ +	const char * const schedstat_args[] = { +		"-e", "sched:sched_stat_wait", +		"-e", "sched:sched_stat_sleep", +		"-e", "sched:sched_stat_iowait", +	}; +	unsigned int schedstat_argc = schedstat_events_exposed() ? +		ARRAY_SIZE(schedstat_args) : 0; +  	struct tep_event *waking_event;  	/*  	 * +2 for either "-e", "sched:sched_wakeup" or  	 * "-e", "sched:sched_waking"  	 */ -	rec_argc = ARRAY_SIZE(record_args) + 2 + argc - 1; +	rec_argc = ARRAY_SIZE(record_args) + 2 + schedstat_argc + argc - 1;  	rec_argv = calloc(rec_argc + 1, sizeof(char *));  	if (rec_argv == NULL) @@ -3376,6 +3398,9 @@ static int __cmd_record(int argc, const char **argv)  	else  		rec_argv[i++] = strdup("sched:sched_wakeup"); +	for (j = 0; j < schedstat_argc; j++) +		rec_argv[i++] = strdup(schedstat_args[j]); +  	for (j = 1; j < (unsigned int)argc; j++, i++)  		rec_argv[i] = argv[j]; |