Rx free threshold defines minimum number of free Rx descriptors
when Rx ring refill should be done.

Reviewed-by: Andrew Lee <a...@solarflare.com>
Reviewed-by: Robert Stonehouse <rstoneho...@solarflare.com>
Signed-off-by: Andrew Rybchenko <arybche...@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c |  1 +
 drivers/net/sfc/sfc_rx.c     | 16 ++++++++++++----
 drivers/net/sfc/sfc_rx.h     |  1 +
 3 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index e67ca61..1d7993f 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -838,6 +838,7 @@ sfc_rx_queue_info_get(struct rte_eth_dev *dev, uint16_t 
rx_queue_id,
        SFC_ASSERT(rxq != NULL);
 
        qinfo->mp = rxq->refill_mb_pool;
+       qinfo->conf.rx_free_thresh = rxq->refill_threshold;
        qinfo->conf.rx_drop_en = 1;
        qinfo->nb_desc = rxq_info->entries;
 
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index be8fa23..278d583 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -87,6 +87,10 @@ sfc_rx_qrefill(struct sfc_rxq *rxq)
 
        free_space = EFX_RXQ_LIMIT(rxq->ptr_mask + 1) -
                (added - rxq->completed);
+
+       if (free_space < rxq->refill_threshold)
+               return;
+
        bulks = free_space / RTE_DIM(objs);
 
        id = added & rxq->ptr_mask;
@@ -410,9 +414,10 @@ sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 }
 
 static int
-sfc_rx_qcheck_conf(struct sfc_adapter *sa,
+sfc_rx_qcheck_conf(struct sfc_adapter *sa, uint16_t nb_rx_desc,
                   const struct rte_eth_rxconf *rx_conf)
 {
+       const uint16_t rx_free_thresh_max = EFX_RXQ_LIMIT(nb_rx_desc);
        int rc = 0;
 
        if (rx_conf->rx_thresh.pthresh != 0 ||
@@ -423,8 +428,10 @@ sfc_rx_qcheck_conf(struct sfc_adapter *sa,
                rc = EINVAL;
        }
 
-       if (rx_conf->rx_free_thresh != 0) {
-               sfc_err(sa, "RxQ free threshold is not supported");
+       if (rx_conf->rx_free_thresh > rx_free_thresh_max) {
+               sfc_err(sa,
+                       "RxQ free threshold too large: %u vs maximum %u",
+                       rx_conf->rx_free_thresh, rx_free_thresh_max);
                rc = EINVAL;
        }
 
@@ -555,7 +562,7 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
        struct sfc_evq *evq;
        struct sfc_rxq *rxq;
 
-       rc = sfc_rx_qcheck_conf(sa, rx_conf);
+       rc = sfc_rx_qcheck_conf(sa, nb_rx_desc, rx_conf);
        if (rc != 0)
                goto fail_bad_conf;
 
@@ -615,6 +622,7 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
        evq->rxq = rxq;
        rxq->evq = evq;
        rxq->ptr_mask = rxq_info->entries - 1;
+       rxq->refill_threshold = rx_conf->rx_free_thresh;
        rxq->refill_mb_pool = mb_pool;
        rxq->buf_size = buf_size;
        rxq->hw_index = sw_index;
diff --git a/drivers/net/sfc/sfc_rx.h b/drivers/net/sfc/sfc_rx.h
index e4385b9..69318ab 100644
--- a/drivers/net/sfc/sfc_rx.h
+++ b/drivers/net/sfc/sfc_rx.h
@@ -87,6 +87,7 @@ struct sfc_rxq {
        /* Used on refill */
        unsigned int            added;
        unsigned int            pushed;
+       unsigned int            refill_threshold;
        uint8_t                 port_id;
        uint16_t                buf_size;
        struct rte_mempool      *refill_mb_pool;
-- 
2.5.5

Reply via email to