Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Jan 2020 00:48:54 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r356957 - stable/12/sys/dev/nvme
Message-ID:  <202001220048.00M0msG0029698@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Wed Jan 22 00:48:54 2020
New Revision: 356957
URL: https://svnweb.freebsd.org/changeset/base/356957

Log:
  MFC r355774 (by mmel): Properly synchronize completion DMA buffers.
  
  Within command completion processing the callback function may access
  DMAed data buffer. Synchronize it before use, not after.
  This allows to use NVMe disk on non-DMA coherent arm64 system.

Modified:
  stable/12/sys/dev/nvme/nvme_qpair.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/nvme/nvme_qpair.c
==============================================================================
--- stable/12/sys/dev/nvme/nvme_qpair.c	Wed Jan 22 00:46:09 2020	(r356956)
+++ stable/12/sys/dev/nvme/nvme_qpair.c	Wed Jan 22 00:48:54 2020	(r356957)
@@ -444,8 +444,15 @@ nvme_qpair_complete_tracker(struct nvme_tracker *tr,
 
 	KASSERT(cpl->cid == req->cmd.cid, ("cpl cid does not match cmd cid\n"));
 
-	if (req->cb_fn && !retry)
-		req->cb_fn(req->cb_arg, cpl);
+	if (!retry) {
+		if (req->type != NVME_REQUEST_NULL) {
+			bus_dmamap_sync(qpair->dma_tag_payload,
+			    tr->payload_dma_map,
+			    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+		}
+		if (req->cb_fn)
+			req->cb_fn(req->cb_arg, cpl);
+	}
 
 	mtx_lock(&qpair->lock);
 	callout_stop(&tr->timer);
@@ -455,9 +462,6 @@ nvme_qpair_complete_tracker(struct nvme_tracker *tr,
 		nvme_qpair_submit_tracker(qpair, tr);
 	} else {
 		if (req->type != NVME_REQUEST_NULL) {
-			bus_dmamap_sync(qpair->dma_tag_payload,
-			    tr->payload_dma_map,
-			    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 			bus_dmamap_unload(qpair->dma_tag_payload,
 			    tr->payload_dma_map);
 		}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202001220048.00M0msG0029698>