diff options
Diffstat (limited to 'kernel/events/core.c')
-rw-r--r-- | kernel/events/core.c | 12 |
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 | /* |