Skip to content

Commit

Permalink
scsi: qla2xxx: Fix missed DMA unmap for NVMe ls requests
Browse files Browse the repository at this point in the history
At NVMe ELS request time, request structure is DMA mapped and never
unmapped. Fix this by calling the unmap on ELS completion.

Link: https://lore.kernel.org/r/20220310092604.22950-5-njavali@marvell.com
Fixes: e84067d ("scsi: qla2xxx: Add FC-NVMe F/W initialization and transport registration")
Cc: stable@vger.kernel.org
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Arun Easi <aeasi@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Arun Easi authored and Martin K. Petersen committed Mar 15, 2022
1 parent db212f2 commit c85ab7d
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions drivers/scsi/qla2xxx/qla_nvme.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,18 @@ static void qla_nvme_release_fcp_cmd_kref(struct kref *kref)
qla2xxx_rel_qpair_sp(sp->qpair, sp);
}

static void qla_nvme_ls_unmap(struct srb *sp, struct nvmefc_ls_req *fd)
{
if (sp->flags & SRB_DMA_VALID) {
struct srb_iocb *nvme = &sp->u.iocb_cmd;
struct qla_hw_data *ha = sp->fcport->vha->hw;

dma_unmap_single(&ha->pdev->dev, nvme->u.nvme.cmd_dma,
fd->rqstlen, DMA_TO_DEVICE);
sp->flags &= ~SRB_DMA_VALID;
}
}

static void qla_nvme_release_ls_cmd_kref(struct kref *kref)
{
struct srb *sp = container_of(kref, struct srb, cmd_kref);
Expand All @@ -191,6 +203,8 @@ static void qla_nvme_release_ls_cmd_kref(struct kref *kref)
spin_unlock_irqrestore(&priv->cmd_lock, flags);

fd = priv->fd;

qla_nvme_ls_unmap(sp, fd);
fd->done(fd, priv->comp_status);
out:
qla2x00_rel_sp(sp);
Expand Down Expand Up @@ -361,13 +375,16 @@ static int qla_nvme_ls_req(struct nvme_fc_local_port *lport,
dma_sync_single_for_device(&ha->pdev->dev, nvme->u.nvme.cmd_dma,
fd->rqstlen, DMA_TO_DEVICE);

sp->flags |= SRB_DMA_VALID;

rval = qla2x00_start_sp(sp);
if (rval != QLA_SUCCESS) {
ql_log(ql_log_warn, vha, 0x700e,
"qla2x00_start_sp failed = %d\n", rval);
wake_up(&sp->nvme_ls_waitq);
sp->priv = NULL;
priv->sp = NULL;
qla_nvme_ls_unmap(sp, fd);
qla2x00_rel_sp(sp);
return rval;
}
Expand Down

0 comments on commit c85ab7d

Please sign in to comment.