Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a564de3 authored by Arun Easi's avatar Arun Easi Committed by Greg Kroah-Hartman
Browse files

scsi: qla2xxx: Fix DMA-API call trace on NVMe LS requests



commit c75e6aef5039830cce5d4cf764dd204522f89e6b upstream.

The following message and call trace was seen with debug kernels:

DMA-API: qla2xxx 0000:41:00.0: device driver failed to check map
error [device address=0x00000002a3ff38d8] [size=1024 bytes] [mapped as
single]
WARNING: CPU: 0 PID: 2930 at kernel/dma/debug.c:1017
	 check_unmap+0xf42/0x1990

Call Trace:
	debug_dma_unmap_page+0xc9/0x100
	qla_nvme_ls_unmap+0x141/0x210 [qla2xxx]

Remove DMA mapping from the driver altogether, as it is already done by FC
layer. This prevents the warning.

Fixes: c85ab7d9e27a ("scsi: qla2xxx: Fix missed DMA unmap for NVMe ls requests")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarArun Easi <aeasi@marvell.com>
Signed-off-by: default avatarNilesh Javali <njavali@marvell.com>
Reviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 05a0f6fa
Loading
Loading
Loading
Loading
+1 −18
Original line number Diff line number Diff line
@@ -152,18 +152,6 @@ 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);
@@ -181,7 +169,6 @@ static void qla_nvme_release_ls_cmd_kref(struct kref *kref)

	fd = priv->fd;

	qla_nvme_ls_unmap(sp, fd);
	fd->done(fd, priv->comp_status);
out:
	qla2x00_rel_sp(sp);
@@ -323,13 +310,10 @@ static int qla_nvme_ls_req(struct nvme_fc_local_port *lport,
	nvme->u.nvme.rsp_len = fd->rsplen;
	nvme->u.nvme.rsp_dma = fd->rspdma;
	nvme->u.nvme.timeout_sec = fd->timeout;
	nvme->u.nvme.cmd_dma = dma_map_single(&ha->pdev->dev, fd->rqstaddr,
	    fd->rqstlen, DMA_TO_DEVICE);
	nvme->u.nvme.cmd_dma = fd->rqstdma;
	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,
@@ -337,7 +321,6 @@ static int qla_nvme_ls_req(struct nvme_fc_local_port *lport,
		wake_up(&sp->nvme_ls_waitq);
		sp->priv = NULL;
		priv->sp = NULL;
		qla_nvme_ls_unmap(sp, fd);
		qla2x00_rel_sp(sp);
		return rval;
	}