net/sfc: support Tx free threshold
authorIvan Malov <ivan.malov@oktetlabs.ru>
Thu, 15 Dec 2016 12:51:13 +0000 (12:51 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 17 Jan 2017 18:40:50 +0000 (19:40 +0100)
Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <alee@solarflare.com>
Reviewed-by: Robert Stonehouse <rstonehouse@solarflare.com>
drivers/net/sfc/sfc_ethdev.c
drivers/net/sfc/sfc_tweak.h
drivers/net/sfc/sfc_tx.c
drivers/net/sfc/sfc_tx.h

index 6d5e79d..6dafdeb 100644 (file)
@@ -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);
index 8a60f35..be39a5e 100644 (file)
@@ -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_ */
index a240610..13b24f7 100644 (file)
@@ -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;
index fe2736b..f9eecc0 100644 (file)
 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;