diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-03-28 19:12:08 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-03-28 19:12:08 +0100 |
commit | ee9b63dd0fed60565829b489d29f80927a6fcf3d (patch) | |
tree | 6e7bf7417151024bc6c21e235ce6fbe81a84babd /kernel | |
parent | Merge branch 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux... (diff) | |
parent | perf: Fix irq_work 'tail' recursion (diff) | |
download | linux-ee9b63dd0fed60565829b489d29f80927a6fcf3d.tar.xz linux-ee9b63dd0fed60565829b489d29f80927a6fcf3d.zip |
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fix from Ingo Molnar:
"A perf kernel side fix for a fuzzer triggered lockup"
* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
perf: Fix irq_work 'tail' recursion
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) { struct perf_event *event = container_of(entry, struct perf_event, pending); + int rctx; + + rctx = perf_swevent_get_recursion_context(); + /* + * If we 'fail' here, that's OK, it means recursion is already disabled + * and we won't recurse 'further'. + */ if (event->pending_disable) { event->pending_disable = 0; @@ -4584,6 +4591,9 @@ static void perf_pending_event(struct irq_work *entry) event->pending_wakeup = 0; perf_event_wakeup(event); } + + if (rctx >= 0) + perf_swevent_put_recursion_context(rctx); } /* |