Tejun Heo
e2bd416f62
cgroup: fix deadlock on cgroup_mutex via drop_parsed_module_refcounts()
eb178d0633 ("cgroup: grab cgroup_mutex in
drop_parsed_module_refcounts()") made drop_parsed_module_refcounts()
grab cgroup_mutex to make lockdep assertion in for_each_subsys()
happy. Unfortunately, cgroup_remount() calls the function while
holding cgroup_mutex in its failure path leading to the following
deadlock.
# mount -t cgroup -o remount,memory,blkio cgroup blkio
cgroup: option changes via remount are deprecated (pid=525 comm=mount)
=============================================
[ INFO: possible recursive locking detected ]
3.10.0-rc4-work+ #1 Not tainted
---------------------------------------------
mount/525 is trying to acquire lock:
(cgroup_mutex){+.+.+.}, at: [<ffffffff8110a3e1>] drop_parsed_module_refcounts+0x21/0xb0
but task is already holding lock:
(cgroup_mutex){+.+.+.}, at: [<ffffffff8110e4e1>] cgroup_remount+0x51/0x200
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
----
lock(cgroup_mutex);
lock(cgroup_mutex);
*** DEADLOCK ***
May be due to missing lock nesting notation
4 locks held by mount/525:
#0: (&type->s_umount_key#30){+.+...}, at: [<ffffffff811e9a0d>] do_mount+0x2bd/0xa30
#1: (&sb->s_type->i_mutex_key#9){+.+.+.}, at: [<ffffffff8110e4d3>] cgroup_remount+0x43/0x200
#2: (cgroup_mutex){+.+.+.}, at: [<ffffffff8110e4e1>] cgroup_remount+0x51/0x200
#3: (cgroup_root_mutex){+.+.+.}, at: [<ffffffff8110e4ef>] cgroup_remount+0x5f/0x200
stack backtrace:
CPU: 2 PID: 525 Comm: mount Not tainted 3.10.0-rc4-work+ #1
Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
ffffffff829651f0 ffff88000ec2fc28 ffffffff81c24bb1 ffff88000ec2fce8
ffffffff810f420d 0000000000000006 0000000000000001 0000000000000056
ffff8800153b4640 ffff880000000000 ffffffff81c2e468 ffff8800153b4640
Call Trace:
[<ffffffff81c24bb1>] dump_stack+0x19/0x1b
[<ffffffff810f420d>] __lock_acquire+0x15dd/0x1e60
[<ffffffff810f531c>] lock_acquire+0x9c/0x1f0
[<ffffffff81c2a805>] mutex_lock_nested+0x65/0x410
[<ffffffff8110a3e1>] drop_parsed_module_refcounts+0x21/0xb0
[<ffffffff8110e63e>] cgroup_remount+0x1ae/0x200
[<ffffffff811c9bb2>] do_remount_sb+0x82/0x190
[<ffffffff811e9d41>] do_mount+0x5f1/0xa30
[<ffffffff811ea203>] SyS_mount+0x83/0xc0
[<ffffffff81c2fb82>] system_call_fastpath+0x16/0x1b
Fix it by moving the drop_parsed_module_refcounts() invocation outside
cgroup_mutex.
Signed-off-by: Tejun Heo <tj@kernel.org>
2013-06-27 19:37:23 -07:00
..
2013-05-14 17:43:29 +02:00
2013-04-30 17:04:10 -07:00
2013-05-07 13:17:29 +02:00
2013-01-11 11:39:33 -08:00
2013-05-06 11:37:43 +10:00
2013-05-02 19:40:34 -07:00
2013-05-05 13:23:27 -07:00
2013-05-15 14:05:17 -07:00
2013-05-28 10:53:20 -04:00
2013-04-22 07:09:06 -07:00
2013-05-04 14:57:58 -04:00
2013-03-12 13:59:14 -07:00
2013-04-29 15:54:26 -07:00
2013-01-11 14:54:55 -08:00
2013-05-11 14:29:11 -07:00
2013-05-11 14:29:11 -07:00
2013-05-24 16:22:52 -07:00
2013-05-07 22:27:15 -04:00
2013-04-14 10:06:31 -07:00
2012-11-19 08:13:38 -08:00
2013-06-27 19:37:23 -07:00
2013-05-01 07:21:43 -07:00
2013-05-01 17:29:18 -04:00
2013-02-19 18:19:48 -08:00
2012-05-31 17:49:27 -07:00
2013-02-19 19:04:55 -08:00
2013-05-01 17:51:54 -07:00
2011-11-06 19:44:47 -08:00
2012-12-18 10:55:28 -08:00
2013-01-27 19:23:31 +01:00
2012-03-28 18:30:03 +01:00
2013-05-01 17:51:54 -07:00
2013-04-15 13:25:16 +02:00
2013-05-08 11:51:05 -07:00
2012-10-26 14:27:49 -07:00
2013-02-23 18:50:11 -08:00
2013-03-12 20:42:10 -07:00
2012-05-03 03:29:33 -07:00
2013-05-05 13:23:27 -07:00
2012-04-25 12:39:25 +02:00
2013-02-05 00:48:46 +01:00
2012-04-10 11:00:30 +02:00
2012-08-06 19:00:35 +03:00
2013-04-15 15:17:26 +09:30
2012-12-20 17:40:19 -08:00
2012-09-13 17:56:13 +02:00
2012-03-23 13:18:57 +01:00
2013-04-30 17:04:07 -07:00
2013-05-16 12:01:11 -07:00
2013-04-18 08:58:38 -07:00
2012-12-11 18:10:49 -08:00
2013-04-30 17:04:02 -07:00
2011-10-31 09:20:12 -04:00
2012-05-29 23:28:41 -04:00
2012-10-24 12:39:09 +02:00
2013-05-08 11:51:05 -07:00
2013-05-05 10:58:06 -07:00
2013-03-15 15:09:43 +10:30
2012-12-20 17:40:21 -08:00
2012-12-05 11:27:24 +10:30
2012-10-19 17:30:40 -07:00
2013-05-17 09:53:36 +01:00
2011-10-31 09:20:12 -04:00
2013-04-19 09:33:36 +02:00
2011-10-31 09:20:12 -04:00
2013-05-01 17:29:39 -04:00
2012-12-06 17:16:23 +08:00
2013-04-30 17:04:02 -07:00
2013-03-18 11:40:21 +00:00
2013-05-01 17:51:54 -07:00
2013-05-01 17:51:54 -07:00
2013-04-22 19:59:25 +02:00
2013-04-18 12:51:19 +02:00
2013-05-07 20:16:25 -07:00
2013-05-01 17:29:18 -04:00
2013-05-07 20:16:25 -07:00
2013-05-17 11:49:10 -07:00
2013-01-28 22:06:21 -08:00
2013-01-28 22:25:21 -08:00
2013-01-28 22:06:21 -08:00
2013-01-28 22:25:21 -08:00
2013-02-04 12:18:20 -08:00
2013-05-15 10:41:12 -07:00
2013-05-05 00:16:35 -04:00
2013-05-02 17:54:19 +02:00
2013-05-02 17:54:19 +02:00
2013-05-08 10:13:35 -07:00
2012-12-18 15:02:12 -08:00
2013-04-29 15:54:40 -07:00
2013-02-07 20:51:08 +01:00
2013-04-10 14:48:37 +02:00
2013-02-07 20:51:08 +01:00
2013-03-23 15:53:52 -07:00
2013-03-26 11:07:19 +11:00
2013-04-30 17:04:08 -07:00
2013-05-01 14:08:52 -07:00
2013-04-30 17:04:03 -07:00
2013-04-12 14:18:43 +02:00
2012-08-13 17:01:07 +02:00
2013-05-05 13:23:27 -07:00
2012-03-23 13:18:57 +01:00
2013-02-07 15:19:36 -08:00
2011-10-31 09:20:12 -04:00
2013-02-26 22:25:17 +01:00
2013-05-09 13:46:38 -04:00
2013-05-01 07:21:43 -07:00
2013-05-09 14:53:20 -04:00
2013-04-29 15:54:36 -07:00
2012-09-13 16:47:34 +02:00
2012-10-06 03:05:31 +09:00
2013-04-29 18:28:42 -07:00
2013-03-15 16:50:20 -07:00
2013-02-16 23:17:25 +01:00
2013-05-15 14:05:17 -07:00
2013-04-29 13:55:38 -07:00
2013-01-27 19:23:31 +01:00
2013-03-03 22:58:33 -05:00
2011-10-31 09:20:12 -04:00
2013-05-01 17:51:54 -07:00
2013-02-27 19:10:24 -08:00
2013-05-01 17:51:54 -07:00
2013-02-27 19:10:22 -08:00
2013-05-01 17:29:39 -04:00
2012-12-06 10:39:54 +01:00
2013-03-14 08:24:05 +01:00
2013-04-30 17:04:02 -07:00
2013-05-15 14:24:24 -07:00