summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorVisa Hankala <visa@cvs.openbsd.org>2015-10-08 14:24:33 +0000
committerVisa Hankala <visa@cvs.openbsd.org>2015-10-08 14:24:33 +0000
commitd07086ffd151f842a2c87f4a34a18d18c68491ef (patch)
tree27976996e26ca893fae1ee175947802095cc7ca4 /sys/arch
parent7052b52dfc25366f08b82b8a602f08f5ca8afe0e (diff)
Remove the sc_soft_req_cnt field because the number of tx requests is
already tracked in sc_sendq. Replace the sc_flush logic with a simple Fetch-and-Add store that avoids an unnecessary IOBDMA transaction. ok uebayasi@
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/octeon/dev/if_cnmac.c46
-rw-r--r--sys/arch/octeon/dev/if_cnmacvar.h4
2 files changed, 9 insertions, 41 deletions
diff --git a/sys/arch/octeon/dev/if_cnmac.c b/sys/arch/octeon/dev/if_cnmac.c
index ec5520aa963..3bc333c992b 100644
--- a/sys/arch/octeon/dev/if_cnmac.c
+++ b/sys/arch/octeon/dev/if_cnmac.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_cnmac.c,v 1.23 2015/06/11 12:30:42 jmatthew Exp $ */
+/* $OpenBSD: if_cnmac.c,v 1.24 2015/10/08 14:24:32 visa Exp $ */
/*
* Copyright (c) 2007 Internet Initiative Japan, Inc.
@@ -144,7 +144,6 @@ int octeon_eth_mediachange(struct ifnet *);
void octeon_eth_send_queue_flush_prefetch(struct octeon_eth_softc *);
void octeon_eth_send_queue_flush_fetch(struct octeon_eth_softc *);
void octeon_eth_send_queue_flush(struct octeon_eth_softc *);
-void octeon_eth_send_queue_flush_sync(struct octeon_eth_softc *);
int octeon_eth_send_queue_is_full(struct octeon_eth_softc *);
void octeon_eth_send_queue_add(struct octeon_eth_softc *,
struct mbuf *, uint64_t *);
@@ -589,7 +588,6 @@ octeon_eth_send_queue_flush(struct octeon_eth_softc *sc)
const int64_t sent_count = sc->sc_hard_done_cnt;
int i;
- OCTEON_ETH_KASSERT(sc->sc_flush == 0);
OCTEON_ETH_KASSERT(sent_count <= 0);
for (i = 0; i < 0 - sent_count; i++) {
@@ -603,25 +601,7 @@ octeon_eth_send_queue_flush(struct octeon_eth_softc *sc)
m_freem(m);
}
- cn30xxfau_op_inc_fetch_8(&sc->sc_fau_done, i);
- sc->sc_flush = i;
-}
-
-void
-octeon_eth_send_queue_flush_sync(struct octeon_eth_softc *sc)
-{
- if (sc->sc_flush == 0)
- return;
-
- OCTEON_ETH_KASSERT(sc->sc_flush > 0);
-
- /* XXX */
- cn30xxfau_op_inc_read_8(&sc->sc_fau_done);
- sc->sc_soft_req_cnt -= sc->sc_flush;
- OCTEON_ETH_KASSERT(sc->sc_soft_req_cnt >= 0);
- /* XXX */
-
- sc->sc_flush = 0;
+ cn30xxfau_op_add_8(&sc->sc_fau_done, i);
}
int
@@ -630,11 +610,10 @@ octeon_eth_send_queue_is_full(struct octeon_eth_softc *sc)
#ifdef OCTEON_ETH_SEND_QUEUE_CHECK
int64_t nofree_cnt;
- nofree_cnt = sc->sc_soft_req_cnt + sc->sc_hard_done_cnt;
+ nofree_cnt = ml_len(&sc->sc_sendq) + sc->sc_hard_done_cnt;
if (__predict_false(nofree_cnt == GATHER_QUEUE_SIZE - 1)) {
octeon_eth_send_queue_flush(sc);
- octeon_eth_send_queue_flush_sync(sc);
return 1;
}
@@ -1073,7 +1052,7 @@ octeon_eth_start(struct ifnet *ifp)
OCTEON_ETH_TAP(ifp, m, BPF_DIRECTION_OUT);
/* XXX */
- if (sc->sc_soft_req_cnt > sc->sc_soft_req_thresh)
+ if (ml_len(&sc->sc_sendq) > sc->sc_soft_req_thresh)
octeon_eth_send_queue_flush(sc);
if (octeon_eth_send(sc, m)) {
ifp->if_oerrors++;
@@ -1081,11 +1060,7 @@ octeon_eth_start(struct ifnet *ifp)
log(LOG_WARNING,
"%s: failed to transmit packet\n",
sc->sc_dev.dv_xname);
- } else {
- sc->sc_soft_req_cnt++;
}
- if (sc->sc_flush)
- octeon_eth_send_queue_flush_sync(sc);
/* XXX */
/*
@@ -1392,7 +1367,7 @@ octeon_eth_recv(struct octeon_eth_softc *sc, uint64_t *work)
* performance tuning
* presend iobdma request
*/
- if (sc->sc_soft_req_cnt > sc->sc_soft_req_thresh) {
+ if (ml_len(&sc->sc_sendq) > sc->sc_soft_req_thresh) {
octeon_eth_send_queue_flush_prefetch(sc);
}
/* XXX */
@@ -1426,15 +1401,11 @@ octeon_eth_recv(struct octeon_eth_softc *sc, uint64_t *work)
cn30xxipd_offload(word2, m->m_data, &m->m_pkthdr.csum_flags);
/* XXX */
- if (sc->sc_soft_req_cnt > sc->sc_soft_req_thresh) {
+ if (ml_len(&sc->sc_sendq) > sc->sc_soft_req_thresh) {
octeon_eth_send_queue_flush_fetch(sc);
octeon_eth_send_queue_flush(sc);
}
- /* XXX */
- if (sc->sc_flush)
- octeon_eth_send_queue_flush_sync(sc);
-
ml_enqueue(&ml, m);
if_input(ifp, &ml);
@@ -1442,7 +1413,7 @@ octeon_eth_recv(struct octeon_eth_softc *sc, uint64_t *work)
drop:
/* XXX */
- if (sc->sc_soft_req_cnt > sc->sc_soft_req_thresh) {
+ if (ml_len(&sc->sc_sendq) > sc->sc_soft_req_thresh) {
octeon_eth_send_queue_flush_fetch(sc);
}
/* XXX */
@@ -1489,11 +1460,10 @@ octeon_eth_tick_free(void *arg)
s = splnet();
/* XXX */
- if (sc->sc_soft_req_cnt > 0) {
+ if (ml_len(&sc->sc_sendq) > 0) {
octeon_eth_send_queue_flush_prefetch(sc);
octeon_eth_send_queue_flush_fetch(sc);
octeon_eth_send_queue_flush(sc);
- octeon_eth_send_queue_flush_sync(sc);
}
/* XXX */
diff --git a/sys/arch/octeon/dev/if_cnmacvar.h b/sys/arch/octeon/dev/if_cnmacvar.h
index 464aef225e7..06b985e8bd6 100644
--- a/sys/arch/octeon/dev/if_cnmacvar.h
+++ b/sys/arch/octeon/dev/if_cnmacvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_cnmacvar.h,v 1.6 2015/06/11 12:30:42 jmatthew Exp $ */
+/* $OpenBSD: if_cnmacvar.h,v 1.7 2015/10/08 14:24:32 visa Exp $ */
/*
* Copyright (c) 2007 Internet Initiative Japan, Inc.
@@ -76,10 +76,8 @@ struct octeon_eth_softc {
struct timeout sc_tick_free_ch;
struct timeout sc_resume_ch;
- int64_t sc_soft_req_cnt;
int64_t sc_soft_req_thresh;
int64_t sc_hard_done_cnt;
- int sc_flush;
int sc_prefetch;
struct mbuf_list sc_sendq;
uint64_t sc_ext_callback_cnt;