Module Name:    src
Committed By:   jdolecek
Date:           Wed Oct 19 19:34:31 UTC 2016

Modified Files:
        src/sys/dev/ic: nvme.c nvmevar.h

Log Message:
add debug code to check for completion queue corruption


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/dev/ic/nvme.c
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/ic/nvmevar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/nvme.c
diff -u src/sys/dev/ic/nvme.c:1.17 src/sys/dev/ic/nvme.c:1.18
--- src/sys/dev/ic/nvme.c:1.17	Wed Oct 19 19:31:23 2016
+++ src/sys/dev/ic/nvme.c	Wed Oct 19 19:34:31 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvme.c,v 1.17 2016/10/19 19:31:23 jdolecek Exp $	*/
+/*	$NetBSD: nvme.c,v 1.18 2016/10/19 19:34:31 jdolecek Exp $	*/
 /*	$OpenBSD: nvme.c,v 1.49 2016/04/18 05:59:50 dlg Exp $ */
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvme.c,v 1.17 2016/10/19 19:31:23 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvme.c,v 1.18 2016/10/19 19:34:31 jdolecek Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1069,6 +1069,18 @@ nvme_q_complete(struct nvme_softc *sc, s
 			q->q_cq_phase ^= NVME_CQE_PHASE;
 		}
 
+#ifdef DEBUG
+		/*
+		 * If we get spurious completion notification, something
+		 * is seriously hosed up. Very likely DMA to some random
+		 * memory place happened, so just bail out.
+		 */
+		if ((intptr_t)ccb->ccb_cookie == NVME_CCB_FREE) {
+			panic("%s: invalid ccb detected",
+			    device_xname(sc->sc_dev));
+			/* NOTREACHED */
+		}
+#endif
 		rv = 1;
 
 		/*
@@ -1314,8 +1326,12 @@ nvme_ccb_get(struct nvme_queue *q)
 
 	mutex_enter(&q->q_ccb_mtx);
 	ccb = SIMPLEQ_FIRST(&q->q_ccb_list);
-	if (ccb != NULL)
+	if (ccb != NULL) {
 		SIMPLEQ_REMOVE_HEAD(&q->q_ccb_list, ccb_entry);
+#ifdef DEBUG
+		ccb->ccb_cookie = NULL;
+#endif
+	}
 	mutex_exit(&q->q_ccb_mtx);
 
 	return ccb;
@@ -1326,6 +1342,9 @@ nvme_ccb_put(struct nvme_queue *q, struc
 {
 
 	mutex_enter(&q->q_ccb_mtx);
+#ifdef DEBUG
+	ccb->ccb_cookie = (void *)NVME_CCB_FREE;
+#endif
 	SIMPLEQ_INSERT_HEAD(&q->q_ccb_list, ccb, ccb_entry);
 	mutex_exit(&q->q_ccb_mtx);
 }

Index: src/sys/dev/ic/nvmevar.h
diff -u src/sys/dev/ic/nvmevar.h:1.7 src/sys/dev/ic/nvmevar.h:1.8
--- src/sys/dev/ic/nvmevar.h:1.7	Wed Oct 19 19:31:23 2016
+++ src/sys/dev/ic/nvmevar.h	Wed Oct 19 19:34:31 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvmevar.h,v 1.7 2016/10/19 19:31:23 jdolecek Exp $	*/
+/*	$NetBSD: nvmevar.h,v 1.8 2016/10/19 19:34:31 jdolecek Exp $	*/
 /*	$OpenBSD: nvmevar.h,v 1.8 2016/04/14 11:18:32 dlg Exp $ */
 
 /*
@@ -53,6 +53,7 @@ struct nvme_ccb {
 	/* command context */
 	uint16_t		ccb_id;
 	void			*ccb_cookie;
+#define NVME_CCB_FREE	0xbeefdeed
 	void			(*ccb_done)(struct nvme_queue *,
 				    struct nvme_ccb *, struct nvme_cqe *);
 

Reply via email to