Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Dec 2019 14:28:38 +0000 (UTC)
From:      Michal Meloun <mmel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r355774 - head/sys/dev/nvme
Message-ID:  <201912151428.xBFEScHJ088540@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mmel
Date: Sun Dec 15 14:28:38 2019
New Revision: 355774
URL: https://svnweb.freebsd.org/changeset/base/355774

Log:
  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.
  
  MFC after:	3 weeks

Modified:
  head/sys/dev/nvme/nvme_qpair.c

Modified: head/sys/dev/nvme/nvme_qpair.c
==============================================================================
--- head/sys/dev/nvme/nvme_qpair.c	Sun Dec 15 14:09:49 2019	(r355773)
+++ head/sys/dev/nvme/nvme_qpair.c	Sun Dec 15 14:28:38 2019	(r355774)
@@ -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?201912151428.xBFEScHJ088540>