[01/10] net/enetc: do not stall in clean Tx ring

Message ID 20200302143209.11854-2-hemant.agrawal@nxp.com (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers
Series net/enetc: optimization and cleanup |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/iol-intel-Performance fail Performance Testing issues
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-testing success Testing PASS
ci/Intel-compilation success Compilation OK

Commit Message

Hemant Agrawal March 2, 2020, 2:32 p.m. UTC
  From: Alex Marginean <alexandru.marginean@nxp.com>

Don't read the hardware CI register in a loop, read it once, clean up and
exit.
The issue with reading the register in a loop is that we're stalling here
trying to catch up with hardware which keeps sending traffic as long as it
has traffic to send, so in effect we could be waiting here for the Tx ring
to be drained by hardware, instead of us doing Rx in that meantime.
At the time we return the function there may be new BDs in the ring that
could be cleaned, we're just leaving those there for the next time.

Signed-off-by: Alex Marginean <alexandru.marginean@nxp.com>
---
 drivers/net/enetc/enetc_rxtx.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)
  

Patch

diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 81b0ef3b1..b7ecb75ec 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -1,5 +1,5 @@ 
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018-2019 NXP
+ * Copyright 2018-2020 NXP
  */
 
 #include <stdbool.h>
@@ -21,12 +21,24 @@  enetc_clean_tx_ring(struct enetc_bdr *tx_ring)
 {
 	int tx_frm_cnt = 0;
 	struct enetc_swbd *tx_swbd;
-	int i;
+	int i, hwci;
 
 	i = tx_ring->next_to_clean;
 	tx_swbd = &tx_ring->q_swbd[i];
-	while ((int)(enetc_rd_reg(tx_ring->tcisr) &
-	       ENETC_TBCISR_IDX_MASK) != i) {
+
+	hwci = (int)(enetc_rd_reg(tx_ring->tcisr) &
+		     ENETC_TBCISR_IDX_MASK);
+
+	/* we're only reading the CI index once here, which means HW may update
+	 * it while we're doing clean-up.  We could read the register in a loop
+	 * but for now I assume it's OK to leave a few Tx frames for next call.
+	 * The issue with reading the register in a loop is that we're stalling
+	 * here trying to catch up with HW which keeps sending traffic as long
+	 * as it has traffic to send, so in effect we could be waiting here for
+	 * the Tx ring to be drained by HW, instead of us doing Rx in that
+	 * meantime.
+	 */
+	while (i != hwci) {
 		rte_pktmbuf_free(tx_swbd->buffer_addr);
 		tx_swbd->buffer_addr = NULL;
 		tx_swbd++;