[dpdk-stable] patch 'net/netvsc: do not spin forever waiting for reply' has been queued to stable release 19.11.4

luca.boccassi at gmail.com luca.boccassi at gmail.com
Fri Jul 24 13:57:28 CEST 2020


Hi,

FYI, your patch has been queued to stable release 19.11.4

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 07/26/20. 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.

Luca Boccassi

---
>From 895e0773bd95e6fcc935128fa8ab34c7d5b3f881 Mon Sep 17 00:00:00 2001
From: Stephen Hemminger <stephen at networkplumber.org>
Date: Tue, 19 May 2020 09:52:30 -0700
Subject: [PATCH] net/netvsc: do not spin forever waiting for reply

[ upstream commit 3c9be81be917e1659a3a9ab332c277280986ed03 ]

Because of bugs in driver or host a reply to a request might
never occur. Better to give an error than spin forever.

Fixes: 4e9c73e96e83 ("net/netvsc: add Hyper-V network device")

Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
---
 drivers/net/netvsc/hn_rndis.c | 30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/drivers/net/netvsc/hn_rndis.c b/drivers/net/netvsc/hn_rndis.c
index 2b4714042..bce3dab68 100644
--- a/drivers/net/netvsc/hn_rndis.c
+++ b/drivers/net/netvsc/hn_rndis.c
@@ -10,6 +10,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <unistd.h>
+#include <time.h>
 
 #include <rte_ethdev_driver.h>
 #include <rte_ethdev.h>
@@ -33,6 +34,9 @@
 #include "hn_rndis.h"
 #include "ndis.h"
 
+#define RNDIS_TIMEOUT_SEC 5
+#define RNDIS_DELAY_MS    10
+
 #define HN_RNDIS_XFER_SIZE		0x4000
 
 #define HN_NDIS_TXCSUM_CAP_IP4		\
@@ -348,7 +352,7 @@ void hn_rndis_receive_response(struct hn_data *hv,
 	rte_smp_wmb();
 
 	if (rte_atomic32_cmpset(&hv->rndis_pending, hdr->rid, 0) == 0) {
-		PMD_DRV_LOG(ERR,
+		PMD_DRV_LOG(NOTICE,
 			    "received id %#x pending id %#x",
 			    hdr->rid, (uint32_t)hv->rndis_pending);
 	}
@@ -371,6 +375,11 @@ static int hn_rndis_exec1(struct hn_data *hv,
 		return -EIO;
 	}
 
+	if (rid == 0) {
+		PMD_DRV_LOG(ERR, "Invalid request id");
+		return -EINVAL;
+	}
+
 	if (comp != NULL &&
 	    rte_atomic32_cmpset(&hv->rndis_pending, 0, rid) == 0) {
 		PMD_DRV_LOG(ERR,
@@ -385,9 +394,26 @@ static int hn_rndis_exec1(struct hn_data *hv,
 	}
 
 	if (comp) {
+		time_t start = time(NULL);
+
 		/* Poll primary channel until response received */
-		while (hv->rndis_pending == rid)
+		while (hv->rndis_pending == rid) {
+			if (hv->closed)
+				return -ENETDOWN;
+
+			if (time(NULL) - start > RNDIS_TIMEOUT_SEC) {
+				PMD_DRV_LOG(ERR,
+					    "RNDIS response timed out");
+
+				rte_atomic32_cmpset(&hv->rndis_pending, rid, 0);
+				return -ETIMEDOUT;
+			}
+
+			if (rte_vmbus_chan_rx_empty(hv->primary->chan))
+				rte_delay_ms(RNDIS_DELAY_MS);
+
 			hn_process_events(hv, 0, 1);
+		}
 
 		memcpy(comp, hv->rndis_resp, comp_len);
 	}
-- 
2.20.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2020-07-24 12:53:48.984085277 +0100
+++ 0010-net-netvsc-do-not-spin-forever-waiting-for-reply.patch	2020-07-24 12:53:48.159004075 +0100
@@ -1,13 +1,14 @@
-From 3c9be81be917e1659a3a9ab332c277280986ed03 Mon Sep 17 00:00:00 2001
+From 895e0773bd95e6fcc935128fa8ab34c7d5b3f881 Mon Sep 17 00:00:00 2001
 From: Stephen Hemminger <stephen at networkplumber.org>
 Date: Tue, 19 May 2020 09:52:30 -0700
 Subject: [PATCH] net/netvsc: do not spin forever waiting for reply
 
+[ upstream commit 3c9be81be917e1659a3a9ab332c277280986ed03 ]
+
 Because of bugs in driver or host a reply to a request might
 never occur. Better to give an error than spin forever.
 
 Fixes: 4e9c73e96e83 ("net/netvsc: add Hyper-V network device")
-Cc: stable at dpdk.org
 
 Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
 ---
@@ -15,7 +16,7 @@
  1 file changed, 28 insertions(+), 2 deletions(-)
 
 diff --git a/drivers/net/netvsc/hn_rndis.c b/drivers/net/netvsc/hn_rndis.c
-index 6a850ce5f..d186ddeab 100644
+index 2b4714042..bce3dab68 100644
 --- a/drivers/net/netvsc/hn_rndis.c
 +++ b/drivers/net/netvsc/hn_rndis.c
 @@ -10,6 +10,7 @@
@@ -26,7 +27,7 @@
  
  #include <rte_ethdev_driver.h>
  #include <rte_ethdev.h>
-@@ -34,6 +35,9 @@
+@@ -33,6 +34,9 @@
  #include "hn_rndis.h"
  #include "ndis.h"
  
@@ -36,7 +37,7 @@
  #define HN_RNDIS_XFER_SIZE		0x4000
  
  #define HN_NDIS_TXCSUM_CAP_IP4		\
-@@ -354,7 +358,7 @@ void hn_rndis_receive_response(struct hn_data *hv,
+@@ -348,7 +352,7 @@ void hn_rndis_receive_response(struct hn_data *hv,
  	rte_smp_wmb();
  
  	if (rte_atomic32_cmpset(&hv->rndis_pending, hdr->rid, 0) == 0) {
@@ -45,7 +46,7 @@
  			    "received id %#x pending id %#x",
  			    hdr->rid, (uint32_t)hv->rndis_pending);
  	}
-@@ -377,6 +381,11 @@ static int hn_rndis_exec1(struct hn_data *hv,
+@@ -371,6 +375,11 @@ static int hn_rndis_exec1(struct hn_data *hv,
  		return -EIO;
  	}
  
@@ -57,7 +58,7 @@
  	if (comp != NULL &&
  	    rte_atomic32_cmpset(&hv->rndis_pending, 0, rid) == 0) {
  		PMD_DRV_LOG(ERR,
-@@ -391,9 +400,26 @@ static int hn_rndis_exec1(struct hn_data *hv,
+@@ -385,9 +394,26 @@ static int hn_rndis_exec1(struct hn_data *hv,
  	}
  
  	if (comp) {


More information about the stable mailing list