patches for DPDK stable branches
 help / color / mirror / Atom feed
From: Kevin Traynor <ktraynor@redhat.com>
To: Long Li <longli@microsoft.com>
Cc: Stephen Hemminger <stephen@networkplumber.org>,
	dpdk stable <stable@dpdk.org>
Subject: [dpdk-stable] patch 'net/netvsc: fix underflow when Rx external mbuf' has been queued to LTS release 18.11.10
Date: Thu, 20 Aug 2020 16:33:31 +0100
Message-ID: <20200820153341.171927-26-ktraynor@redhat.com> (raw)
In-Reply-To: <20200820153341.171927-1-ktraynor@redhat.com>

Hi,

FYI, your patch has been queued to LTS release 18.11.10

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

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable-queue

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable-queue/commit/77cf88c0c6a69b720007ec5a683b389b1e253a20

Thanks.

Kevin.

---
From 77cf88c0c6a69b720007ec5a683b389b1e253a20 Mon Sep 17 00:00:00 2001
From: Long Li <longli@microsoft.com>
Date: Tue, 23 Jun 2020 18:11:45 -0700
Subject: [PATCH] net/netvsc: fix underflow when Rx external mbuf

[ upstream commit d43b8c710836db953fad1bb6449a827e19b5a87a ]

When rte_pktmbuf_attach_extbuf() is used, the driver should not decrease
the reference count in its callback function hn_rx_buf_free_cb, because
the reference count is already decreased by rte_pktmbuf. Doing it twice
may result in underflow and driver may never send an ack packet over
vmbus to host.

Also declares rxbuf_outstanding as atomic, because this value is shared
among all receive queues.

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

Signed-off-by: Long Li <longli@microsoft.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 drivers/net/netvsc/hn_nvs.c  |  1 -
 drivers/net/netvsc/hn_rxtx.c | 32 ++++++++++++--------------------
 drivers/net/netvsc/hn_var.h  |  2 +-
 3 files changed, 13 insertions(+), 22 deletions(-)

diff --git a/drivers/net/netvsc/hn_nvs.c b/drivers/net/netvsc/hn_nvs.c
index 76a7281f1b..f97bb10846 100644
--- a/drivers/net/netvsc/hn_nvs.c
+++ b/drivers/net/netvsc/hn_nvs.c
@@ -100,5 +100,4 @@ __hn_nvs_execute(struct hn_data *hv,
 	if (hdr->type == NVS_TYPE_RNDIS) {
 		hn_nvs_ack_rxbuf(chan, xactid);
-		--hv->rxbuf_outstanding;
 		goto retry;
 	}
diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c
index b526b490b2..d7940b8119 100644
--- a/drivers/net/netvsc/hn_rxtx.c
+++ b/drivers/net/netvsc/hn_rxtx.c
@@ -489,22 +489,11 @@ next:
 }
 
-/*
- * Ack the consumed RXBUF associated w/ this channel packet,
- * so that this RXBUF can be recycled by the hypervisor.
- */
-static void hn_rx_buf_release(struct hn_rx_bufinfo *rxb)
-{
-	struct rte_mbuf_ext_shared_info *shinfo = &rxb->shinfo;
-	struct hn_data *hv = rxb->hv;
-
-	if (rte_mbuf_ext_refcnt_update(shinfo, -1) == 0) {
-		hn_nvs_ack_rxbuf(rxb->chan, rxb->xactid);
-		--hv->rxbuf_outstanding;
-	}
-}
-
 static void hn_rx_buf_free_cb(void *buf __rte_unused, void *opaque)
 {
-	hn_rx_buf_release(opaque);
+	struct hn_rx_bufinfo *rxb = opaque;
+	struct hn_data *hv = rxb->hv;
+
+	rte_atomic32_dec(&hv->rxbuf_outstanding);
+	hn_nvs_ack_rxbuf(rxb->chan, rxb->xactid);
 }
 
