Robert Love
f9c4358edb
fcoe: Fix deadlock between create and destroy paths
We can deadlock (s_active and fcoe_config_mutex) if a
port is being destroyed at the same time one is being created.
[ 4200.503113] ======================================================
[ 4200.503114] [ INFO: possible circular locking dependency detected ]
[ 4200.503116] 3.8.0-rc5+ #8 Not tainted
[ 4200.503117] -------------------------------------------------------
[ 4200.503118] kworker/3:2/2492 is trying to acquire lock:
[ 4200.503119] (s_active#292){++++.+}, at: [<ffffffff8122d20b>] sysfs_addrm_finish+0x3b/0x70
[ 4200.503127]
but task is already holding lock:
[ 4200.503128] (fcoe_config_mutex){+.+.+.}, at: [<ffffffffa02f3338>] fcoe_destroy_work+0xe8/0x120 [fcoe]
[ 4200.503133]
which lock already depends on the new lock.
[ 4200.503135]
the existing dependency chain (in reverse order) is:
[ 4200.503136]
-> #1 (fcoe_config_mutex){+.+.+.}:
[ 4200.503139] [<ffffffff810c7711>] lock_acquire+0xa1/0x140
[ 4200.503143] [<ffffffff816ca7be>] mutex_lock_nested+0x6e/0x360
[ 4200.503146] [<ffffffffa02f11bd>] fcoe_enable+0x1d/0xb0 [fcoe]
[ 4200.503148] [<ffffffffa02f127d>] fcoe_ctlr_enabled+0x2d/0x50 [fcoe]
[ 4200.503151] [<ffffffffa02ffbe8>] store_ctlr_enabled+0x38/0x90 [libfcoe]
[ 4200.503154] [<ffffffff81424878>] dev_attr_store+0x18/0x30
[ 4200.503157] [<ffffffff8122b750>] sysfs_write_file+0xe0/0x150
[ 4200.503160] [<ffffffff811b334c>] vfs_write+0xac/0x180
[ 4200.503162] [<ffffffff811b3692>] sys_write+0x52/0xa0
[ 4200.503164] [<ffffffff816d7159>] system_call_fastpath+0x16/0x1b
[ 4200.503167]
-> #0 (s_active#292){++++.+}:
[ 4200.503170] [<ffffffff810c680f>] __lock_acquire+0x135f/0x1c90
[ 4200.503172] [<ffffffff810c7711>] lock_acquire+0xa1/0x140
[ 4200.503174] [<ffffffff8122c626>] sysfs_deactivate+0x116/0x160
[ 4200.503176] [<ffffffff8122d20b>] sysfs_addrm_finish+0x3b/0x70
[ 4200.503178] [<ffffffff8122b2eb>] sysfs_hash_and_remove+0x5b/0xb0
[ 4200.503180] [<ffffffff8122f3d1>] sysfs_remove_group+0x61/0x100
[ 4200.503183] [<ffffffff814251eb>] device_remove_groups+0x3b/0x60
[ 4200.503185] [<ffffffff81425534>] device_remove_attrs+0x44/0x80
[ 4200.503187] [<ffffffff81425e97>] device_del+0x127/0x1c0
[ 4200.503189] [<ffffffff81425f52>] device_unregister+0x22/0x60
[ 4200.503191] [<ffffffffa0300970>] fcoe_ctlr_device_delete+0xe0/0xf0 [libfcoe]
[ 4200.503194] [<ffffffffa02f1b5c>] fcoe_interface_cleanup+0x6c/0xa0 [fcoe]
[ 4200.503196] [<ffffffffa02f3355>] fcoe_destroy_work+0x105/0x120 [fcoe]
[ 4200.503198] [<ffffffff8107ee91>] process_one_work+0x1a1/0x580
[ 4200.503203] [<ffffffff81080c6e>] worker_thread+0x15e/0x440
[ 4200.503205] [<ffffffff8108715a>] kthread+0xea/0xf0
[ 4200.503207] [<ffffffff816d70ac>] ret_from_fork+0x7c/0xb0
[ 4200.503209]
other info that might help us debug this:
[ 4200.503211] Possible unsafe locking scenario:
[ 4200.503212] CPU0 CPU1
[ 4200.503213] ---- ----
[ 4200.503214] lock(fcoe_config_mutex);
[ 4200.503215] lock(s_active#292);
[ 4200.503218] lock(fcoe_config_mutex);
[ 4200.503219] lock(s_active#292);
[ 4200.503221]
*** DEADLOCK ***
[ 4200.503223] 3 locks held by kworker/3:2/2492:
[ 4200.503224] #0: (fcoe){.+.+.+}, at: [<ffffffff8107ee2b>] process_one_work+0x13b/0x580
[ 4200.503228] #1: ((&port->destroy_work)){+.+.+.}, at: [<ffffffff8107ee2b>] process_one_work+0x13b/0x580
[ 4200.503232] #2: (fcoe_config_mutex){+.+.+.}, at: [<ffffffffa02f3338>] fcoe_destroy_work+0xe8/0x120 [fcoe]
[ 4200.503236]
stack backtrace:
[ 4200.503238] Pid: 2492, comm: kworker/3:2 Not tainted 3.8.0-rc5+ #8
[ 4200.503240] Call Trace:
[ 4200.503243] [<ffffffff816c2f09>] print_circular_bug+0x1fb/0x20c
[ 4200.503246] [<ffffffff810c680f>] __lock_acquire+0x135f/0x1c90
[ 4200.503248] [<ffffffff810c463a>] ? debug_check_no_locks_freed+0x9a/0x180
[ 4200.503250] [<ffffffff810c7711>] lock_acquire+0xa1/0x140
[ 4200.503253] [<ffffffff8122d20b>] ? sysfs_addrm_finish+0x3b/0x70
[ 4200.503255] [<ffffffff8122c626>] sysfs_deactivate+0x116/0x160
[ 4200.503258] [<ffffffff8122d20b>] ? sysfs_addrm_finish+0x3b/0x70
[ 4200.503260] [<ffffffff8122d20b>] sysfs_addrm_finish+0x3b/0x70
[ 4200.503262] [<ffffffff8122b2eb>] sysfs_hash_and_remove+0x5b/0xb0
[ 4200.503265] [<ffffffff8122f3d1>] sysfs_remove_group+0x61/0x100
[ 4200.503273] [<ffffffff814251eb>] device_remove_groups+0x3b/0x60
[ 4200.503275] [<ffffffff81425534>] device_remove_attrs+0x44/0x80
[ 4200.503277] [<ffffffff81425e97>] device_del+0x127/0x1c0
[ 4200.503279] [<ffffffff81425f52>] device_unregister+0x22/0x60
[ 4200.503282] [<ffffffffa0300970>] fcoe_ctlr_device_delete+0xe0/0xf0 [libfcoe]
[ 4200.503285] [<ffffffffa02f1b5c>] fcoe_interface_cleanup+0x6c/0xa0 [fcoe]
[ 4200.503287] [<ffffffffa02f3355>] fcoe_destroy_work+0x105/0x120 [fcoe]
[ 4200.503290] [<ffffffff8107ee91>] process_one_work+0x1a1/0x580
[ 4200.503292] [<ffffffff8107ee2b>] ? process_one_work+0x13b/0x580
[ 4200.503295] [<ffffffffa02f3250>] ? fcoe_if_destroy+0x230/0x230 [fcoe]
[ 4200.503297] [<ffffffff81080c6e>] worker_thread+0x15e/0x440
[ 4200.503299] [<ffffffff81080b10>] ? busy_worker_rebind_fn+0x100/0x100
[ 4200.503301] [<ffffffff8108715a>] kthread+0xea/0xf0
[ 4200.503304] [<ffffffff81087070>] ? kthread_create_on_node+0x160/0x160
[ 4200.503306] [<ffffffff816d70ac>] ret_from_fork+0x7c/0xb0
[ 4200.503308] [<ffffffff81087070>] ? kthread_create_on_node+0x160/0x160
Signed-off-by: Robert Love <robert.w.love@intel.com>
Tested-by: Jack Morgan <jack.morgan@intel.com>
2013-03-25 15:55:56 -07:00
..
2013-03-12 20:25:53 -07:00
2013-03-15 17:20:02 +00:00
2013-03-23 12:33:36 -07:00
2013-02-27 19:10:24 -08:00
2013-03-07 14:54:28 -08:00
2013-03-01 13:52:03 -05:00
2013-03-22 16:43:53 -07:00
2013-03-13 13:29:56 -04:00
2013-03-12 20:28:45 -07:00
2013-03-14 22:34:26 +01:00
2013-03-03 12:06:09 -08:00
2013-02-27 13:08:35 -05:00
2013-03-06 23:40:11 +01:00
2013-02-21 15:27:22 -08:00
2013-02-25 15:56:15 -08:00
2013-02-27 19:10:15 -08:00
2013-03-03 10:20:22 -08:00
2013-03-16 06:32:30 +01:00
2013-02-21 13:57:13 -08:00
2013-02-27 19:10:15 -08:00
2013-03-09 16:51:13 -08:00
2013-03-14 23:55:59 +01:00
2013-03-23 10:46:10 -07:00
2013-03-08 14:42:52 -08:00
2013-03-01 13:39:00 -08:00
2013-02-27 10:15:53 -08:00
2013-03-18 21:19:49 +01:00
2013-03-23 12:32:14 -07:00
2013-02-26 20:16:07 -08:00
2013-02-22 19:25:09 -08:00
2013-03-06 05:48:24 +08:00
2013-03-19 13:20:51 -07:00
2013-03-18 08:17:14 -07:00
2013-03-06 09:41:51 +01:00
2013-02-21 13:57:13 -08:00
2013-03-04 17:15:33 -08:00
2013-03-17 12:01:10 -04:00
2013-02-26 09:29:02 -08:00
2013-02-26 14:49:12 -08:00
2013-02-23 17:09:55 -08:00
2013-03-04 14:23:11 +01:00
2013-03-23 15:49:49 -07:00
2013-02-28 20:00:40 -08:00
2013-02-27 19:10:23 -08:00
2013-03-15 07:42:22 +01:00
2013-03-03 19:36:31 -08:00
2013-03-03 00:32:50 +00:00
2013-03-18 08:27:41 -07:00
2013-03-18 13:12:20 -04:00
2013-02-18 13:47:13 -05:00
2013-02-21 17:40:58 -08:00
2013-03-03 19:36:31 -08:00
2013-02-26 20:16:07 -08:00
2013-02-21 17:54:03 -08:00
2013-03-19 14:51:14 -07:00
2013-02-21 17:40:58 -08:00
2013-03-14 09:37:42 +01:00
2013-03-08 16:03:29 -08:00
2013-03-04 14:23:40 +01:00
2013-02-27 19:10:18 -08:00
2013-02-27 19:10:23 -08:00
2013-02-26 09:34:29 -08:00
2013-03-05 10:12:43 +08:00
2013-02-27 19:10:18 -08:00
2013-02-27 19:10:18 -08:00
2013-03-22 16:41:20 -07:00
2013-03-19 13:20:51 -07:00
2013-02-26 20:16:07 -08:00
2013-03-25 15:55:56 -07:00
2013-02-21 15:27:22 -08:00
2013-02-22 10:07:30 +01:00
2013-03-13 15:21:57 -07:00
2013-03-19 17:31:14 -07:00
2013-03-11 23:09:29 +08:00
2013-03-19 14:47:11 -07:00
2013-02-27 19:10:19 -08:00
2013-03-21 15:59:05 -07:00
2013-03-15 12:58:20 -06:00
2013-03-23 16:51:55 -07:00
2013-03-22 16:41:20 -07:00
2013-02-26 14:49:12 -08:00
2013-02-14 09:24:14 -08:00
2013-03-12 16:20:46 -07:00
2013-03-22 23:21:55 +01:00
2013-03-12 20:25:53 -07:00
2013-02-22 23:31:31 -05:00
2013-02-21 13:57:13 -08:00
2013-02-23 17:09:55 -08:00