Re: [PATCH 1/2] qla2xxx: perform lockless command completion in abort path

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> On Mar 12, 2023, at 9:37 PM, Nilesh Javali <njavali@xxxxxxxxxxx> wrote:
> 
> While adding and removing the controller, 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 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 <lilin@xxxxxxxxxx>
> Tested-by: Lin Li <lilin@xxxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Nilesh Javali <njavali@xxxxxxxxxxx>
> ---
> drivers/scsi/qla2xxx/qla_os.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
> index 545167627e48..d2f6c0546587 100644
> --- a/drivers/scsi/qla2xxx/qla_os.c
> +++ b/drivers/scsi/qla2xxx/qla_os.c
> @@ -1858,6 +1858,17 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res)
> for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) {
> sp = req->outstanding_cmds[cnt];
> if (sp) {
> + /*
> + * perform lockless completion while driver unload
> + */
> + if (qla2x00_chip_is_down(vha)) {
> + req->outstanding_cmds[cnt] = NULL;
> + spin_unlock_irqrestore(qp->qp_lock_ptr, flags);
> + sp->done(sp, res);
> + spin_lock_irqsave(qp->qp_lock_ptr, flags);
> + continue;
> + }
> +
> switch (sp->cmd_type) {
> case TYPE_SRB:
> qla2x00_abort_srb(qp, sp, res, &flags);
> -- 
> 2.19.0.rc0
> 

Looks Good. 

Reviewed-by: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx <mailto:himanshu.madhani@xxxxxxxxxx>>

-- 
Himanshu Madhani Oracle Linux Engineering





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux