sfxge: expect required init_state on data path and in periodic calls
With the patch applied the number of instruction events is 1% less and number of mispredicted branch events is 5% less under multistream TCP traffic load close to line rate. Sponsored by: Solarflare Communications, Inc. Approved by: gnn (mentor)
This commit is contained in:
parent
b83391bf44
commit
851128b8de
@ -103,7 +103,7 @@ sfxge_ev_rx(void *arg, uint32_t label, uint32_t id, uint32_t size,
|
||||
KASSERT(evq->index == rxq->index,
|
||||
("evq->index != rxq->index"));
|
||||
|
||||
if (rxq->init_state != SFXGE_RXQ_STARTED)
|
||||
if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED))
|
||||
goto done;
|
||||
|
||||
expected = rxq->pending++ & rxq->ptr_mask;
|
||||
@ -256,7 +256,7 @@ sfxge_ev_tx(void *arg, uint32_t label, uint32_t id)
|
||||
KASSERT(evq->index == txq->evq_index,
|
||||
("evq->index != txq->evq_index"));
|
||||
|
||||
if (txq->init_state != SFXGE_TXQ_STARTED)
|
||||
if (__predict_false(txq->init_state != SFXGE_TXQ_STARTED))
|
||||
goto done;
|
||||
|
||||
stop = (id + 1) & txq->ptr_mask;
|
||||
@ -433,7 +433,7 @@ sfxge_ev_stat_update(struct sfxge_softc *sc)
|
||||
|
||||
SFXGE_ADAPTER_LOCK(sc);
|
||||
|
||||
if (sc->evq[0]->init_state != SFXGE_EVQ_STARTED)
|
||||
if (__predict_false(sc->evq[0]->init_state != SFXGE_EVQ_STARTED))
|
||||
goto out;
|
||||
|
||||
now = ticks;
|
||||
@ -598,8 +598,8 @@ sfxge_ev_qpoll(struct sfxge_evq *evq)
|
||||
|
||||
SFXGE_EVQ_LOCK(evq);
|
||||
|
||||
if (evq->init_state != SFXGE_EVQ_STARTING &&
|
||||
evq->init_state != SFXGE_EVQ_STARTED) {
|
||||
if (__predict_false(evq->init_state != SFXGE_EVQ_STARTING &&
|
||||
evq->init_state != SFXGE_EVQ_STARTED)) {
|
||||
rc = EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ sfxge_intr_message(void *arg)
|
||||
KASSERT(intr->type == EFX_INTR_MESSAGE,
|
||||
("intr->type != EFX_INTR_MESSAGE"));
|
||||
|
||||
if (intr->state != SFXGE_INTR_STARTED)
|
||||
if (__predict_false(intr->state != SFXGE_INTR_STARTED))
|
||||
return;
|
||||
|
||||
(void)efx_intr_status_message(enp, index, &fatal);
|
||||
|
@ -50,7 +50,7 @@ sfxge_mac_stat_update(struct sfxge_softc *sc)
|
||||
|
||||
SFXGE_PORT_LOCK_ASSERT_OWNED(port);
|
||||
|
||||
if (port->init_state != SFXGE_PORT_STARTED) {
|
||||
if (__predict_false(port->init_state != SFXGE_PORT_STARTED)) {
|
||||
rc = 0;
|
||||
goto out;
|
||||
}
|
||||
@ -241,7 +241,7 @@ sfxge_port_wanted_fc_handler(SYSCTL_HANDLER_ARGS)
|
||||
SFXGE_PORT_LOCK(port);
|
||||
|
||||
if (port->wanted_fc != fcntl) {
|
||||
if (port->init_state == SFXGE_PORT_STARTED)
|
||||
if (__predict_false(port->init_state == SFXGE_PORT_STARTED))
|
||||
error = efx_mac_fcntl_set(sc->enp,
|
||||
port->wanted_fc,
|
||||
B_TRUE);
|
||||
@ -272,7 +272,8 @@ sfxge_port_link_fc_handler(SYSCTL_HANDLER_ARGS)
|
||||
port = &sc->port;
|
||||
|
||||
SFXGE_PORT_LOCK(port);
|
||||
if (port->init_state == SFXGE_PORT_STARTED && SFXGE_LINK_UP(sc))
|
||||
if (__predict_true(port->init_state == SFXGE_PORT_STARTED) &&
|
||||
SFXGE_LINK_UP(sc))
|
||||
efx_mac_fcntl_get(sc->enp, &wanted_fc, &link_fc);
|
||||
else
|
||||
link_fc = 0;
|
||||
@ -327,7 +328,7 @@ sfxge_mac_poll_work(void *arg, int npending)
|
||||
|
||||
SFXGE_PORT_LOCK(port);
|
||||
|
||||
if (port->init_state != SFXGE_PORT_STARTED)
|
||||
if (__predict_false(port->init_state != SFXGE_PORT_STARTED))
|
||||
goto done;
|
||||
|
||||
/* This may sleep waiting for MCDI completion */
|
||||
@ -394,7 +395,7 @@ sfxge_mac_filter_set(struct sfxge_softc *sc)
|
||||
* lock is held in sleeping thread. Both problems are repeatable
|
||||
* on LAG with LACP proto bring up.
|
||||
*/
|
||||
if (port->init_state == SFXGE_PORT_STARTED)
|
||||
if (__predict_true(port->init_state == SFXGE_PORT_STARTED))
|
||||
rc = sfxge_mac_filter_set_locked(sc);
|
||||
else
|
||||
rc = 0;
|
||||
@ -518,7 +519,7 @@ sfxge_phy_stat_update(struct sfxge_softc *sc)
|
||||
|
||||
SFXGE_PORT_LOCK_ASSERT_OWNED(port);
|
||||
|
||||
if (port->init_state != SFXGE_PORT_STARTED) {
|
||||
if (__predict_false(port->init_state != SFXGE_PORT_STARTED)) {
|
||||
rc = 0;
|
||||
goto out;
|
||||
}
|
||||
|
@ -209,7 +209,7 @@ sfxge_rx_qfill(struct sfxge_rxq *rxq, unsigned int target, boolean_t retrying)
|
||||
|
||||
SFXGE_EVQ_LOCK_ASSERT_OWNED(evq);
|
||||
|
||||
if (rxq->init_state != SFXGE_RXQ_STARTED)
|
||||
if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED))
|
||||
return;
|
||||
|
||||
rxfill = rxq->added - rxq->completed;
|
||||
@ -269,7 +269,7 @@ void
|
||||
sfxge_rx_qrefill(struct sfxge_rxq *rxq)
|
||||
{
|
||||
|
||||
if (rxq->init_state != SFXGE_RXQ_STARTED)
|
||||
if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED))
|
||||
return;
|
||||
|
||||
/* Make sure the queue is full */
|
||||
@ -760,7 +760,7 @@ sfxge_rx_qcomplete(struct sfxge_rxq *rxq, boolean_t eop)
|
||||
rx_desc = &rxq->queue[id];
|
||||
m = rx_desc->mbuf;
|
||||
|
||||
if (rxq->init_state != SFXGE_RXQ_STARTED)
|
||||
if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED))
|
||||
goto discard;
|
||||
|
||||
if (rx_desc->flags & (EFX_ADDR_MISMATCH | EFX_DISCARD))
|
||||
|
@ -311,7 +311,7 @@ static int sfxge_tx_queue_mbuf(struct sfxge_txq *txq, struct mbuf *mbuf)
|
||||
if (mbuf->m_pkthdr.csum_flags & CSUM_TSO)
|
||||
prefetch_read_many(mbuf->m_data);
|
||||
|
||||
if (txq->init_state != SFXGE_TXQ_STARTED) {
|
||||
if (__predict_false(txq->init_state != SFXGE_TXQ_STARTED)) {
|
||||
rc = EINTR;
|
||||
goto reject;
|
||||
}
|
||||
@ -1143,7 +1143,7 @@ sfxge_tx_qunblock(struct sfxge_txq *txq)
|
||||
|
||||
SFXGE_EVQ_LOCK_ASSERT_OWNED(evq);
|
||||
|
||||
if (txq->init_state != SFXGE_TXQ_STARTED)
|
||||
if (__predict_false(txq->init_state != SFXGE_TXQ_STARTED))
|
||||
return;
|
||||
|
||||
SFXGE_TXQ_LOCK(txq);
|
||||
|
Loading…
x
Reference in New Issue
Block a user