Index: nvme_pci.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/nvme_pci.c,v
retrieving revision 1.26
diff -p -u -r1.26 nvme_pci.c
--- nvme_pci.c	23 Jan 2019 06:56:19 -0000	1.26
+++ nvme_pci.c	6 Jun 2019 01:25:02 -0000
@@ -56,6 +56,7 @@ __KERNEL_RCSID(0, "$NetBSD: nvme_pci.c,v
 #include <sys/kmem.h>
 #include <sys/pmf.h>
 #include <sys/module.h>
+#include <sys/kthread.h>
 
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
@@ -73,6 +74,7 @@ int nvme_pci_mq = 1;		/* INTx: ioq=1, MS
 struct nvme_pci_softc {
 	struct nvme_softc	psc_nvme;
 
+	struct pci_attach_args	psc_pa;
 	pci_chipset_tag_t	psc_pc;
 	pci_intr_handle_t	*psc_intrs;
 	int			psc_nintrs;
@@ -80,6 +82,7 @@ struct nvme_pci_softc {
 
 static int	nvme_pci_match(device_t, cfdata_t, void *);
 static void	nvme_pci_attach(device_t, device_t, void *);
+static void	nvme_pci_config_interrupts(device_t);
 static int	nvme_pci_detach(device_t, int);
 static int	nvme_pci_rescan(device_t, const char *, const int *);
 
@@ -145,11 +148,6 @@ nvme_pci_attach(device_t parent, device_
 	struct nvme_pci_softc *psc = device_private(self);
 	struct nvme_softc *sc = &psc->psc_nvme;
 	struct pci_attach_args *pa = aux;
-	const struct nvme_pci_quirk *quirk;
-	pcireg_t memtype, reg;
-	bus_addr_t memaddr;
-	int flags, error;
-	int msixoff;
 
 	sc->sc_dev = self;
 	psc->psc_pc = pa->pa_pc;
@@ -160,6 +158,27 @@ nvme_pci_attach(device_t parent, device_
 
 	pci_aprint_devinfo(pa, NULL);
 
+	psc->psc_pa = *pa;
+#if 1
+	/* Defer real attachment until after all CPUs will be ready. */
+	config_interrupts(self, nvme_pci_config_interrupts);
+#else
+	nvme_pci_config_interrupts(self);
+#endif
+}
+
+static void
+nvme_pci_config_interrupts(device_t self)
+{
+	struct nvme_pci_softc *psc = device_private(self);
+	struct nvme_softc *sc = &psc->psc_nvme;
+	struct pci_attach_args *pa = &psc->psc_pa;
+	const struct nvme_pci_quirk *quirk;
+	pcireg_t memtype, reg;
+	bus_addr_t memaddr;
+	int flags, error;
+	int msixoff;
+
 	/* Map registers */
 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, NVME_PCI_BAR);
 	if (PCI_MAPREG_TYPE(memtype) != PCI_MAPREG_TYPE_MEM) {
@@ -319,7 +338,7 @@ nvme_pci_intr_establish(struct nvme_soft
 
 	/* establish hardware interrupt */
 	sc->sc_ih[qid] = pci_intr_establish_xname(psc->psc_pc,
-	    psc->psc_intrs[qid], IPL_BIO, ih_func, ih_arg, intr_xname);
+	    psc->psc_intrs[qid], IPL_SCHED, ih_func, ih_arg, intr_xname);
 	if (sc->sc_ih[qid] == NULL) {
 		aprint_error_dev(sc->sc_dev,
 		    "unable to establish %s interrupt\n", intr_xname);