Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 May 2009 21:50:04 GMT
From:      Xin LI <delphij@delphij.net>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/134548: bge(4) panics on shutdown under heavy traffic load
Message-ID:  <200905142150.n4ELo4JU017238@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/134548; it has been noted by GNATS.

From: Xin LI <delphij@delphij.net>
To: bug-followup@FreeBSD.org, pisymbol@gmail.com
Cc:  
Subject: Re: kern/134548: bge(4) panics on shutdown under heavy traffic load
Date: Thu, 14 May 2009 14:40:59 -0700

 This is a multi-part message in MIME format.
 --------------010504020606080505020502
 Content-Type: text/plain; charset=ISO-8859-1
 Content-Transfer-Encoding: 7bit
 
 My version of the patch:
 
  - Check IFF_RUNNING right after softc lock is re-obtained.
  - Avoid txeof calls after rxeof calls if IFF_RUNNING is disabled.
 
 --------------010504020606080505020502
 Content-Type: text/plain;
  name="if_bge.c.diff"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="if_bge.c.diff"
 
 Index: if_bge.c
 ===================================================================
 --- if_bge.c	(revision 191995)
 +++ if_bge.c	(working copy)
 @@ -3073,7 +3073,7 @@ bge_rxeof(struct bge_softc *sc)
  		bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag,
  		    sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_POSTREAD);
  
 -	while(sc->bge_rx_saved_considx !=
 +	while (sc->bge_rx_saved_considx !=
  	    sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx) {
  		struct bge_rx_bd	*cur_rx;
  		uint32_t		rxidx;
 @@ -3193,6 +3193,9 @@ bge_rxeof(struct bge_softc *sc)
  		BGE_UNLOCK(sc);
  		(*ifp->if_input)(ifp, m);
  		BGE_LOCK(sc);
 +
 +		if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
 +			return;
  	}
  
  	if (stdcnt > 0)
 @@ -3301,6 +3304,10 @@ bge_poll(struct ifnet *ifp, enum poll_cmd cmd, int
  
  	sc->rxcycles = count;
  	bge_rxeof(sc);
 +	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
 +		BGE_UNLOCK(sc);
 +		return;
 +	}
  	bge_txeof(sc);
  	if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
  		bge_start_locked(ifp);
 @@ -3370,7 +3377,9 @@ bge_intr(void *xsc)
  	if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
  		/* Check RX return ring producer/consumer. */
  		bge_rxeof(sc);
 +	}
  
 +	if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
  		/* Check TX ring producer/consumer. */
  		bge_txeof(sc);
  	}
 
 --------------010504020606080505020502--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905142150.n4ELo4JU017238>