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)


Reply via email to