[dpdk-stable] patch 'net/ena: fix cleanup for out of order packets' has been queued to LTS release 18.11.1

Kevin Traynor ktraynor at redhat.com
Fri Jan 4 14:24:38 CET 2019


Hi,

FYI, your patch has been queued to LTS release 18.11.1

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 01/11/19. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Thanks.

Kevin Traynor

---
>From 50ba5ab886aebf6b5fbf0a53108e69c46d68f997 Mon Sep 17 00:00:00 2001
From: Rafal Kozik <rk at semihalf.com>
Date: Mon, 17 Dec 2018 12:06:18 +0100
Subject: [PATCH] net/ena: fix cleanup for out of order packets

[ upstream commit 709b1dcb73adebb3fc1a838b57d72028feb97e47 ]

When wrong req_id is detected some previous mbufs could be used for
receiving different segments of received packets. In such cases chained
mbufs will be twice returned to pool.

To prevent it chained mbuf is now freed just after error detection.

To simplify cleaning, pointers taken for Rx ring are set to NULL.

As after ena_rx_queue_release_bufs and ena_tx_queue_release_bufs queues
are not used updating of next_to_clean pointer is not necessary.

Fixes: c2034976673d ("net/ena: add Rx out of order completion")

Signed-off-by: Rafal Kozik <rk at semihalf.com>
Acked-by: Michal Krawczyk <mk at semihalf.com>
---
 drivers/net/ena/ena_ethdev.c | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index e8db81a38..281addb4b 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -764,15 +764,11 @@ static void ena_tx_queue_release(void *queue)
 static void ena_rx_queue_release_bufs(struct ena_ring *ring)
 {
-	unsigned int ring_mask = ring->ring_size - 1;
+	unsigned int i;
 
-	while (ring->next_to_clean != ring->next_to_use) {
-		struct rte_mbuf *m =
-			ring->rx_buffer_info[ring->next_to_clean & ring_mask];
-
-		if (m)
-			rte_mbuf_raw_free(m);
-
-		ring->next_to_clean++;
-	}
+	for (i = 0; i < ring->ring_size; ++i)
+		if (ring->rx_buffer_info[i]) {
+			rte_mbuf_raw_free(ring->rx_buffer_info[i]);
+			ring->rx_buffer_info[i] = NULL;
+		}
 }
 
@@ -786,6 +782,4 @@ static void ena_tx_queue_release_bufs(struct ena_ring *ring)
 		if (tx_buf->mbuf)
 			rte_pktmbuf_free(tx_buf->mbuf);
-
-		ring->next_to_clean++;
 	}
 }
@@ -1919,8 +1913,12 @@ static uint16_t eth_ena_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 			req_id = ena_rx_ctx.ena_bufs[segments].req_id;
 			rc = validate_rx_req_id(rx_ring, req_id);
-			if (unlikely(rc))
+			if (unlikely(rc)) {
+				if (segments != 0)
+					rte_mbuf_raw_free(mbuf_head);
 				break;
+			}
 
 			mbuf = rx_buff_info[req_id];
+			rx_buff_info[req_id] = NULL;
 			mbuf->data_len = ena_rx_ctx.ena_bufs[segments].len;
 			mbuf->data_off = RTE_PKTMBUF_HEADROOM;
-- 
2.19.0

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2019-01-04 13:23:08.811469385 +0000
+++ 0056-net-ena-fix-cleanup-for-out-of-order-packets.patch	2019-01-04 13:23:07.000000000 +0000
@@ -1,8 +1,10 @@
-From 709b1dcb73adebb3fc1a838b57d72028feb97e47 Mon Sep 17 00:00:00 2001
+From 50ba5ab886aebf6b5fbf0a53108e69c46d68f997 Mon Sep 17 00:00:00 2001
 From: Rafal Kozik <rk at semihalf.com>
 Date: Mon, 17 Dec 2018 12:06:18 +0100
 Subject: [PATCH] net/ena: fix cleanup for out of order packets
 
+[ upstream commit 709b1dcb73adebb3fc1a838b57d72028feb97e47 ]
+
 When wrong req_id is detected some previous mbufs could be used for
 receiving different segments of received packets. In such cases chained
 mbufs will be twice returned to pool.
@@ -15,7 +17,6 @@
 are not used updating of next_to_clean pointer is not necessary.
 
 Fixes: c2034976673d ("net/ena: add Rx out of order completion")
-Cc: stable at dpdk.org
 
 Signed-off-by: Rafal Kozik <rk at semihalf.com>
 Acked-by: Michal Krawczyk <mk at semihalf.com>
@@ -24,10 +25,10 @@
  1 file changed, 11 insertions(+), 13 deletions(-)
 
 diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
-index 14165561e..364778840 100644
+index e8db81a38..281addb4b 100644
 --- a/drivers/net/ena/ena_ethdev.c
 +++ b/drivers/net/ena/ena_ethdev.c
-@@ -771,15 +771,11 @@ static void ena_tx_queue_release(void *queue)
+@@ -764,15 +764,11 @@ static void ena_tx_queue_release(void *queue)
  static void ena_rx_queue_release_bufs(struct ena_ring *ring)
  {
 -	unsigned int ring_mask = ring->ring_size - 1;
@@ -49,14 +50,14 @@
 +		}
  }
  
-@@ -793,6 +789,4 @@ static void ena_tx_queue_release_bufs(struct ena_ring *ring)
+@@ -786,6 +782,4 @@ static void ena_tx_queue_release_bufs(struct ena_ring *ring)
  		if (tx_buf->mbuf)
  			rte_pktmbuf_free(tx_buf->mbuf);
 -
 -		ring->next_to_clean++;
  	}
  }
-@@ -2078,8 +2072,12 @@ static uint16_t eth_ena_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
+@@ -1919,8 +1913,12 @@ static uint16_t eth_ena_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
  			req_id = ena_rx_ctx.ena_bufs[segments].req_id;
  			rc = validate_rx_req_id(rx_ring, req_id);
 -			if (unlikely(rc))


More information about the stable mailing list