@@ -546,5 +535,6 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb,
 	 */
 	if (dlen >= HN_RXCOPY_THRESHOLD &&
-	    hv->rxbuf_outstanding < hv->rxbuf_section_cnt / 2) {
+	    (uint32_t)rte_atomic32_read(&hv->rxbuf_outstanding) <
+			hv->rxbuf_section_cnt / 2) {
 		struct rte_mbuf_ext_shared_info *shinfo;
 		const void *rxbuf;
@@ -560,6 +550,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb,
 		shinfo = &rxb->shinfo;
 
-		if (rte_mbuf_ext_refcnt_update(shinfo, 1) == 1)
-			++hv->rxbuf_outstanding;
+		/* shinfo is already set to 1 by the caller */
+		if (rte_mbuf_ext_refcnt_update(shinfo, 1) == 2)
+			rte_atomic32_inc(&hv->rxbuf_outstanding);
 
 		rte_pktmbuf_attach_extbuf(m, data, iova,
@@ -793,5 +784,6 @@ hn_nvs_handle_rxbuf(struct rte_eth_dev *dev,
 
 	/* Send ACK now if external mbuf not used */
-	hn_rx_buf_release(rxb);
+	if (rte_mbuf_ext_refcnt_update(&rxb->shinfo, -1) == 0)
+		hn_nvs_ack_rxbuf(rxb->chan, rxb->xactid);
 }
 
diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h
index 5dcd53638a..34cd11d641 100644
--- a/drivers/net/netvsc/hn_var.h
+++ b/drivers/net/netvsc/hn_var.h
@@ -112,5 +112,5 @@ struct hn_data {
 	struct hn_rx_bufinfo *rxbuf_info;
 	uint32_t	rxbuf_section_cnt;	/* # of Rx sections */
-	volatile uint32_t rxbuf_outstanding;
+	rte_atomic32_t	rxbuf_outstanding;
 	uint16_t	max_queues;		/* Max available queues */
 	uint16_t	num_queues;
-- 
2.26.2

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2020-08-20 16:26:16.760344814 +0100
+++ 0026-net-netvsc-fix-underflow-when-Rx-external-mbuf.patch	2020-08-20 16:26:15.811324206 +0100
@@ -1 +1 @@
-From d43b8c710836db953fad1bb6449a827e19b5a87a Mon Sep 17 00:00:00 2001
+From 77cf88c0c6a69b720007ec5a683b389b1e253a20 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit d43b8c710836db953fad1bb6449a827e19b5a87a ]
+
@@ -16 +17,0 @@
-Cc: stable@dpdk.org
@@ -27 +28 @@
-index 477202b2a0..f88854dafc 100644
+index 76a7281f1b..f97bb10846 100644
@@ -37 +38 @@
-index 6a52885d58..cc4ced37aa 100644
+index b526b490b2..d7940b8119 100644
@@ -40 +41 @@
-@@ -520,22 +520,11 @@ next:
+@@ -489,22 +489,11 @@ next:
@@ -68 +69 @@
-@@ -577,5 +566,6 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb,
+@@ -546,5 +535,6 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb,
@@ -76 +77 @@
-@@ -591,6 +581,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb,
+@@ -560,6 +550,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb,
@@ -86 +87 @@
-@@ -833,5 +824,6 @@ hn_nvs_handle_rxbuf(struct rte_eth_dev *dev,
+@@ -793,5 +784,6 @@ hn_nvs_handle_rxbuf(struct rte_eth_dev *dev,
@@ -95 +96 @@
-index 881832d857..7cb7713e93 100644
+index 5dcd53638a..34cd11d641 100644
@@ -98 +99 @@
-@@ -114,5 +114,5 @@ struct hn_data {
+@@ -112,5 +112,5 @@ struct hn_data {


  parent reply	other threads:[~2020-08-20 15:34 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-20 15:33 [dpdk-stable] patch 'test: fix rpath for drivers with meson' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'rawdev: allow getting info for unknown device' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'rawdev: fill NUMA socket ID in info' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'rawdev: export dump function in map file' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'cfgfile: fix stack buffer underflow' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'drivers/crypto: add missing OOP feature flag' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'test/crypto: fix asymmetric session mempool creation' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'common/cpt: fix encryption offset' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'crypto/dpaax_sec: fix inline query for descriptors' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'service: fix core mapping reset' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net/ixgbe: report 10Mbps link speed for x553' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net/iavf: fix uninitialized variable' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net/ixgbe/base: remove dead code' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net/i40e: fix getting EEPROM information' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'app/testpmd: use clock time in throughput calculation' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'app/testpmd: fix burst percentage " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'ethdev: fix log type for some error messages' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'service: fix C++ linkage' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net: fix unneeded replacement of TCP checksum 0' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net: fix checksum on big endian CPUs' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'eal: fix parentheses in alignment macros' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'vhost: fix virtio ready flag check' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'bus/fslmc: fix getting FD error' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net/dpaa: fix FD offset data type' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net/bonding: fix socket ID check' " Kevin Traynor
2020-08-20 15:33 ` Kevin Traynor [this message]
2020-08-20 15:33 ` [dpdk-stable] patch 'net/ixgbe/base: fix host interface shadow RAM read' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net/ixgbe/base: fix x550em 10G NIC link status' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net/ixgbe/base: fix infinite recursion on PCIe link down' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'ethdev: fix data room size verification in Rx queue setup' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net/nfp: fix RSS hash configuration reporting' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'drivers/net: fix exposing internal headers' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net/bonding: fix LACP negotiation' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'net/bnxt: remove unused enum declaration' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'examples/fips_validation: fix parsing of TDES vectors' " Kevin Traynor
2020-08-20 15:33 ` [dpdk-stable] patch 'examples/fips_validation: fix count overwrite for TDES' " Kevin Traynor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200820153341.171927-26-ktraynor@redhat.com \
    --to=ktraynor@redhat.com \
    --cc=longli@microsoft.com \
    --cc=stable@dpdk.org \
    --cc=stephen@networkplumber.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

patches for DPDK stable branches

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.dpdk.org/stable/0 stable/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 stable stable/ https://inbox.dpdk.org/stable \
		stable@dpdk.org
	public-inbox-index stable

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.stable


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git