Skip to content

Commit 0367076

Browse files
njavalimartinkpetersen
authored andcommitted
scsi: qla2xxx: Perform lockless command completion in abort path
While adding and removing the controller, the following call trace was observed: WARNING: CPU: 3 PID: 623596 at kernel/dma/mapping.c:532 dma_free_attrs+0x33/0x50 CPU: 3 PID: 623596 Comm: sh Kdump: loaded Not tainted 5.14.0-96.el9.x86_64 #1 RIP: 0010:dma_free_attrs+0x33/0x50 Call Trace: qla2x00_async_sns_sp_done+0x107/0x1b0 [qla2xxx] qla2x00_abort_srb+0x8e/0x250 [qla2xxx] ? ql_dbg+0x70/0x100 [qla2xxx] __qla2x00_abort_all_cmds+0x108/0x190 [qla2xxx] qla2x00_abort_all_cmds+0x24/0x70 [qla2xxx] qla2x00_abort_isp_cleanup+0x305/0x3e0 [qla2xxx] qla2x00_remove_one+0x364/0x400 [qla2xxx] pci_device_remove+0x36/0xa0 __device_release_driver+0x17a/0x230 device_release_driver+0x24/0x30 pci_stop_bus_device+0x68/0x90 pci_stop_and_remove_bus_device_locked+0x16/0x30 remove_store+0x75/0x90 kernfs_fop_write_iter+0x11c/0x1b0 new_sync_write+0x11f/0x1b0 vfs_write+0x1eb/0x280 ksys_write+0x5f/0xe0 do_syscall_64+0x5c/0x80 ? do_user_addr_fault+0x1d8/0x680 ? do_syscall_64+0x69/0x80 ? exc_page_fault+0x62/0x140 ? asm_exc_page_fault+0x8/0x30 entry_SYSCALL_64_after_hwframe+0x44/0xae The command was completed in the abort path during driver unload with a lock held, causing the warning in abort path. Hence complete the command without any lock held. Reported-by: Lin Li <[email protected]> Tested-by: Lin Li <[email protected]> Cc: [email protected] Signed-off-by: Nilesh Javali <[email protected]> Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Himanshu Madhani <[email protected]> Reviewed-by: John Meneghini <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent a204b49 commit 0367076

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

drivers/scsi/qla2xxx/qla_os.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1865,6 +1865,17 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res)
18651865
for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) {
18661866
sp = req->outstanding_cmds[cnt];
18671867
if (sp) {
1868+
/*
1869+
* perform lockless completion during driver unload
1870+
*/
1871+
if (qla2x00_chip_is_down(vha)) {
1872+
req->outstanding_cmds[cnt] = NULL;
1873+
spin_unlock_irqrestore(qp->qp_lock_ptr, flags);
1874+
sp->done(sp, res);
1875+
spin_lock_irqsave(qp->qp_lock_ptr, flags);
1876+
continue;
1877+
}
1878+
18681879
switch (sp->cmd_type) {
18691880
case TYPE_SRB:
18701881
qla2x00_abort_srb(qp, sp, res, &flags);

0 commit comments

Comments
 (0)