svn commit: r201698 - stable/7/sys/dev/bge
Pyun YongHyeon
yongari at FreeBSD.org
Wed Jan 6 23:57:18 UTC 2010
Author: yongari
Date: Wed Jan 6 23:57:17 2010
New Revision: 201698
URL: http://svn.freebsd.org/changeset/base/201698
Log:
MFC r196370:
- Do not try to reevaluate current RX production index on each
loop iteration as it can be updated by the card while we
process the RX ring forcing us to process RX descriptors
for which DMA synchronisation operation has not been
performed. This fixes the bug when bge(4) drops packets
under high load.
Modified:
stable/7/sys/dev/bge/if_bge.c
Directory Properties:
stable/7/sys/ (props changed)
stable/7/sys/cddl/contrib/opensolaris/ (props changed)
stable/7/sys/contrib/dev/acpica/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
Modified: stable/7/sys/dev/bge/if_bge.c
==============================================================================
--- stable/7/sys/dev/bge/if_bge.c Wed Jan 6 23:42:15 2010 (r201697)
+++ stable/7/sys/dev/bge/if_bge.c Wed Jan 6 23:57:17 2010 (r201698)
@@ -3139,12 +3139,14 @@ bge_rxeof(struct bge_softc *sc)
{
struct ifnet *ifp;
int stdcnt = 0, jumbocnt = 0;
+ uint16_t rx_prod, rx_cons;
BGE_LOCK_ASSERT(sc);
+ rx_cons = sc->bge_rx_saved_considx;
+ rx_prod = sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx;
/* Nothing to do. */
- if (sc->bge_rx_saved_considx ==
- sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx)
+ if (rx_cons == rx_prod)
return;
ifp = sc->bge_ifp;
@@ -3158,8 +3160,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_POSTWRITE);
- while(sc->bge_rx_saved_considx !=
- sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx) {
+ while (rx_cons != rx_prod) {
struct bge_rx_bd *cur_rx;
uint32_t rxidx;
struct mbuf *m = NULL;
@@ -3174,11 +3175,10 @@ bge_rxeof(struct bge_softc *sc)
}
#endif
- cur_rx =
- &sc->bge_ldata.bge_rx_return_ring[sc->bge_rx_saved_considx];
+ cur_rx = &sc->bge_ldata.bge_rx_return_ring[rx_cons];
rxidx = cur_rx->bge_idx;
- BGE_INC(sc->bge_rx_saved_considx, sc->bge_return_ring_cnt);
+ BGE_INC(rx_cons, sc->bge_return_ring_cnt);
if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING &&
cur_rx->bge_flags & BGE_RXBDFLAG_VLAN_TAG) {
@@ -3277,6 +3277,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_PREWRITE);
+ sc->bge_rx_saved_considx = rx_cons;
bge_writembx(sc, BGE_MBX_RX_CONS0_LO, sc->bge_rx_saved_considx);
if (stdcnt)
bge_writembx(sc, BGE_MBX_RX_STD_PROD_LO, sc->bge_std);
More information about the svn-src-all
mailing list