| From 9488e25cbecacbcf7a90b4f16720333cd9a8871f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 19 Aug 2024 10:47:20 +0800 |
| Subject: perf sched timehist: Fixed timestamp error when unable to confirm |
| event sched_in time |
| |
| From: Yang Jihong <yangjihong@bytedance.com> |
| |
| [ Upstream commit 39c243411bdb8fb35777adf49ee32549633c4e12 ] |
| |
| If sched_in event for current task is not recorded, sched_in timestamp |
| will be set to end_time of time window interest, causing an error in |
| timestamp show. In this case, we choose to ignore this event. |
| |
| Test scenario: |
| |
| perf[1229608] does not record the first sched_in event, run time and sch delay are both 0 |
| |
| # perf sched timehist |
| Samples of sched_switch event do not have callchains. |
| time cpu task name wait time sch delay run time |
| [tid/pid] (msec) (msec) (msec) |
| --------------- ------ ------------------------------ --------- --------- --------- |
| 2090450.763231 [0000] perf[1229608] 0.000 0.000 0.000 |
| 2090450.763235 [0000] migration/0[15] 0.000 0.001 0.003 |
| 2090450.763263 [0001] perf[1229608] 0.000 0.000 0.000 |
| 2090450.763268 [0001] migration/1[21] 0.000 0.001 0.004 |
| 2090450.763302 [0002] perf[1229608] 0.000 0.000 0.000 |
| 2090450.763309 [0002] migration/2[27] 0.000 0.001 0.007 |
| 2090450.763338 [0003] perf[1229608] 0.000 0.000 0.000 |
| 2090450.763343 [0003] migration/3[33] 0.000 0.001 0.004 |
| |
| Before: |
| |
| arbitrarily specify a time window of interest, timestamp will be set to an incorrect value |
| |
| # perf sched timehist --time 100,200 |
| Samples of sched_switch event do not have callchains. |
| time cpu task name wait time sch delay run time |
| [tid/pid] (msec) (msec) (msec) |
| --------------- ------ ------------------------------ --------- --------- --------- |
| 200.000000 [0000] perf[1229608] 0.000 0.000 0.000 |
| 200.000000 [0001] perf[1229608] 0.000 0.000 0.000 |
| 200.000000 [0002] perf[1229608] 0.000 0.000 0.000 |
| 200.000000 [0003] perf[1229608] 0.000 0.000 0.000 |
| 200.000000 [0004] perf[1229608] 0.000 0.000 0.000 |
| 200.000000 [0005] perf[1229608] 0.000 0.000 0.000 |
| 200.000000 [0006] perf[1229608] 0.000 0.000 0.000 |
| 200.000000 [0007] perf[1229608] 0.000 0.000 0.000 |
| |
| After: |
| |
| # perf sched timehist --time 100,200 |
| Samples of sched_switch event do not have callchains. |
| time cpu task name wait time sch delay run time |
| [tid/pid] (msec) (msec) (msec) |
| --------------- ------ ------------------------------ --------- --------- --------- |
| |
| Fixes: 853b74071110bed3 ("perf sched timehist: Add option to specify time window of interest") |
| Signed-off-by: Yang Jihong <yangjihong@bytedance.com> |
| Acked-by: Namhyung Kim <namhyung@kernel.org> |
| Cc: Adrian Hunter <adrian.hunter@intel.com> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: David Ahern <dsa@cumulusnetworks.com> |
| Cc: Ian Rogers <irogers@google.com> |
| Cc: Ingo Molnar <mingo@redhat.com> |
| Cc: James Clark <james.clark@arm.com> |
| Cc: Jiri Olsa <jolsa@kernel.org> |
| Cc: Kan Liang <kan.liang@linux.intel.com> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Link: https://lore.kernel.org/r/20240819024720.2405244-1-yangjihong@bytedance.com |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/perf/builtin-sched.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c |
| index 1c9e06c1d0089..cf8dc3910ef21 100644 |
| --- a/tools/perf/builtin-sched.c |
| +++ b/tools/perf/builtin-sched.c |
| @@ -2553,9 +2553,12 @@ static int timehist_sched_change_event(struct perf_tool *tool, |
| * - previous sched event is out of window - we are done |
| * - sample time is beyond window user cares about - reset it |
| * to close out stats for time window interest |
| + * - If tprev is 0, that is, sched_in event for current task is |
| + * not recorded, cannot determine whether sched_in event is |
| + * within time window interest - ignore it |
| */ |
| if (ptime->end) { |
| - if (tprev > ptime->end) |
| + if (!tprev || tprev > ptime->end) |
| goto out; |
| |
| if (t > ptime->end) |
| -- |
| 2.43.0 |
| |