On Wed, Jan 03, 2024 at 01:04:05PM +0100, Alexander Bluhm wrote:
> On Wed, Jan 03, 2024 at 04:51:39PM +1000, Jonathan Matthew wrote:
> > On Wed, Jan 03, 2024 at 01:50:06AM +0100, Alexander Bluhm wrote:
> > > On Wed, Jan 03, 2024 at 12:26:26AM +0100, Hrvoje Popovski wrote:
> > > > While testing kettenis@ ipl diff from tech@ and doing iperf3 to bnxt
> > > > interface and ifconfig bnxt0 down/up at the same time I can trigger
> > > > panic. Panic can be triggered without kettenis@ diff...
> > > 
> > > It is easy to reproduce.  ifconfig bnxt1 down/up a few times while
> > > receiving TCP traffic with iperf3.  Machine still has kettenis@ diff.
> > > My panic looks different.
> > 
> > It looks like I wasn't trying very hard when I wrote bnxt_down().
> > I think there's also a problem with bnxt_up() unwinding after failure
> > in various places, but that's a different issue.
> > 
> > This makes it a more resilient for me, though it still logs
> > 'bnxt0: unexpected completion type 3' a lot if I take the interface
> > down while it's in use.  I'll look at that separately.
> 
> Should we intr_barrier(sc->sc_queues[0].q_ihc) if sc->sc_intrmap == NULL ?

In that case, we only have one interrupt vector and sc->sc_ih is its
cookie.

> 
> All these barriers make sense to me.  OK bluhm@

Thanks.

> 
> > Index: if_bnxt.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_bnxt.c,v
> > retrieving revision 1.39
> > diff -u -p -r1.39 if_bnxt.c
> > --- if_bnxt.c       10 Nov 2023 15:51:20 -0000      1.39
> > +++ if_bnxt.c       3 Jan 2024 06:36:02 -0000
> > @@ -1158,12 +1159,16 @@ bnxt_down(struct bnxt_softc *sc)
> >  
> >     CLR(ifp->if_flags, IFF_RUNNING);
> >  
> > +   intr_barrier(sc->sc_ih);
> > +
> >     for (i = 0; i < sc->sc_nqueues; i++) {
> >             ifq_clr_oactive(ifp->if_ifqs[i]);
> >             ifq_barrier(ifp->if_ifqs[i]);
> > -           /* intr barrier? */
> >  
> > -           timeout_del(&sc->sc_queues[i].q_rx.rx_refill);
> > +           timeout_del_barrier(&sc->sc_queues[i].q_rx.rx_refill);
> > +
> > +           if (sc->sc_intrmap != NULL)
> > +                   intr_barrier(sc->sc_queues[i].q_ihc);
> >     }
> >  
> >     bnxt_hwrm_free_filter(sc, &sc->sc_vnic);
> > 
> 

Reply via email to