[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20230228192145.2120675-1-song@kernel.org>
Date: Tue, 28 Feb 2023 11:21:45 -0800
From: Song Liu <song@...nel.org>
To: <linux-kernel@...r.kernel.org>
CC: <kernel-team@...a.com>, Song Liu <song@...nel.org>,
Peter Zijlstra <peterz@...radead.org>,
Namhyung Kim <namhyung@...nel.org>
Subject: [PATCH] perf: fix perf_event_context->time
Time readers rely on perf_event_context->[time|timestamp|timeoffset] to get
accurate time_enabled and time_running for an event. The difference between
ctx->timestamp and ctx->time is the among of time when the context is not
enabled. For cpuctx.ctx, time and timestamp should stay the same, however,
it is not the case at the moment. To show this with drgn [1]:
drgn 0.0.22 (using Python 3.8.6, elfutils 0.185, with libkdumpfile)
For help, type help(drgn).
...
>>> ctx = per_cpu_ptr(prog['pmu'].pmu_cpu_context, 0).ctx
>>> ctx.timestamp * 1.0 / ctx.time
(double)1.0385869134111765
>>>
ctx->timestamp is about 4% larger than ctx.time. This issue causes time
read by perf_event_read_local() goes back in some cases.
Fix this by updating the condition for __update_context_time(ctx, false).
Specifically, it should only be called when we enable EVENT_TIME for the
ctx.
[1] drgn: https://github.com/osandov/drgn
Fixes: 09f5e7dc7ad7 ("perf: Fix perf_event_read_local() time")
Cc: Peter Zijlstra (Intel) <peterz@...radead.org>
Cc: Namhyung Kim <namhyung@...nel.org>
Signed-off-by: Song Liu <song@...nel.org>
---
kernel/events/core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 380476a934e8..67478f43e26e 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3872,7 +3872,7 @@ ctx_sched_in(struct perf_event_context *ctx, enum event_type_t event_type)
if (likely(!ctx->nr_events))
return;
- if (is_active ^ EVENT_TIME) {
+ if (!(is_active & EVENT_TIME)) {
/* start ctx time */
__update_context_time(ctx, false);
perf_cgroup_set_timestamp(cpuctx);
--
2.30.2
Powered by blists - more mailing lists