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 *);