mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2025-04-19 20:58:31 +09:00
Fix a perf events time accounting bug.
Signed-off-by: Ingo Molnar <mingo@kernel.org> -----BEGIN PGP SIGNATURE----- iQJFBAABCgAvFiEEBpT5eoXrXCwVQwEKEnMQ0APhK1gFAmfyslURHG1pbmdvQGtl cm5lbC5vcmcACgkQEnMQ0APhK1jGRw/8CZ3NyJI/g0StlH/csA4a1f58JBpIR1XY I+uUXuTEsd1yS1TMLz5WeK8hsLp1ZCnehojLcjY4Ee/8Tp+mBRlgYuvgJ/T7wBbI OOJjsSku2IHk+D3RshUJt3kG9deeBIkZSQON+HeJ28WaYzXs0qpNKnS3a5RMLJWo k+PS4IpRaWN5a/YIxC2XMGGxEBE0W9wJXXthIbbSozuu1uXuNiZ92cxAa8IzPiZn 4oThM4dq1XyR4NvcjWf23206fUUVEzBoK/XS15oRK3Nk2oHMZ2ilruTxkBEaFf50 6Nr2zNVVQ6/l6wR9DYMAQTE+UHFMJGb7+l1oSARLFKPKc9h7nj4+eItBMzkzbxXS wAZX0nq+kkXAr2DABHBxeT6q10OGjLHCOTrE4AfU0Iss8kmNhRPiqwuXT87dOcDa OWH75mrP6rkGdUdExV5+ZdB1GhBiomg/KB3YCILeM2OjrluXtZC1aHYiuS1RPh24 KaH6H20WtRzNbF7uxRPBwOS1U3xHfFd+usZ1XnBzl2DWNz09hyJUjuG8B90EmjvI POQ2lyepVg2tIV/uplM0sb9J39tNZNXRlfQrmjsyuHk+1kmK+bh0lL9WVe7qQqVB jEX6X0yqTdLAMyRllcwRwtIhgb1u89PFRhnC3IKRfuJeuj07LTgnkOYSVwp7YQ+C p7eIplRJhrw= =slQk -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
dda8887894
@ -2451,6 +2451,7 @@ ctx_time_update_event(struct perf_event_context *ctx, struct perf_event *event)
|
||||
#define DETACH_GROUP 0x01UL
|
||||
#define DETACH_CHILD 0x02UL
|
||||
#define DETACH_DEAD 0x04UL
|
||||
#define DETACH_EXIT 0x08UL
|
||||
|
||||
/*
|
||||
* Cross CPU call to remove a performance event
|
||||
@ -2465,6 +2466,7 @@ __perf_remove_from_context(struct perf_event *event,
|
||||
void *info)
|
||||
{
|
||||
struct perf_event_pmu_context *pmu_ctx = event->pmu_ctx;
|
||||
enum perf_event_state state = PERF_EVENT_STATE_OFF;
|
||||
unsigned long flags = (unsigned long)info;
|
||||
|
||||
ctx_time_update(cpuctx, ctx);
|
||||
@ -2473,16 +2475,19 @@ __perf_remove_from_context(struct perf_event *event,
|
||||
* Ensure event_sched_out() switches to OFF, at the very least
|
||||
* this avoids raising perf_pending_task() at this time.
|
||||
*/
|
||||
if (flags & DETACH_DEAD)
|
||||
if (flags & DETACH_EXIT)
|
||||
state = PERF_EVENT_STATE_EXIT;
|
||||
if (flags & DETACH_DEAD) {
|
||||
event->pending_disable = 1;
|
||||
state = PERF_EVENT_STATE_DEAD;
|
||||
}
|
||||
event_sched_out(event, ctx);
|
||||
perf_event_set_state(event, min(event->state, state));
|
||||
if (flags & DETACH_GROUP)
|
||||
perf_group_detach(event);
|
||||
if (flags & DETACH_CHILD)
|
||||
perf_child_detach(event);
|
||||
list_del_event(event, ctx);
|
||||
if (flags & DETACH_DEAD)
|
||||
event->state = PERF_EVENT_STATE_DEAD;
|
||||
|
||||
if (!pmu_ctx->nr_events) {
|
||||
pmu_ctx->rotate_necessary = 0;
|
||||
@ -13731,12 +13736,7 @@ perf_event_exit_event(struct perf_event *event, struct perf_event_context *ctx)
|
||||
mutex_lock(&parent_event->child_mutex);
|
||||
}
|
||||
|
||||
perf_remove_from_context(event, detach_flags);
|
||||
|
||||
raw_spin_lock_irq(&ctx->lock);
|
||||
if (event->state > PERF_EVENT_STATE_EXIT)
|
||||
perf_event_set_state(event, PERF_EVENT_STATE_EXIT);
|
||||
raw_spin_unlock_irq(&ctx->lock);
|
||||
perf_remove_from_context(event, detach_flags | DETACH_EXIT);
|
||||
|
||||
/*
|
||||
* Child events can be freed.
|
||||
|
Loading…
x
Reference in New Issue
Block a user