Module Name:    src
Committed By:   pooka
Date:           Wed Aug 13 14:35:46 UTC 2014

Modified Files:
        src/sys/dev/pci: if_vioif.c

Log Message:
Don't use config_deferred_interrupts() for vioif_deferred_init(),
just run it once as part of if_init().  The problem with the former
is that it will execute the deferred init routine in-place when !cold,
and since vioif_deferred_init() finishing depends on virtio interrupts
which are established only after config_deferred_interrupts() is called,
the vioif attach method would deadlock when !cold.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/pci/if_vioif.c

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/pci/if_vioif.c
diff -u src/sys/dev/pci/if_vioif.c:1.7 src/sys/dev/pci/if_vioif.c:1.8
--- src/sys/dev/pci/if_vioif.c:1.7	Tue Jul 22 02:21:50 2014
+++ src/sys/dev/pci/if_vioif.c	Wed Aug 13 14:35:46 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_vioif.c,v 1.7 2014/07/22 02:21:50 ozaki-r Exp $	*/
+/*	$NetBSD: if_vioif.c,v 1.8 2014/08/13 14:35:46 pooka Exp $	*/
 
 /*
  * Copyright (c) 2010 Minoura Makoto.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.7 2014/07/22 02:21:50 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.8 2014/08/13 14:35:46 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -155,7 +155,7 @@ struct vioif_softc {
 
 	uint8_t			sc_mac[ETHER_ADDR_LEN];
 	struct ethercom		sc_ethercom;
-	short			sc_ifflags;
+	short			sc_deferred_init_done;
 
 	/* bus_dmamem */
 	bus_dma_segment_t	sc_hdr_segs[1];
@@ -602,8 +602,6 @@ vioif_attach(device_t parent, device_t s
 
 	if (vioif_alloc_mems(sc) < 0)
 		goto err;
-	if (vsc->sc_nvqs == 3)
-		config_interrupts(self, vioif_deferred_init);
 
 	strlcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
 	ifp->if_softc = sc;
@@ -670,6 +668,14 @@ vioif_init(struct ifnet *ifp)
 
 	vioif_stop(ifp, 0);
 
+	if (!sc->sc_deferred_init_done) {
+		struct virtio_softc *vsc = sc->sc_virtio;
+
+		sc->sc_deferred_init_done = 1;
+		if (vsc->sc_nvqs == 3)
+			vioif_deferred_init(sc->sc_dev);
+	}
+
 	/* Have to set false before vioif_populate_rx_mbufs */
 	sc->sc_stopping = false;
 

Reply via email to