aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
diff options
context:
space:
mode:
authorEddie Wai <eddie.wai@broadcom.com>2013-12-11 18:30:21 -0500
committerJames Bottomley <JBottomley@Parallels.com>2014-03-15 13:17:47 -0400
commit06c4f20d2814b534eb4fb993d0db9259b24372b9 (patch)
tree158a3865fe6e1a6766ea813a2cdf186f0e605850 /drivers/scsi/bnx2fc/bnx2fc_fcoe.c
parentcf370066ac5c7d5fdf384fef24b8ba48a481ffa5 (diff)
[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: Eddie Wai <eddie.wai@broadcom.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/bnx2fc/bnx2fc_fcoe.c')
-rw-r--r--drivers/scsi/bnx2fc/bnx2fc_fcoe.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
index 9b948505d118..4cabd3ec67ec 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
@@ -850,6 +850,9 @@ static void bnx2fc_indicate_netevent(void *context, unsigned long event,
850 __bnx2fc_destroy(interface); 850 __bnx2fc_destroy(interface);
851 } 851 }
852 mutex_unlock(&bnx2fc_dev_lock); 852 mutex_unlock(&bnx2fc_dev_lock);
853
854 /* Ensure ALL destroy work has been completed before return */
855 flush_workqueue(bnx2fc_wq);
853 return; 856 return;
854 857
855 default: 858 default:
@@ -2389,6 +2392,9 @@ static void bnx2fc_ulp_exit(struct cnic_dev *dev)
2389 __bnx2fc_destroy(interface); 2392 __bnx2fc_destroy(interface);
2390 mutex_unlock(&bnx2fc_dev_lock); 2393 mutex_unlock(&bnx2fc_dev_lock);
2391 2394
2395 /* Ensure ALL destroy work has been completed before return */
2396 flush_workqueue(bnx2fc_wq);
2397
2392 bnx2fc_ulp_stop(hba); 2398 bnx2fc_ulp_stop(hba);
2393 /* unregister cnic device */ 2399 /* unregister cnic device */
2394 if (test_and_clear_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic)) 2400 if (test_and_clear_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic))