[dpdk-dev] [RFC 5/9] net/ixgbe: add handler for Tx queue descriptor count

Olivier Matz olivier.matz at 6wind.com
Thu Nov 24 10:54:17 CET 2016


Like for TX, use a binary search algorithm to get the number of used Tx
descriptors.

PR=52423
Signed-off-by: Olivier Matz <olivier.matz at 6wind.com>
Acked-by: Ivan Boule <ivan.boule at 6wind.com>
---
 drivers/net/ixgbe/ixgbe_ethdev.c |  1 +
 drivers/net/ixgbe/ixgbe_ethdev.h |  4 ++-
 drivers/net/ixgbe/ixgbe_rxtx.c   | 57 ++++++++++++++++++++++++++++++++++++++++
 drivers/net/ixgbe/ixgbe_rxtx.h   |  2 ++
 4 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index baffc71..0ba098a 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -553,6 +553,7 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
 	.rx_queue_intr_disable = ixgbe_dev_rx_queue_intr_disable,
 	.rx_queue_release     = ixgbe_dev_rx_queue_release,
 	.rx_queue_count       = ixgbe_dev_rx_queue_count,
+	.tx_queue_count       = ixgbe_dev_tx_queue_count,
 	.rx_descriptor_done   = ixgbe_dev_rx_descriptor_done,
 	.tx_queue_setup       = ixgbe_dev_tx_queue_setup,
 	.tx_queue_release     = ixgbe_dev_tx_queue_release,
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
index 4ff6338..e060c3d 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.h
+++ b/drivers/net/ixgbe/ixgbe_ethdev.h
@@ -348,7 +348,9 @@ int  ixgbe_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		const struct rte_eth_txconf *tx_conf);
 
 uint32_t ixgbe_dev_rx_queue_count(struct rte_eth_dev *dev,
-		uint16_t rx_queue_id);
+				  uint16_t rx_queue_id);
+uint32_t ixgbe_dev_tx_queue_count(struct rte_eth_dev *dev,
+				  uint16_t tx_queue_id);
 
 int ixgbe_dev_rx_descriptor_done(void *rx_queue, uint16_t offset);
 int ixgbevf_dev_rx_descriptor_done(void *rx_queue, uint16_t offset);
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index 07509b4..5bf6b1a 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -2437,6 +2437,7 @@ ixgbe_dev_tx_queue_setup(struct rte_eth_dev *dev,
 
 	txq->nb_tx_desc = nb_desc;
 	txq->tx_rs_thresh = tx_rs_thresh;
+	txq->tx_rs_thresh_div = nb_desc / tx_rs_thresh;
 	txq->tx_free_thresh = tx_free_thresh;
 	txq->pthresh = tx_conf->tx_thresh.pthresh;
 	txq->hthresh = tx_conf->tx_thresh.hthresh;
@@ -2906,6 +2907,62 @@ ixgbe_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 	return offset;
 }
 
+uint32_t
+ixgbe_dev_tx_queue_count(struct rte_eth_dev *dev, uint16_t tx_queue_id)
+{
+	struct ixgbe_tx_queue *txq;
+	uint32_t status;
+	int32_t offset, interval, idx = 0;
+	int32_t max_offset, used_desc;
+
+	txq = dev->data->tx_queues[tx_queue_id];
+
+	/* if DD on next threshold desc is not set, assume used packets
+	 * are pending.
+	 */
+	status = txq->tx_ring[txq->tx_next_dd].wb.status;
+	if (!(status & rte_cpu_to_le_32(IXGBE_ADVTXD_STAT_DD)))
+		return txq->nb_tx_desc - txq->nb_tx_free - 1;
+
+	/* browse DD bits between tail starting from tx_next_dd: we have
+	 * to be careful since DD bits are only set every tx_rs_thresh
+	 * descriptor.
+	 */
+	interval = txq->tx_rs_thresh_div >> 1;
+	offset = interval * txq->tx_rs_thresh;
+
+	/* don't go beyond tail */
+	max_offset = txq->tx_tail - txq->tx_next_dd;
+	if (max_offset < 0)
+		max_offset += txq->nb_tx_desc;
+
+	do {
+		interval >>= 1;
+
+		if (offset >= max_offset) {
+			offset -= (interval * txq->tx_rs_thresh);
+			continue;
+		}
+
+		idx = txq->tx_next_dd + offset;
+		if (idx >= txq->nb_tx_desc)
+			idx -= txq->nb_tx_desc;
+
+		status = txq->tx_ring[idx].wb.status;
+		if (status & rte_cpu_to_le_32(IXGBE_ADVTXD_STAT_DD))
+			offset += (interval * txq->tx_rs_thresh);
+		else
+			offset -= (interval * txq->tx_rs_thresh);
+	} while (interval > 0);
+
+	/* idx is now the index of the head */
+	used_desc = txq->tx_tail - idx;
+	if (used_desc < 0)
+		used_desc += txq->nb_tx_desc;
+
+	return used_desc;
+}
+
 int
 ixgbe_dev_rx_descriptor_done(void *rx_queue, uint16_t offset)
 {
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.h b/drivers/net/ixgbe/ixgbe_rxtx.h
index 2608b36..f69b5de 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.h
+++ b/drivers/net/ixgbe/ixgbe_rxtx.h
@@ -221,6 +221,8 @@ struct ixgbe_tx_queue {
 	uint16_t            tx_free_thresh;
 	/** Number of TX descriptors to use before RS bit is set. */
 	uint16_t            tx_rs_thresh;
+	/** Number of TX descriptors divided by tx_rs_thresh. */
+	uint16_t            tx_rs_thresh_div;
 	/** Number of TX descriptors used since RS bit was set. */
 	uint16_t            nb_tx_used;
 	/** Index to last TX descriptor to have been cleaned. */
-- 
2.8.1



More information about the dev mailing list