? sys/dev/acpi/.acpi_pci_link.c.kate-swp Index: sys/dev/ic/nvme.c =================================================================== RCS file: /cvsroot/src/sys/dev/ic/nvme.c,v retrieving revision 1.67 diff -u -p -r1.67 nvme.c --- sys/dev/ic/nvme.c 13 Sep 2022 10:14:20 -0000 1.67 +++ sys/dev/ic/nvme.c 27 Oct 2022 10:19:25 -0000 @@ -1352,6 +1352,16 @@ nvme_op_sq_leave(struct nvme_softc *sc, mutex_exit(&q->q_sq_mtx); } + +static void +nvme_timeout(void *arg) +{ + struct nvme_queue *q = arg; + + printf_nolog("%s: queue %d\n", __func__, q->q_id); +} + + static void nvme_q_submit(struct nvme_softc *sc, struct nvme_queue *q, struct nvme_ccb *ccb, void (*fill)(struct nvme_queue *, struct nvme_ccb *, void *)) @@ -1371,6 +1381,10 @@ nvme_q_submit(struct nvme_softc *sc, str bus_dmamap_sync(sc->sc_dmat, NVME_DMA_MAP(q->q_sq_dmamem), sizeof(*sqe) * tail, sizeof(*sqe), BUS_DMASYNC_PREWRITE); + if (!callout_pending(sc->sc_callout[q->q_id])) { + callout_reset(sc->sc_callout[q->q_id], hz, nvme_timeout, q); + } + sc->sc_ops->op_sq_leave(sc, q, ccb); } @@ -1539,6 +1553,8 @@ nvme_q_complete(struct nvme_softc *sc, s if (rv) nvme_write4(sc, q->q_cqhdbl, q->q_cq_head); + callout_stop(sc->sc_callout[q->q_id]); + mutex_exit(&q->q_cq_mtx); return rv; @@ -2066,6 +2082,8 @@ nvme_intr_msi(void *xq) KASSERT(q->q_sc->sc_softih); KASSERT(q->q_sc->sc_softih[q->q_id]); + callout_reset(q->q_sc->sc_callout[q->q_id], hz, nvme_timeout, q); + /* * MSI/MSI-X are edge triggered, so can handover processing to softint * without masking the interrupt. Index: sys/dev/ic/nvmevar.h =================================================================== RCS file: /cvsroot/src/sys/dev/ic/nvmevar.h,v retrieving revision 1.28 diff -u -p -r1.28 nvmevar.h --- sys/dev/ic/nvmevar.h 14 Aug 2022 12:08:57 -0000 1.28 +++ sys/dev/ic/nvmevar.h 27 Oct 2022 10:19:25 -0000 @@ -143,6 +143,7 @@ struct nvme_softc { void **sc_ih; /* interrupt handlers */ void **sc_softih; /* softintr handlers */ + callout_t **sc_callout; /* callouts */ u_int sc_rdy_to; /* RDY timeout */ size_t sc_mps; /* memory page size */ size_t sc_mdts; /* max data trasfer size */ Index: sys/dev/pci/nvme_pci.c =================================================================== RCS file: /cvsroot/src/sys/dev/pci/nvme_pci.c,v retrieving revision 1.37 diff -u -p -r1.37 nvme_pci.c --- sys/dev/pci/nvme_pci.c 15 Aug 2022 18:06:04 -0000 1.37 +++ sys/dev/pci/nvme_pci.c 27 Oct 2022 10:19:25 -0000 @@ -228,6 +228,7 @@ nvme_pci_attach(device_t parent, device_ sc->sc_ih = kmem_zalloc(sizeof(*sc->sc_ih) * psc->psc_nintrs, KM_SLEEP); sc->sc_softih = kmem_zalloc( sizeof(*sc->sc_softih) * psc->psc_nintrs, KM_SLEEP); + sc->sc_callout = kmem_zalloc(sizeof(*sc->sc_callout) * psc->psc_nintrs, KM_SLEEP); if (nvme_attach(sc) != 0) { /* error printed by nvme_attach() */ @@ -241,6 +242,7 @@ nvme_pci_attach(device_t parent, device_ return; softintr_free: + kmem_free(sc->sc_callout, sizeof(*sc->sc_callout) * psc->psc_nintrs); kmem_free(sc->sc_softih, sizeof(*sc->sc_softih) * psc->psc_nintrs); kmem_free(sc->sc_ih, sizeof(*sc->sc_ih) * psc->psc_nintrs); sc->sc_nq = 0; @@ -300,6 +302,9 @@ nvme_pci_detach(device_t self, int flags if (error) return error; + kmem_free(sc->sc_callout, sizeof(*sc->sc_callout) * psc->psc_nintrs); + sc->sc_callout = NULL; + kmem_free(sc->sc_softih, sizeof(*sc->sc_softih) * psc->psc_nintrs); sc->sc_softih = NULL; @@ -372,6 +377,8 @@ nvme_pci_intr_establish(struct nvme_soft return 1; } + callout_init(sc->sc_callout[qid], CALLOUT_MPSAFE); + intrstr = pci_intr_string(psc->psc_pc, psc->psc_intrs[qid], intrbuf, sizeof(intrbuf)); if (!sc->sc_use_mq) {