Revert "perf: Avoid the read if the count is already updated"

This reverts commit 948664b92e 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 <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman
2025-06-05 13:41:18 +00:00
parent ae998420ae
commit 2cb8fe26d3
3 changed files with 18 additions and 24 deletions

View File

@@ -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;

View File

@@ -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)

View File

@@ -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)) {