From 21f6411c893111507b0b8a1cc86aa15f9fb3da3d Mon Sep 17 00:00:00 2001 From: Ivan Malov Date: Thu, 15 Dec 2016 12:51:13 +0000 Subject: [PATCH] net/sfc: support Tx free threshold Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andrew Lee Reviewed-by: Robert Stonehouse --- drivers/net/sfc/sfc_ethdev.c | 1 + drivers/net/sfc/sfc_tweak.h | 3 +++ drivers/net/sfc/sfc_tx.c | 14 ++++++++------ drivers/net/sfc/sfc_tx.h | 10 +--------- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 6d5e79df54..6dafdebcdc 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -863,6 +863,7 @@ sfc_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t tx_queue_id, memset(qinfo, 0, sizeof(*qinfo)); qinfo->conf.txq_flags = txq_info->txq->flags; + qinfo->conf.tx_free_thresh = txq_info->txq->free_thresh; qinfo->nb_desc = txq_info->entries; sfc_adapter_unlock(sa); diff --git a/drivers/net/sfc/sfc_tweak.h b/drivers/net/sfc/sfc_tweak.h index 8a60f35120..be39a5e086 100644 --- a/drivers/net/sfc/sfc_tweak.h +++ b/drivers/net/sfc/sfc_tweak.h @@ -48,4 +48,7 @@ */ #define SFC_TX_XMIT_PKTS_REAP_AT_LEAST_ONCE 0 +/** Default free threshold follows recommendations from DPDK documentation */ +#define SFC_TX_DEFAULT_FREE_THRESH 32 + #endif /* _SFC_TWEAK_H_ */ diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c index a2406109d4..13b24f773b 100644 --- a/drivers/net/sfc/sfc_tx.c +++ b/drivers/net/sfc/sfc_tx.c @@ -54,7 +54,7 @@ #define SFC_TX_QFLUSH_POLL_ATTEMPTS (2000) static int -sfc_tx_qcheck_conf(struct sfc_adapter *sa, +sfc_tx_qcheck_conf(struct sfc_adapter *sa, uint16_t nb_tx_desc, const struct rte_eth_txconf *tx_conf) { unsigned int flags = tx_conf->txq_flags; @@ -65,9 +65,10 @@ sfc_tx_qcheck_conf(struct sfc_adapter *sa, rc = EINVAL; } - if (tx_conf->tx_free_thresh != 0) { + if (tx_conf->tx_free_thresh > EFX_TXQ_LIMIT(nb_tx_desc)) { sfc_err(sa, - "setting explicit TX free threshold is not supported"); + "TxQ free threshold too large: %u vs maximum %u", + tx_conf->tx_free_thresh, EFX_TXQ_LIMIT(nb_tx_desc)); rc = EINVAL; } @@ -147,7 +148,7 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index, sfc_log_init(sa, "TxQ = %u", sw_index); - rc = sfc_tx_qcheck_conf(sa, tx_conf); + rc = sfc_tx_qcheck_conf(sa, nb_tx_desc, tx_conf); if (rc != 0) goto fail_bad_conf; @@ -188,6 +189,8 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index, txq->state = SFC_TXQ_INITIALIZED; txq->ptr_mask = txq_info->entries - 1; + txq->free_thresh = (tx_conf->tx_free_thresh) ? tx_conf->tx_free_thresh : + SFC_TX_DEFAULT_FREE_THRESH; txq->hw_index = sw_index; txq->flags = tx_conf->txq_flags; txq->evq = evq; @@ -537,8 +540,7 @@ sfc_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) unsigned int pkts_sent = 0; efx_desc_t *pend = &txq->pend_desc[0]; const unsigned int hard_max_fill = EFX_TXQ_LIMIT(txq->ptr_mask + 1); - const unsigned int soft_max_fill = hard_max_fill - - SFC_TX_MAX_PKT_DESC; + const unsigned int soft_max_fill = hard_max_fill - txq->free_thresh; unsigned int fill_level = added - txq->completed; boolean_t reap_done; int rc __rte_unused; diff --git a/drivers/net/sfc/sfc_tx.h b/drivers/net/sfc/sfc_tx.h index fe2736b167..f9eecc0276 100644 --- a/drivers/net/sfc/sfc_tx.h +++ b/drivers/net/sfc/sfc_tx.h @@ -39,15 +39,6 @@ extern "C" { #endif -/** - * Estimated maximum number of segments that transmit packet consists of; - * it is determined with respect to the expectation of a packet to consist - * of a header plus a couple of data segments one of those crossing 4K page; - * it is used by transmit path to avoid redundant reaping and, thus, - * to avoid increase of latency - */ -#define SFC_TX_MAX_PKT_DESC 4 - /** * A segment must not cross 4K boundary * (this is a requirement of NIC TX descriptors) @@ -85,6 +76,7 @@ struct sfc_txq { unsigned int added; unsigned int pending; unsigned int completed; + unsigned int free_thresh; unsigned int hw_index; unsigned int flags; -- 2.20.1