Skip to content

Commit b0f0085

Browse files
Yang Jihongacmel
authored andcommitted
perf sched: Fix record failure when CONFIG_SCHEDSTATS is not set
The tracepoints trace_sched_stat_{wait, sleep, iowait} are not exposed to user if CONFIG_SCHEDSTATS is not set, "perf sched record" records the three events. As a result, the command fails. Before: #perf sched record sleep 1 event syntax error: 'sched:sched_stat_wait' \___ unknown tracepoint Error: File /sys/kernel/tracing/events/sched/sched_stat_wait not found. Hint: Perhaps this kernel misses some CONFIG_ setting to enable this feature?. Run 'perf list' for a list of valid events Usage: perf record [<options>] [<command>] or: perf record [<options>] -- <command> [<options>] -e, --event <event> event selector. use 'perf list' to list available events Solution: Check whether schedstat tracepoints are exposed. If no, these events are not recorded. After: # perf sched record sleep 1 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.163 MB perf.data (1091 samples) ] # perf sched report run measurement overhead: 4736 nsecs sleep measurement overhead: 9059979 nsecs the run test took 999854 nsecs the sleep test took 8945271 nsecs nr_run_events: 716 nr_sleep_events: 785 nr_wakeup_events: 0 ... ------------------------------------------------------------ Fixes: 2a09b5d ("sched/fair: do not expose some tracepoints to user if CONFIG_SCHEDSTATS is not set") Signed-off-by: Yang Jihong <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Steven Rostedt (VMware) <[email protected]> Cc: Yafang Shao <[email protected]> Link: http://lore.kernel.org/lkml/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 22a6655 commit b0f0085

File tree

1 file changed

+29
-4
lines changed

1 file changed

+29
-4
lines changed

tools/perf/builtin-sched.c

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3335,6 +3335,16 @@ static void setup_sorting(struct perf_sched *sched, const struct option *options
33353335
sort_dimension__add("pid", &sched->cmp_pid);
33363336
}
33373337

3338+
static bool schedstat_events_exposed(void)
3339+
{
3340+
/*
3341+
* Select "sched:sched_stat_wait" event to check
3342+
* whether schedstat tracepoints are exposed.
3343+
*/
3344+
return IS_ERR(trace_event__tp_format("sched", "sched_stat_wait")) ?
3345+
false : true;
3346+
}
3347+
33383348
static int __cmd_record(int argc, const char **argv)
33393349
{
33403350
unsigned int rec_argc, i, j;
@@ -3346,21 +3356,33 @@ static int __cmd_record(int argc, const char **argv)
33463356
"-m", "1024",
33473357
"-c", "1",
33483358
"-e", "sched:sched_switch",
3349-
"-e", "sched:sched_stat_wait",
3350-
"-e", "sched:sched_stat_sleep",
3351-
"-e", "sched:sched_stat_iowait",
33523359
"-e", "sched:sched_stat_runtime",
33533360
"-e", "sched:sched_process_fork",
33543361
"-e", "sched:sched_wakeup_new",
33553362
"-e", "sched:sched_migrate_task",
33563363
};
3364+
3365+
/*
3366+
* The tracepoints trace_sched_stat_{wait, sleep, iowait}
3367+
* are not exposed to user if CONFIG_SCHEDSTATS is not set,
3368+
* to prevent "perf sched record" execution failure, determine
3369+
* whether to record schedstat events according to actual situation.
3370+
*/
3371+
const char * const schedstat_args[] = {
3372+
"-e", "sched:sched_stat_wait",
3373+
"-e", "sched:sched_stat_sleep",
3374+
"-e", "sched:sched_stat_iowait",
3375+
};
3376+
unsigned int schedstat_argc = schedstat_events_exposed() ?
3377+
ARRAY_SIZE(schedstat_args) : 0;
3378+
33573379
struct tep_event *waking_event;
33583380

33593381
/*
33603382
* +2 for either "-e", "sched:sched_wakeup" or
33613383
* "-e", "sched:sched_waking"
33623384
*/
3363-
rec_argc = ARRAY_SIZE(record_args) + 2 + argc - 1;
3385+
rec_argc = ARRAY_SIZE(record_args) + 2 + schedstat_argc + argc - 1;
33643386
rec_argv = calloc(rec_argc + 1, sizeof(char *));
33653387

33663388
if (rec_argv == NULL)
@@ -3376,6 +3398,9 @@ static int __cmd_record(int argc, const char **argv)
33763398
else
33773399
rec_argv[i++] = strdup("sched:sched_wakeup");
33783400

3401+
for (j = 0; j < schedstat_argc; j++)
3402+
rec_argv[i++] = strdup(schedstat_args[j]);
3403+
33793404
for (j = 1; j < (unsigned int)argc; j++, i++)
33803405
rec_argv[i] = argv[j];
33813406

0 commit comments

Comments
 (0)