提交 06c4f20d 编写于 作者: E Eddie Wai 提交者: James Bottomley

[SCSI] bnx2fc: Fixed scsi_remove_target soft lockup when rmmod bnx2x

The problem has been identified to be a change in the scsi_remove_device
path where a call to the pm_runtime_set_memalloc_noio was added when
del_gendisk is called in this path.  Note that the new pm routine
attempts to cycle through all parent devices from the FC target device
to set the memalloc_noio flag.  Because of this new change, a dependency
was created between the FC target device and the parent netdev device
in the destroy path.

In order to synchronized the destroy paths, bnx2fc has been modified
to flush all destroy workqueues in the NETDEV_UNREGISTER return path.

[    4.123584] BUG: soft lockup - CPU#8 stuck for 22s! [kworker/8:3:8082]
[    4.123713] Call Trace:
[    4.123719]  [<ffffffff815dfbe0>] klist_next+0x20/0xf0
[    4.123725]  [<ffffffff813e9220>] ? pm_save_wakeup_count+0x70/0x70
[    4.123731]  [<ffffffff813d9e4e>] device_for_each_child+0x4e/0x70
[    4.123735]  [<ffffffff813e9554>] pm_runtime_set_memalloc_noio+0x94/0xf0
[    4.123740]  [<ffffffff812d4d74>] del_gendisk+0x264/0x2a0
[    4.123747]  [<ffffffffa00c6dc9>] sd_remove+0x69/0xb0 [sd_mod]
[    4.123751]  [<ffffffff813de24f>] __device_release_driver+0x7f/0xf0
[    4.123754]  [<ffffffff813de2e3>] device_release_driver+0x23/0x30
[    4.123757]  [<ffffffff813ddab4>] bus_remove_device+0xf4/0x170
[    4.123760]  [<ffffffff813da475>] device_del+0x135/0x1d0
[    4.123765]  [<ffffffff81411b75>] __scsi_remove_device+0xc5/0xd0
[    4.123768]  [<ffffffff81411ba6>] scsi_remove_device+0x26/0x40
[    4.123770]  [<ffffffff81411d40>] scsi_remove_target+0x160/0x210
[    4.123775]  [<ffffffffa0420e4c>] fc_rport_final_delete+0xac/0x1f0 [scsi_transport_fc]
[    4.123780]  [<ffffffff810774ab>] process_one_work+0x17b/0x460
[    4.123783]  [<ffffffff8107825b>] worker_thread+0x11b/0x400
[    4.123786]  [<ffffffff81078140>] ? rescuer_thread+0x3e0/0x3e0
[    4.123791]  [<ffffffff8107e9c0>] kthread+0xc0/0xd0
[    4.123794]  [<ffffffff8107e900>] ? kthread_create_on_node+0x110/0x110
[    4.123798]  [<ffffffff8160ceec>] ret_from_fork+0x7c/0xb0
[    4.123801]  [<ffffffff8107e900>] ? kthread_create_on_node+0x110/0x110
Signed-off-by: NEddie Wai <eddie.wai@broadcom.com>
Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
上级 cf370066
...@@ -850,6 +850,9 @@ static void bnx2fc_indicate_netevent(void *context, unsigned long event, ...@@ -850,6 +850,9 @@ static void bnx2fc_indicate_netevent(void *context, unsigned long event,
__bnx2fc_destroy(interface); __bnx2fc_destroy(interface);
} }
mutex_unlock(&bnx2fc_dev_lock); mutex_unlock(&bnx2fc_dev_lock);
/* Ensure ALL destroy work has been completed before return */
flush_workqueue(bnx2fc_wq);
return; return;
default: default:
...@@ -2389,6 +2392,9 @@ static void bnx2fc_ulp_exit(struct cnic_dev *dev) ...@@ -2389,6 +2392,9 @@ static void bnx2fc_ulp_exit(struct cnic_dev *dev)
__bnx2fc_destroy(interface); __bnx2fc_destroy(interface);
mutex_unlock(&bnx2fc_dev_lock); mutex_unlock(&bnx2fc_dev_lock);
/* Ensure ALL destroy work has been completed before return */
flush_workqueue(bnx2fc_wq);
bnx2fc_ulp_stop(hba); bnx2fc_ulp_stop(hba);
/* unregister cnic device */ /* unregister cnic device */
if (test_and_clear_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic)) if (test_and_clear_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册