Skip to content

Commit dda8887

Browse files
committed
Merge tag 'perf-urgent-2025-04-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf event fix from Ingo Molnar: "Fix a perf events time accounting bug" * tag 'perf-urgent-2025-04-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: perf/core: Fix child_total_time_enabled accounting bug at task exit
2 parents 302deb1 + a3c3c66 commit dda8887

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

kernel/events/core.c

+9-9
Original file line numberDiff line numberDiff line change
@@ -2451,6 +2451,7 @@ ctx_time_update_event(struct perf_event_context *ctx, struct perf_event *event)
24512451
#define DETACH_GROUP 0x01UL
24522452
#define DETACH_CHILD 0x02UL
24532453
#define DETACH_DEAD 0x04UL
2454+
#define DETACH_EXIT 0x08UL
24542455

24552456
/*
24562457
* Cross CPU call to remove a performance event
@@ -2465,6 +2466,7 @@ __perf_remove_from_context(struct perf_event *event,
24652466
void *info)
24662467
{
24672468
struct perf_event_pmu_context *pmu_ctx = event->pmu_ctx;
2469+
enum perf_event_state state = PERF_EVENT_STATE_OFF;
24682470
unsigned long flags = (unsigned long)info;
24692471

24702472
ctx_time_update(cpuctx, ctx);
@@ -2473,16 +2475,19 @@ __perf_remove_from_context(struct perf_event *event,
24732475
* Ensure event_sched_out() switches to OFF, at the very least
24742476
* this avoids raising perf_pending_task() at this time.
24752477
*/
2476-
if (flags & DETACH_DEAD)
2478+
if (flags & DETACH_EXIT)
2479+
state = PERF_EVENT_STATE_EXIT;
2480+
if (flags & DETACH_DEAD) {
24772481
event->pending_disable = 1;
2482+
state = PERF_EVENT_STATE_DEAD;
2483+
}
24782484
event_sched_out(event, ctx);
2485+
perf_event_set_state(event, min(event->state, state));
24792486
if (flags & DETACH_GROUP)
24802487
perf_group_detach(event);
24812488
if (flags & DETACH_CHILD)
24822489
perf_child_detach(event);
24832490
list_del_event(event, ctx);
2484-
if (flags & DETACH_DEAD)
2485-
event->state = PERF_EVENT_STATE_DEAD;
24862491

24872492
if (!pmu_ctx->nr_events) {
24882493
pmu_ctx->rotate_necessary = 0;
@@ -13731,12 +13736,7 @@ perf_event_exit_event(struct perf_event *event, struct perf_event_context *ctx)
1373113736
mutex_lock(&parent_event->child_mutex);
1373213737
}
1373313738

13734-
perf_remove_from_context(event, detach_flags);
13735-
13736-
raw_spin_lock_irq(&ctx->lock);
13737-
if (event->state > PERF_EVENT_STATE_EXIT)
13738-
perf_event_set_state(event, PERF_EVENT_STATE_EXIT);
13739-
raw_spin_unlock_irq(&ctx->lock);
13739+
perf_remove_from_context(event, detach_flags | DETACH_EXIT);
1374013740

1374113741
/*
1374213742
* Child events can be freed.

0 commit comments

Comments
 (0)