Skip to content

Commit 9b3a48b

Browse files
Yang Jihongacmel
authored andcommitted
perf sched timehist: Add --prio option
The --prio option is used to only show events for the given task priority(ies). The default is to show events for all priority tasks, which is consistent with the previous behavior. Testcase: # perf sched record nice -n 9 perf bench sched messaging -l 10000 # Running 'sched/messaging' benchmark: # 20 sender and receiver processes per group # 10 groups == 400 processes run Total time: 3.435 [sec] [ perf record: Woken up 270 times to write data ] [ perf record: Captured and wrote 618.688 MB perf.data (5729036 samples) ] # perf sched timehist -h Usage: perf sched timehist [<options>] -C, --cpu <cpu> list of cpus to profile -D, --dump-raw-trace dump raw trace in ASCII -f, --force don't complain, do it -g, --call-graph Display call chains if present (default on) -I, --idle-hist Show idle events only -i, --input <file> input file name -k, --vmlinux <file> vmlinux pathname -M, --migrations Show migration events -n, --next Show next task -p, --pid <pid[,pid...]> analyze events only for given process id(s) -s, --summary Show only syscall summary with statistics -S, --with-summary Show all syscalls and summary with statistics -t, --tid <tid[,tid...]> analyze events only for given thread id(s) -V, --cpu-visual Add CPU visual -v, --verbose be more verbose (show symbol address, etc) -w, --wakeups Show wakeup events --kallsyms <file> kallsyms pathname --max-stack <n> Maximum number of functions to display backtrace. --prio <prio> analyze events only for given task priority(ies) --show-prio Show task priority --state Show task state when sched-out --symfs <directory> Look for files with symbols relative to this directory --time <str> Time span for analysis (start,stop) # perf sched timehist --prio 140 Samples of sched_switch event do not have callchains. Invalid prio string # perf sched timehist --show-prio --prio 129 Samples of sched_switch event do not have callchains. time cpu task name prio wait time sch delay run time [tid/pid] (msec) (msec) (msec) --------------- ------ ------------------------------ -------- --------- --------- --------- 2090450.765421 [0002] sched-messaging[1229618] 129 0.000 0.000 0.029 2090450.765445 [0007] sched-messaging[1229616] 129 0.000 0.062 0.043 2090450.765448 [0014] sched-messaging[1229619] 129 0.000 0.000 0.032 2090450.765478 [0013] sched-messaging[1229617] 129 0.000 0.065 0.048 2090450.765503 [0014] sched-messaging[1229622] 129 0.000 0.000 0.017 2090450.765550 [0002] sched-messaging[1229624] 129 0.000 0.000 0.021 2090450.765562 [0007] sched-messaging[1229621] 129 0.000 0.071 0.028 2090450.765570 [0005] sched-messaging[1229620] 129 0.000 0.064 0.066 2090450.765583 [0001] sched-messaging[1229625] 129 0.000 0.001 0.031 2090450.765595 [0013] sched-messaging[1229623] 129 0.000 0.060 0.028 2090450.765637 [0014] sched-messaging[1229628] 129 0.000 0.000 0.019 2090450.765665 [0007] sched-messaging[1229627] 129 0.000 0.038 0.030 <SNIP> # perf sched timehist --show-prio --prio 0,120-129 Samples of sched_switch event do not have callchains. time cpu task name prio wait time sch delay run time [tid/pid] (msec) (msec) (msec) --------------- ------ ------------------------------ -------- --------- --------- --------- 2090450.763231 [0000] perf[1229608] 120 0.000 0.000 0.000 2090450.763235 [0000] migration/0[15] 0 0.000 0.001 0.003 2090450.763263 [0001] perf[1229608] 120 0.000 0.000 0.000 2090450.763268 [0001] migration/1[21] 0 0.000 0.001 0.004 2090450.763302 [0002] perf[1229608] 120 0.000 0.000 0.000 2090450.763309 [0002] migration/2[27] 0 0.000 0.001 0.007 2090450.763338 [0003] perf[1229608] 120 0.000 0.000 0.000 2090450.763343 [0003] migration/3[33] 0 0.000 0.001 0.004 2090450.763459 [0004] perf[1229608] 120 0.000 0.000 0.000 2090450.763469 [0004] migration/4[39] 0 0.000 0.002 0.010 2090450.763496 [0005] perf[1229608] 120 0.000 0.000 0.000 2090450.763501 [0005] migration/5[45] 0 0.000 0.001 0.004 2090450.763613 [0006] perf[1229608] 120 0.000 0.000 0.000 2090450.763622 [0006] migration/6[51] 0 0.000 0.001 0.008 2090450.763652 [0007] perf[1229608] 120 0.000 0.000 0.000 2090450.763660 [0007] migration/7[57] 0 0.000 0.001 0.008 <SNIP> 2090450.765665 [0001] <idle> 120 0.031 0.031 0.081 2090450.765665 [0007] sched-messaging[1229627] 129 0.000 0.038 0.030 2090450.765667 [0000] s1-perf[8235/7168] 120 0.008 0.000 0.004 2090450.765684 [0013] <idle> 120 0.028 0.028 0.088 2090450.765685 [0001] sched-messaging[1229630] 129 0.000 0.001 0.020 2090450.765688 [0000] <idle> 120 0.004 0.004 0.020 2090450.765689 [0002] <idle> 120 0.021 0.021 0.138 2090450.765691 [0005] sched-messaging[1229626] 129 0.000 0.085 0.029 Signed-off-by: Yang Jihong <[email protected]> Acked-by: Namhyung Kim <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Ian Rogers <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: James Clark <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Kan Liang <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Peter Zijlstra <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 3fcd740 commit 9b3a48b

