Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci Don't use config_deferred_interrupts() for vioif...
details: https://anonhg.NetBSD.org/src/rev/bb57e5c4dee8
branches: trunk
changeset: 801662:bb57e5c4dee8
user: pooka <pooka%NetBSD.org@localhost>
date: Wed Aug 13 14:35:46 2014 +0000
description:
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.
diffstat:
sys/dev/pci/if_vioif.c | 16 +++++++++++-----
1 files changed, 11 insertions(+), 5 deletions(-)
diffs (51 lines):
diff -r b8c3efb205b9 -r bb57e5c4dee8 sys/dev/pci/if_vioif.c
--- a/sys/dev/pci/if_vioif.c Wed Aug 13 14:13:04 2014 +0000
+++ b/sys/dev/pci/if_vioif.c Wed Aug 13 14:35:46 2014 +0000
@@ -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 @@
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 @@
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_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;
Home |
Main Index |
Thread Index |
Old Index