aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/events/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/events/core.c')
-rw-r--r--kernel/events/core.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 8bb20cc39a92..9a5f339a0e2d 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3610,7 +3610,7 @@ static void put_event(struct perf_event *event)
3610 ctx = perf_event_ctx_lock_nested(event, SINGLE_DEPTH_NESTING); 3610 ctx = perf_event_ctx_lock_nested(event, SINGLE_DEPTH_NESTING);
3611 WARN_ON_ONCE(ctx->parent_ctx); 3611 WARN_ON_ONCE(ctx->parent_ctx);
3612 perf_remove_from_context(event, true); 3612 perf_remove_from_context(event, true);
3613 mutex_unlock(&ctx->mutex); 3613 perf_event_ctx_unlock(event, ctx);
3614 3614
3615 _free_event(event); 3615 _free_event(event);
3616} 3616}
@@ -4593,6 +4593,13 @@ static void perf_pending_event(struct irq_work *entry)
4593{ 4593{
4594 struct perf_event *event = container_of(entry, 4594 struct perf_event *event = container_of(entry,
4595 struct perf_event, pending); 4595 struct perf_event, pending);
4596 int rctx;
4597
4598 rctx = perf_swevent_get_recursion_context();
4599 /*
4600 * If we 'fail' here, that's OK, it means recursion is already disabled
4601 * and we won't recurse 'further'.
4602 */
4596 4603
4597 if (event->pending_disable) { 4604 if (event->pending_disable) {
4598 event->pending_disable = 0; 4605 event->pending_disable = 0;
@@ -4603,6 +4610,9 @@ static void perf_pending_event(struct irq_work *entry)
4603 event->pending_wakeup = 0; 4610 event->pending_wakeup = 0;
4604 perf_event_wakeup(event); 4611 perf_event_wakeup(event);
4605 } 4612 }
4613
4614 if (rctx >= 0)
4615 perf_swevent_put_recursion_context(rctx);
4606} 4616}
4607 4617
4608/* 4618/*