File tree

2 files changed

+79
-1
lines changed

2 files changed

+79
-1
lines changed

tools/perf/Documentation/perf-sched.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,12 @@ OPTIONS for 'perf sched timehist'
215215
--show-prio::
216216
Show task priority.
217217

218+
--prio::
219+
Only show events for given task priority(ies). Multiple priorities can be
220+
provided as a comma-separated list with no spaces: 0,120. Ranges of
221+
priorities are specified with -: 120-129. A combination of both can also be
222+
provided: 0,120-129.
223+
218224
OPTIONS for 'perf sched replay'
219225
------------------------------
220226

tools/perf/builtin-sched.c

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#define COMM_LEN 20
5252
#define SYM_LEN 129
5353
#define MAX_PID 1024000
54+
#define MAX_PRIO 140
5455

5556
static const char *cpu_list;
5657
static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
@@ -234,6 +235,8 @@ struct perf_sched {
234235
struct perf_time_interval ptime;
235236
struct perf_time_interval hist_time;
236237
volatile bool thread_funcs_exit;
238+
const char *prio_str;
239+
DECLARE_BITMAP(prio_bitmap, MAX_PRIO);
237240
};
238241

239242
/* per thread run time data */
@@ -2504,12 +2507,33 @@ static bool timehist_skip_sample(struct perf_sched *sched,
25042507
struct perf_sample *sample)
25052508
{
25062509
bool rc = false;
2510+
int prio = -1;
2511+
struct thread_runtime *tr = NULL;
25072512

25082513
if (thread__is_filtered(thread)) {
25092514
rc = true;
25102515
sched->skipped_samples++;
25112516
}
25122517

2518+
if (sched->prio_str) {
2519+
/*
2520+
* Because priority may be changed during task execution,
2521+
* first read priority from prev sched_in event for current task.
2522+
* If prev sched_in event is not saved, then read priority from
2523+
* current task sched_out event.
2524+
*/
2525+
tr = thread__get_runtime(thread);
2526+
if (tr && tr->prio != -1)
2527+
prio = tr->prio;
2528+
else if (evsel__name_is(evsel, "sched:sched_switch"))
2529+
prio = evsel__intval(evsel, sample, "prev_prio");
2530+
2531+
if (prio != -1 && !test_bit(prio, sched->prio_bitmap)) {
2532+
rc = true;
2533+
sched->skipped_samples++;
2534+
}
2535+
}
2536+
25132537
if (sched->idle_hist) {
25142538
if (!evsel__name_is(evsel, "sched:sched_switch"))
25152539
rc = true;
@@ -2723,7 +2747,7 @@ static int timehist_sched_change_event(const struct perf_tool *tool,
27232747
goto out;
27242748
}
27252749

2726-
if (sched->show_prio)
2750+
if (sched->show_prio || sched->prio_str)
27272751
timehist_update_task_prio(evsel, sample, machine);
27282752

27292753
thread = timehist_get_thread(sched, sample, machine, evsel);
@@ -3143,6 +3167,47 @@ static int timehist_check_attr(struct perf_sched *sched,
31433167
return 0;
31443168
}
31453169

3170+
static int timehist_parse_prio_str(struct perf_sched *sched)
3171+
{
3172+
char *p;
3173+
unsigned long start_prio, end_prio;
3174+
const char *str = sched->prio_str;
3175+
3176+
if (!str)
3177+
return 0;
3178+
3179+
while (isdigit(*str)) {
3180+
p = NULL;
3181+
start_prio = strtoul(str, &p, 0);
3182+
if (start_prio >= MAX_PRIO || (*p != '\0' && *p != ',' && *p != '-'))
3183+
return -1;
3184+
3185+
if (*p == '-') {
3186+
str = ++p;
3187+
p = NULL;
3188+
end_prio = strtoul(str, &p, 0);
3189+
3190+
if (end_prio >= MAX_PRIO || (*p != '\0' && *p != ','))
3191+
return -1;
3192+
3193+
if (end_prio < start_prio)
3194+
return -1;
3195+
} else {
3196+
end_prio = start_prio;
3197+
}
3198+
3199+
for (; start_prio <= end_prio; start_prio++)
3200+
__set_bit(start_prio, sched->prio_bitmap);
3201+
3202+
if (*p)
3203+
++p;
3204+
3205+
str = p;
3206+
}
3207+
3208+
return 0;
3209+
}
3210+
31463211
static int perf_sched__timehist(struct perf_sched *sched)
31473212
{
31483213
struct evsel_str_handler handlers[] = {
@@ -3204,6 +3269,11 @@ static int perf_sched__timehist(struct perf_sched *sched)
32043269
if (timehist_check_attr(sched, evlist) != 0)
32053270
goto out;
32063271

3272+
if (timehist_parse_prio_str(sched) != 0) {
3273+
pr_err("Invalid prio string\n");
3274+
goto out;
3275+
}
3276+
32073277
setup_pager();
32083278

32093279
/* prefer sched_waking if it is captured */
@@ -3761,6 +3831,8 @@ int cmd_sched(int argc, const char **argv)
37613831
"analyze events only for given thread id(s)"),
37623832
OPT_STRING('C', "cpu", &cpu_list, "cpu", "list of cpus to profile"),
37633833
OPT_BOOLEAN(0, "show-prio", &sched.show_prio, "Show task priority"),
3834+
OPT_STRING(0, "prio", &sched.prio_str, "prio",
3835+
"analyze events only for given task priority(ies)"),
37643836
OPT_PARENT(sched_options)
37653837
};
37663838

0 commit comments

Comments
 (0)