diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/events/core.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 453ef61311d4..2fabc0627165 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -4574,6 +4574,13 @@ static void perf_pending_event(struct irq_work *entry) | |||
| 4574 | { | 4574 | { |
| 4575 | struct perf_event *event = container_of(entry, | 4575 | struct perf_event *event = container_of(entry, |
| 4576 | struct perf_event, pending); | 4576 | struct perf_event, pending); |
| 4577 | int rctx; | ||
| 4578 | |||
| 4579 | rctx = perf_swevent_get_recursion_context(); | ||
| 4580 | /* | ||
| 4581 | * If we 'fail' here, that's OK, it means recursion is already disabled | ||
| 4582 | * and we won't recurse 'further'. | ||
| 4583 | */ | ||
| 4577 | 4584 | ||
| 4578 | if (event->pending_disable) { | 4585 | if (event->pending_disable) { |
| 4579 | event->pending_disable = 0; | 4586 | event->pending_disable = 0; |
| @@ -4584,6 +4591,9 @@ static void perf_pending_event(struct irq_work *entry) | |||
| 4584 | event->pending_wakeup = 0; | 4591 | event->pending_wakeup = 0; |
| 4585 | perf_event_wakeup(event); | 4592 | perf_event_wakeup(event); |
| 4586 | } | 4593 | } |
| 4594 | |||
| 4595 | if (rctx >= 0) | ||
| 4596 | perf_swevent_put_recursion_context(rctx); | ||
| 4587 | } | 4597 | } |
| 4588 | 4598 | ||
| 4589 | /* | 4599 | /* |
