Not sure if I’ll be able to reproduce this at all. Never seen this before. But diff is applied.
//mxb > On 22 maj 2015, at 19:53, Mike Belopuhov <m...@belopuhov.com> wrote: > > 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)