From 2cb8fe26d33ad78f0be19dcb4ba3222a141f4efd Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 5 Jun 2025 13:41:18 +0000 Subject: [PATCH] Revert "perf: Avoid the read if the count is already updated" This reverts commit 948664b92e5712b07526e5559a2ae429c747a667 which is commit 8ce939a0fa194939cc1f92dbd8bc1a7806e7d40a upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I3554a243dacf11dd19e3e0b1f44c71dfe103e69a Signed-off-by: Greg Kroah-Hartman --- include/linux/perf_event.h | 8 +------- kernel/events/core.c | 33 +++++++++++++++++---------------- kernel/events/ring_buffer.c | 1 - 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index b10e3702f365..acaf7486c840 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -1016,13 +1016,7 @@ struct perf_output_handle { struct perf_buffer *rb; unsigned long wakeup; unsigned long size; - union { - u64 flags; /* perf_output*() */ - u64 aux_flags; /* perf_aux_output*() */ - struct { - u64 skip_read : 1; - }; - }; + u64 aux_flags; union { void *addr; unsigned long head; diff --git a/kernel/events/core.c b/kernel/events/core.c index 733a953c9d1a..0f7964bbc786 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -1164,12 +1164,6 @@ static void perf_assert_pmu_disabled(struct pmu *pmu) WARN_ON_ONCE(*this_cpu_ptr(pmu->pmu_disable_count) == 0); } -static inline void perf_pmu_read(struct perf_event *event) -{ - if (event->state == PERF_EVENT_STATE_ACTIVE) - event->pmu->read(event); -} - static void get_ctx(struct perf_event_context *ctx) { refcount_inc(&ctx->refcount); @@ -3404,7 +3398,8 @@ static void __perf_event_sync_stat(struct perf_event *event, * we know the event must be on the current CPU, therefore we * don't need to use it. */ - perf_pmu_read(event); + if (event->state == PERF_EVENT_STATE_ACTIVE) + event->pmu->read(event); perf_event_update_time(event); @@ -4532,8 +4527,15 @@ static void __perf_event_read(void *info) pmu->read(event); - for_each_sibling_event(sub, event) - perf_pmu_read(sub); + for_each_sibling_event(sub, event) { + if (sub->state == PERF_EVENT_STATE_ACTIVE) { + /* + * Use sibling's PMU rather than @event's since + * sibling could be on different (eg: software) PMU. + */ + sub->pmu->read(sub); + } + } data->ret = pmu->commit_txn(pmu); @@ -7249,8 +7251,9 @@ static void perf_output_read_group(struct perf_output_handle *handle, if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) values[n++] = running; - if ((leader != event) && !handle->skip_read) - perf_pmu_read(leader); + if ((leader != event) && + (leader->state == PERF_EVENT_STATE_ACTIVE)) + leader->pmu->read(leader); values[n++] = perf_event_count(leader); if (read_format & PERF_FORMAT_ID) @@ -7263,8 +7266,9 @@ static void perf_output_read_group(struct perf_output_handle *handle, for_each_sibling_event(sub, leader) { n = 0; - if ((sub != event) && !handle->skip_read) - perf_pmu_read(sub); + if ((sub != event) && + (sub->state == PERF_EVENT_STATE_ACTIVE)) + sub->pmu->read(sub); values[n++] = perf_event_count(sub); if (read_format & PERF_FORMAT_ID) @@ -7319,9 +7323,6 @@ void perf_output_sample(struct perf_output_handle *handle, { u64 sample_type = data->type; - if (data->sample_flags & PERF_SAMPLE_READ) - handle->skip_read = 1; - perf_output_put(handle, *header); if (sample_type & PERF_SAMPLE_IDENTIFIER) diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c index b5257ac35ab4..e2b84e2b4fdc 100644 --- a/kernel/events/ring_buffer.c +++ b/kernel/events/ring_buffer.c @@ -181,7 +181,6 @@ __perf_output_begin(struct perf_output_handle *handle, handle->rb = rb; handle->event = event; - handle->flags = 0; have_lost = local_read(&rb->lost); if (unlikely(have_lost)) {