Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+9 -9
+9 -9
kernel/events/core.c
··· 2451 2451 #define DETACH_GROUP 0x01UL 2452 2452 #define DETACH_CHILD 0x02UL 2453 2453 #define DETACH_DEAD 0x04UL 2454 + #define DETACH_EXIT 0x08UL 2454 2455 2455 2456 /* 2456 2457 * Cross CPU call to remove a performance event ··· 2466 2465 void *info) 2467 2466 { 2468 2467 struct perf_event_pmu_context *pmu_ctx = event->pmu_ctx; 2468 + enum perf_event_state state = PERF_EVENT_STATE_OFF; 2469 2469 unsigned long flags = (unsigned long)info; 2470 2470 2471 2471 ctx_time_update(cpuctx, ctx); ··· 2475 2473 * Ensure event_sched_out() switches to OFF, at the very least 2476 2474 * this avoids raising perf_pending_task() at this time. 2477 2475 */ 2478 - if (flags & DETACH_DEAD) 2476 + if (flags & DETACH_EXIT) 2477 + state = PERF_EVENT_STATE_EXIT; 2478 + if (flags & DETACH_DEAD) { 2479 2479 event->pending_disable = 1; 2480 + state = PERF_EVENT_STATE_DEAD; 2481 + } 2480 2482 event_sched_out(event, ctx); 2483 + perf_event_set_state(event, min(event->state, state)); 2481 2484 if (flags & DETACH_GROUP) 2482 2485 perf_group_detach(event); 2483 2486 if (flags & DETACH_CHILD) 2484 2487 perf_child_detach(event); 2485 2488 list_del_event(event, ctx); 2486 - if (flags & DETACH_DEAD) 2487 - event->state = PERF_EVENT_STATE_DEAD; 2488 2489 2489 2490 if (!pmu_ctx->nr_events) { 2490 2491 pmu_ctx->rotate_necessary = 0; ··· 13736 13731 mutex_lock(&parent_event->child_mutex); 13737 13732 } 13738 13733 13739 - perf_remove_from_context(event, detach_flags); 13740 - 13741 - raw_spin_lock_irq(&ctx->lock); 13742 - if (event->state > PERF_EVENT_STATE_EXIT) 13743 - perf_event_set_state(event, PERF_EVENT_STATE_EXIT); 13744 - raw_spin_unlock_irq(&ctx->lock); 13734 + perf_remove_from_context(event, detach_flags | DETACH_EXIT); 13745 13735 13746 13736 /* 13747 13737 * Child events can be freed.