On Fri, May 22, 2015 at 19:35 +0200, mxb wrote:
> 
> Hey,
> got a panic as of todays ‘cvs up’
> trace below
> 
> panic: vmxnet3_rxintr: NULL ring->m[44]
> Stopped at      Debugger+0x9:   leave
> RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC!
> IF RUNNING SMP, USE 'mach ddbcpu <#>' AND 'trace' ON OTHER PROCESSORS, TOO.
> DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION!
> ddb{0}> Debugger() at Debugger+0x9
> panic() at panic+0xfe
> vmxnet3_rxintr() at vmxnet3_rxintr+0x284
> vmxnet3_intr() at vmxnet3_intr+0x4a
> intr_handler() at intr_handler+0x67
> Xintr_ioapic_level10() at Xintr_ioapic_level10+0xcd
> --- interrupt ---
> Xspllower() at Xspllower+0xe
> if_downall() at if_downall+0x9b
> boot() at boot+0xe4
> reboot() at reboot+0x26
> sys_reboot() at sys_reboot+0x5e
> syscall() at syscall+0x297
> --- syscall (number 55) ---
> end of kernel
> end trace frame: 0x7f7ffffd5858, count: -12
> 0x184f48704eda:
> ddb{0}> rebooting...
> OpenBSD 5.7-current (GENERIC.MP) #0: Fri May 22 16:30:54 CEST 2015
> 
> //mxb
> 

vmx doesn't check if it's wasn't stopped before calling rx/tx
interrupt routines...  the patch below should fix it up.  not
entirely sure why do they need to re-enable the interrupt
every time, but i'm pretty positive you don't want that if
you're !IFF_RUNNING.

diff --git sys/dev/pci/if_vmx.c sys/dev/pci/if_vmx.c
index 925a977..989cae1 100644
--- sys/dev/pci/if_vmx.c
+++ sys/dev/pci/if_vmx.c
@@ -588,21 +588,24 @@ vmxnet3_disable_all_intrs(struct vmxnet3_softc *sc)
 
 int
 vmxnet3_intr(void *arg)
 {
        struct vmxnet3_softc *sc = arg;
+       struct ifnet *ifp = &sc->sc_arpcom.ac_if;
 
        if (READ_BAR1(sc, VMXNET3_BAR1_INTR) == 0)
                return 0;
        if (sc->sc_ds->event)
                vmxnet3_evintr(sc);
-       vmxnet3_rxintr(sc, &sc->sc_rxq[0]);
-       vmxnet3_txintr(sc, &sc->sc_txq[0]);
 #ifdef VMXNET3_STAT
        vmxstat.intr++;
 #endif
-       vmxnet3_enable_intr(sc, 0);
+       if (ifp->if_flags & IFF_RUNNING) {
+               vmxnet3_rxintr(sc, &sc->sc_rxq[0]);
+               vmxnet3_txintr(sc, &sc->sc_txq[0]);
+               vmxnet3_enable_intr(sc, 0);
+       }
        return 1;
 }
 
 void
 vmxnet3_evintr(struct vmxnet3_softc *sc)

Reply via email to