Skip to content

Commit 67169d2

Browse files
Peter Zijlstra0day robot
authored andcommitted
deadlock in perf_ioctl
On Mon, Nov 30, 2015 at 10:20:49AM +0100, Dmitry Vyukov wrote: > ============================================= > [ INFO: possible recursive locking detected ] > 4.4.0-rc1+ torvalds#129 Not tainted > --------------------------------------------- > a.out/6283 is trying to acquire lock: > (&ctx->lock){-.....}, at: [<ffffffff815072ce>] > __perf_event_period+0x8e/0x4b0 kernel/events/core.c:4156 > > but task is already holding lock: > (&ctx->lock){-.....}, at: [< inline >] perf_event_period > kernel/events/core.c:4212 > (&ctx->lock){-.....}, at: [< inline >] _perf_ioctl > kernel/events/core.c:4266 > (&ctx->lock){-.....}, at: [<ffffffff8152331c>] perf_ioctl+0x7bc/0xcc0 > kernel/events/core.c:4320 > Indeed so. I suppose the below should fix this, I'll go try in a bit.
1 parent ac675d0 commit 67169d2

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

kernel/events/core.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4225,7 +4225,14 @@ static int perf_event_period(struct perf_event *event, u64 __user *arg)
42254225
goto retry;
42264226
}
42274227

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);
42294236
raw_spin_unlock_irq(&ctx->lock);
42304237

42314238
return 0;

0 commit comments

Comments
 (0)