diff options
author | Peter Zijlstra <peterz@infradead.org> | 2015-11-30 06:56:15 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-12-04 04:08:03 -0500 |
commit | 642c2d671ceff40e9453203ea0c66e991e11e249 (patch) | |
tree | e02c733869c9c66e96f0a99d64bfde200a68ae7e /kernel | |
parent | 90eec103b96e30401c0b846045bf8a1c7159b6da (diff) |
perf: Fix PERF_EVENT_IOC_PERIOD deadlock
Dmitry reported a fairly silly recursive lock deadlock for
PERF_EVENT_IOC_PERIOD, fix this by explicitly doing the inactive part of
__perf_event_period() instead of calling that function.
Reported-by: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: <stable@vger.kernel.org>
Cc: Alexander Potapenko <glider@google.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Kostya Serebryany <kcc@google.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sasha Levin <sasha.levin@oracle.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Fixes: c7999c6f3fed ("perf: Fix PERF_EVENT_IOC_PERIOD migration race")
Link: http://lkml.kernel.org/r/20151130115615.GJ17308@twins.programming.kicks-ass.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/events/core.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 5854fcf7f05a..49a5118f3564 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -4225,7 +4225,14 @@ retry: | |||
4225 | goto retry; | 4225 | goto retry; |
4226 | } | 4226 | } |
4227 | 4227 | ||
4228 | __perf_event_period(&pe); | 4228 | if (event->attr.freq) { |
4229 | event->attr.sample_freq = value; | ||
4230 | } else { | ||
4231 | event->attr.sample_period = value; | ||
4232 | event->hw.sample_period = value; | ||
4233 | } | ||
4234 | |||
4235 | local64_set(&event->hw.period_left, 0); | ||
4229 | raw_spin_unlock_irq(&ctx->lock); | 4236 | raw_spin_unlock_irq(&ctx->lock); |
4230 | 4237 | ||
4231 | return 0; | 4238 | return 0; |