Peter Zijlstra
4a1c0f262f
perf: Fix lockdep warning on process exit
Sasha Levin reported:
> While fuzzing with trinity inside a KVM tools guest running the latest -next
> kernel I've stumbled on the following spew:
>
> ======================================================
> [ INFO: possible circular locking dependency detected ]
> 3.15.0-next-20140613-sasha-00026-g6dd125d-dirty #654 Not tainted
> -------------------------------------------------------
> trinity-c578/9725 is trying to acquire lock:
> (&(&pool->lock)->rlock){-.-...}, at: __queue_work (kernel/workqueue.c:1346)
>
> but task is already holding lock:
> (&ctx->lock){-.....}, at: perf_event_exit_task (kernel/events/core.c:7471 kernel/events/core.c:7533)
>
> which lock already depends on the new lock.
> 1 lock held by trinity-c578/9725:
> #0: (&ctx->lock){-.....}, at: perf_event_exit_task (kernel/events/core.c:7471 kernel/events/core.c:7533)
>
> Call Trace:
> dump_stack (lib/dump_stack.c:52)
> print_circular_bug (kernel/locking/lockdep.c:1216)
> __lock_acquire (kernel/locking/lockdep.c:1840 kernel/locking/lockdep.c:1945 kernel/locking/lockdep.c:2131 kernel/locking/lockdep.c:3182)
> lock_acquire (./arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602)
> _raw_spin_lock (include/linux/spinlock_api_smp.h:143 kernel/locking/spinlock.c:151)
> __queue_work (kernel/workqueue.c:1346)
> queue_work_on (kernel/workqueue.c:1424)
> free_object (lib/debugobjects.c:209)
> __debug_check_no_obj_freed (lib/debugobjects.c:715)
> debug_check_no_obj_freed (lib/debugobjects.c:727)
> kmem_cache_free (mm/slub.c:2683 mm/slub.c:2711)
> free_task (kernel/fork.c:221)
> __put_task_struct (kernel/fork.c:250)
> put_ctx (include/linux/sched.h:1855 kernel/events/core.c:898)
> perf_event_exit_task (kernel/events/core.c:907 kernel/events/core.c:7478 kernel/events/core.c:7533)
> do_exit (kernel/exit.c:766)
> do_group_exit (kernel/exit.c:884)
> get_signal_to_deliver (kernel/signal.c:2347)
> do_signal (arch/x86/kernel/signal.c:698)
> do_notify_resume (arch/x86/kernel/signal.c:751)
> int_signal (arch/x86/kernel/entry_64.S:600)
Urgh.. so the only way I can make that happen is through:
perf_event_exit_task_context()
raw_spin_lock(&child_ctx->lock);
unclone_ctx(child_ctx)
put_ctx(ctx->parent_ctx);
raw_spin_unlock_irqrestore(&child_ctx->lock);
And we can avoid this by doing the change below.
I can't immediately see how this changed recently, but given that you
say it's easy to reproduce, lets fix this.
Reported-by: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: Tejun Heo <tj@kernel.org>
Cc: Dave Jones <davej@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/20140623141242.GB19860@laptop.programming.kicks-ass.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2014-07-16 13:18:42 +02:00
..
2014-06-04 16:54:17 -07:00
2014-07-16 13:18:42 +02:00
2014-06-10 15:34:46 -07:00
2014-05-27 10:16:44 +02:00
2014-06-21 07:06:02 -10:00
2014-06-16 23:30:44 +02:00
2014-06-04 16:54:17 -07:00
2014-06-03 12:57:53 -07:00
2014-06-12 19:42:15 -07:00
2014-06-04 16:55:13 -07:00
2014-06-12 21:07:25 -07:00
2013-12-10 18:21:34 +00:00
2014-06-06 16:08:14 -07:00
2014-02-18 11:17:17 +01:00
2014-02-18 11:17:17 +01:00
2014-06-12 14:27:40 -07:00
2014-03-20 10:10:53 -04:00
2014-04-12 12:38:53 -07:00
2014-06-10 08:44:40 -07:00
2014-06-04 16:54:14 -07:00
2013-12-20 12:25:45 -08:00
2014-06-10 13:57:22 -07:00
2014-05-16 13:22:48 -04:00
2014-06-09 15:03:33 -07:00
2014-06-04 16:54:19 -07:00
2014-06-14 09:07:44 +02:00
2014-06-12 13:14:19 -07:00
2014-06-09 15:03:33 -07:00
2013-11-13 12:09:12 +09:00
2013-11-09 00:16:23 -05:00
2014-06-04 16:54:15 -07:00
2014-06-06 16:08:11 -07:00
2014-02-13 18:13:22 -08:00
2014-06-06 16:08:11 -07:00
2013-12-19 13:50:32 -05:00
2014-02-02 14:09:12 -08:00
2014-06-08 11:31:16 -07:00
2014-04-03 16:21:05 -07:00
2014-06-06 07:55:06 +02:00
2014-06-04 16:54:15 -07:00
2014-02-21 21:49:07 +01:00
2013-10-19 19:45:35 -04:00
2014-04-07 16:36:11 -07:00
2013-11-15 09:32:22 +09:00
2014-06-06 07:58:28 +02:00
2014-06-06 16:08:12 -07:00
2014-06-06 16:08:12 -07:00
2014-04-24 10:26:41 +02:00
2014-04-25 12:00:49 -07:00
2014-06-04 16:53:51 -07:00
2014-06-04 16:54:15 -07:00
2014-03-31 14:13:25 -07:00
2013-10-25 17:15:18 -04:00
2013-09-25 17:17:01 +01:00
2014-06-11 16:09:14 -07:00
2014-04-24 10:26:39 +02:00
2013-09-07 14:35:32 -07:00
2013-12-05 21:28:42 +08:00
2014-06-06 16:08:12 -07:00
2014-04-28 11:48:34 +09:30
2014-04-02 16:20:21 -07:00
2013-09-30 14:31:03 -07:00
2013-12-09 16:56:29 +01:00
2014-06-06 16:08:13 -07:00
2014-03-06 15:35:10 +01:00
2014-06-04 16:54:15 -07:00
2014-04-12 14:49:50 -07:00
2014-06-04 16:54:15 -07:00
2014-05-23 10:47:21 -06:00
2014-06-12 14:27:40 -07:00
2014-06-06 16:08:12 -07:00
2014-06-06 16:08:12 -07:00
2014-05-22 11:36:10 +02:00
2014-06-04 16:54:15 -07:00
2014-06-04 16:54:14 -07:00
2014-05-22 11:16:36 +02:00
2013-11-13 12:09:33 +09:00
2014-06-19 07:50:07 -10:00
2013-12-10 18:25:28 +00:00
2013-12-10 18:25:28 +00:00
2013-09-11 15:58:27 -07:00
2013-11-19 16:39:05 -05:00
2014-04-30 13:46:17 +02:00
2014-05-14 09:46:30 -07:00
2014-06-04 16:54:15 -07:00
2013-08-30 23:44:11 -07:00
2014-02-24 14:47:15 -08:00
2014-06-06 16:08:13 -07:00
2014-06-04 16:54:16 -07:00
2014-06-06 16:08:16 -07:00
2013-08-30 23:44:11 -07:00
2014-04-18 16:40:08 -07:00
2014-05-20 10:59:32 -04:00
2014-06-09 14:56:49 -07:00