Any chance to get this committed?
Stepped on it once more without this patch.

//mxb

On 2015-05-22 19:53, Mike Belopuhov 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)

Reply via email to