From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2240BA04DD for ; Wed, 28 Oct 2020 11:46:27 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AFCD5C9EC; Wed, 28 Oct 2020 11:46:20 +0100 (CET) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by dpdk.org (Postfix) with ESMTP id 0A755CA16 for ; Wed, 28 Oct 2020 11:46:18 +0100 (CET) Received: by mail-wr1-f65.google.com with SMTP id m13so863535wrj.7 for ; Wed, 28 Oct 2020 03:46:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Y0vifNbimhxmGq6QYawf+2rRktMOC9drhssg/IlVdKA=; b=S7g+jwg/1EPp0UiYGSSr7OoXRy1exVOXbE6K6FwSfT+o5WMyw4T7JqOqUvfMBRir5a HSOfd9JdK517eVRyvrN0JtRa/0Ub9zzGyNTuLCwGhnOfyVTUbq5nk2VWcUKfNwlKIV3w +R235p8cpu9oNACH/M98huzB+9f7bkCP8JlsW5PFkSUcJ0whj0so2IEMV6pG1x4S4S37 oT63STOebW78tBFjR+phWSkEYk9WIgeTYz+iu0ICyLu2R5lcSNJKmEIzJA6ZQEUTt8eS EdXW8OfNm+/fx+ElICQM2EOrsZoBFIqrnrMxzTr1r5AvyEhSgnD4MP5R/guMLLQoVS3H 5bVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Y0vifNbimhxmGq6QYawf+2rRktMOC9drhssg/IlVdKA=; b=kwsO6eSfzWSXvo/TyrTUFKqKX+DjNJ/4zKeyKNGrYerDh08xer+syJv4grpkqNJ2eM WX8VlxNRtFpWqNNumExYZjeqe/xzd97i/na31IPdcGBxT8NDiHFQ2ZyMYri1fVJ8L6At JExGOZ7ZPMnZgTZ0J/w7hyKHti/zl6yUMBuoGosUvoq8fVkE8Nn8Vp9wUkM7ws/GMI5Q 3ITi3woYIyLyeVR3Gk2P+i8Lo0YAYf6DlXutzbpvqtGggtcdAouCm2sfevshM2zVSZw0 jjnfG7K2JddPh88i+stQr/ngtLORTIVQRAhR8AWgNwK6cIGJ/J4uHHKuQvBJMyJ2M6eL 96lw== X-Gm-Message-State: AOAM532x0bUs3qzrTfk9fvvKvtkypTzvvuzOMXdfOtYb4A55gO0Lzw/p s5cIrZZX6HpdebY8YSW3n/Q= X-Google-Smtp-Source: ABdhPJxnAXnLcvj2TU1SuqPEqDv/8TmfECUEymBCK0/u4ZU2dLXlwsqURxH/oGEc2CU8LW0/m7zD9g== X-Received: by 2002:a5d:554b:: with SMTP id g11mr8147685wrw.370.1603881976733; Wed, 28 Oct 2020 03:46:16 -0700 (PDT) Received: from localhost ([88.98.246.218]) by smtp.gmail.com with ESMTPSA id l3sm7412523wmg.32.2020.10.28.03.46.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Oct 2020 03:46:16 -0700 (PDT) From: luca.boccassi@gmail.com To: Long Li Cc: Stephen Hemminger , dpdk stable Date: Wed, 28 Oct 2020 10:42:43 +0000 Message-Id: <20201028104606.3504127-4-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20201028104606.3504127-1-luca.boccassi@gmail.com> References: <20201028104606.3504127-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] patch 'net/netvsc: fix multiple channel Rx' has been queued to stable release 19.11.6 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" Hi, FYI, your patch has been queued to stable release 19.11.6 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 10/30/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 d55a06baec093c15e47c64f0990f42100ecda104 Mon Sep 17 00:00:00 2001 From: Long Li Date: Mon, 10 Aug 2020 19:33:11 -0700 Subject: [PATCH] net/netvsc: fix multiple channel Rx [ upstream commit ac837bdd22400b220d60336f22c18091a92a40c9 ] netvsc uses rxbuf_info buffer to track received packets attached via rte_pktmbuf_attach_extbuf() and ack the host based on usage count. It uses the transaction_id in the VMBus packet to locate where to use memory in the rxbuf_info. This is not correct in multiple channel setup, as different channels may return identical transaction_ids at a time, and may corrupt the rxbuf_info buffer. Fix this by defining rxbuf_info for each queue. Fixes: 4e9c73e96e83 ("net/netvsc: add Hyper-V network device") Signed-off-by: Long Li Acked-by: Stephen Hemminger --- drivers/net/netvsc/hn_nvs.c | 13 +++++++++---- drivers/net/netvsc/hn_rxtx.c | 33 ++++++++++++++++++++++++++------- drivers/net/netvsc/hn_var.h | 6 +++--- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/drivers/net/netvsc/hn_nvs.c b/drivers/net/netvsc/hn_nvs.c index f88854dafc..eeb82ab9ee 100644 --- a/drivers/net/netvsc/hn_nvs.c +++ b/drivers/net/netvsc/hn_nvs.c @@ -223,9 +223,15 @@ hn_nvs_conn_rxbuf(struct hn_data *hv) resp.nvs_sect[0].slotcnt); hv->rxbuf_section_cnt = resp.nvs_sect[0].slotcnt; - hv->rxbuf_info = rte_calloc("HN_RXBUF_INFO", hv->rxbuf_section_cnt, - sizeof(*hv->rxbuf_info), RTE_CACHE_LINE_SIZE); - if (!hv->rxbuf_info) { + /* + * Pimary queue's rxbuf_info is not allocated at creation time. + * Now we can allocate it after we figure out the slotcnt. + */ + hv->primary->rxbuf_info = rte_calloc("HN_RXBUF_INFO", + hv->rxbuf_section_cnt, + sizeof(*hv->primary->rxbuf_info), + RTE_CACHE_LINE_SIZE); + if (!hv->primary->rxbuf_info) { PMD_DRV_LOG(ERR, "could not allocate rxbuf info"); return -ENOMEM; @@ -255,7 +261,6 @@ hn_nvs_disconn_rxbuf(struct hn_data *hv) error); } - rte_free(hv->rxbuf_info); /* * Linger long enough for NVS to disconnect RXBUF. */ diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c index d6e518c88e..7fb8852797 100644 --- a/drivers/net/netvsc/hn_rxtx.c +++ b/drivers/net/netvsc/hn_rxtx.c @@ -493,21 +493,21 @@ next: static void hn_rx_buf_free_cb(void *buf __rte_unused, void *opaque) { struct hn_rx_bufinfo *rxb = opaque; - struct hn_data *hv = rxb->hv; + struct hn_rx_queue *rxq = rxb->rxq; - rte_atomic32_dec(&hv->rxbuf_outstanding); + rte_atomic32_dec(&rxq->rxbuf_outstanding); hn_nvs_ack_rxbuf(rxb->chan, rxb->xactid); } -static struct hn_rx_bufinfo *hn_rx_buf_init(const struct hn_rx_queue *rxq, +static struct hn_rx_bufinfo *hn_rx_buf_init(struct hn_rx_queue *rxq, const struct vmbus_chanpkt_rxbuf *pkt) { struct hn_rx_bufinfo *rxb; - rxb = rxq->hv->rxbuf_info + pkt->hdr.xactid; + rxb = rxq->rxbuf_info + pkt->hdr.xactid; rxb->chan = rxq->chan; rxb->xactid = pkt->hdr.xactid; - rxb->hv = rxq->hv; + rxb->rxq = rxq; rxb->shinfo.free_cb = hn_rx_buf_free_cb; rxb->shinfo.fcb_opaque = rxb; @@ -536,7 +536,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb, * some space available in receive area for later packets. */ if (dlen >= HN_RXCOPY_THRESHOLD && - (uint32_t)rte_atomic32_read(&hv->rxbuf_outstanding) < + (uint32_t)rte_atomic32_read(&rxq->rxbuf_outstanding) < hv->rxbuf_section_cnt / 2) { struct rte_mbuf_ext_shared_info *shinfo; const void *rxbuf; @@ -553,7 +553,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb, /* 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_atomic32_inc(&rxq->rxbuf_outstanding); rte_pktmbuf_attach_extbuf(m, data, iova, dlen + headroom, shinfo); @@ -850,6 +850,23 @@ struct hn_rx_queue *hn_rx_queue_alloc(struct hn_data *hv, return NULL; } + /* setup rxbuf_info for non-primary queue */ + if (queue_id) { + rxq->rxbuf_info = rte_calloc("HN_RXBUF_INFO", + hv->rxbuf_section_cnt, + sizeof(*rxq->rxbuf_info), + RTE_CACHE_LINE_SIZE); + + if (!rxq->rxbuf_info) { + PMD_DRV_LOG(ERR, + "Could not allocate rxbuf info for queue %d\n", + queue_id); + rte_free(rxq->event_buf); + rte_free(rxq); + return NULL; + } + } + return rxq; } @@ -904,6 +921,7 @@ hn_dev_rx_queue_setup(struct rte_eth_dev *dev, fail: rte_ring_free(rxq->rx_ring); + rte_free(rxq->rxbuf_info); rte_free(rxq->event_buf); rte_free(rxq); return error; @@ -926,6 +944,7 @@ hn_rx_queue_free(struct hn_rx_queue *rxq, bool keep_primary) if (keep_primary && rxq == rxq->hv->primary) return; + rte_free(rxq->rxbuf_info); rte_free(rxq->event_buf); rte_free(rxq); } diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h index b8e351deeb..a4d47abca3 100644 --- a/drivers/net/netvsc/hn_var.h +++ b/drivers/net/netvsc/hn_var.h @@ -82,13 +82,15 @@ struct hn_rx_queue { struct hn_stats stats; void *event_buf; + struct hn_rx_bufinfo *rxbuf_info; + rte_atomic32_t rxbuf_outstanding; }; /* multi-packet data from host */ struct hn_rx_bufinfo { struct vmbus_channel *chan; - struct hn_data *hv; + struct hn_rx_queue *rxq; uint64_t xactid; struct rte_mbuf_ext_shared_info shinfo; } __rte_cache_aligned; @@ -110,9 +112,7 @@ struct hn_data { uint32_t link_speed; struct rte_mem_resource *rxbuf_res; /* UIO resource for Rx */ - struct hn_rx_bufinfo *rxbuf_info; uint32_t rxbuf_section_cnt; /* # of Rx sections */ - rte_atomic32_t rxbuf_outstanding; uint16_t max_queues; /* Max available queues */ uint16_t num_queues; uint64_t rss_offloads; -- 2.20.1 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2020-10-28 10:35:11.918542458 +0000 +++ 0004-net-netvsc-fix-multiple-channel-Rx.patch 2020-10-28 10:35:11.384828257 +0000 @@ -1,8 +1,10 @@ -From ac837bdd22400b220d60336f22c18091a92a40c9 Mon Sep 17 00:00:00 2001 +From d55a06baec093c15e47c64f0990f42100ecda104 Mon Sep 17 00:00:00 2001 From: Long Li Date: Mon, 10 Aug 2020 19:33:11 -0700 Subject: [PATCH] net/netvsc: fix multiple channel Rx +[ upstream commit ac837bdd22400b220d60336f22c18091a92a40c9 ] + netvsc uses rxbuf_info buffer to track received packets attached via rte_pktmbuf_attach_extbuf() and ack the host based on usage count. It uses the transaction_id in the VMBus packet to locate where to use @@ -15,7 +17,6 @@ Fix this by defining rxbuf_info for each queue. Fixes: 4e9c73e96e83 ("net/netvsc: add Hyper-V network device") -Cc: stable@dpdk.org Signed-off-by: Long Li Acked-by: Stephen Hemminger @@ -57,10 +58,10 @@ * Linger long enough for NVS to disconnect RXBUF. */ diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c -index 87b1184bc1..c8c4ee10c8 100644 +index d6e518c88e..7fb8852797 100644 --- a/drivers/net/netvsc/hn_rxtx.c +++ b/drivers/net/netvsc/hn_rxtx.c -@@ -524,21 +524,21 @@ next: +@@ -493,21 +493,21 @@ next: static void hn_rx_buf_free_cb(void *buf __rte_unused, void *opaque) { struct hn_rx_bufinfo *rxb = opaque; @@ -87,7 +88,7 @@ rxb->shinfo.free_cb = hn_rx_buf_free_cb; rxb->shinfo.fcb_opaque = rxb; -@@ -568,7 +568,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb, +@@ -536,7 +536,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb, * some space available in receive area for later packets. */ if (dlen >= HN_RXCOPY_THRESHOLD && @@ -96,7 +97,7 @@ hv->rxbuf_section_cnt / 2) { struct rte_mbuf_ext_shared_info *shinfo; const void *rxbuf; -@@ -585,7 +585,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb, +@@ -553,7 +553,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb, /* shinfo is already set to 1 by the caller */ if (rte_mbuf_ext_refcnt_update(shinfo, 1) == 2) @@ -105,7 +106,7 @@ rte_pktmbuf_attach_extbuf(m, data, iova, dlen + headroom, shinfo); -@@ -888,6 +888,23 @@ struct hn_rx_queue *hn_rx_queue_alloc(struct hn_data *hv, +@@ -850,6 +850,23 @@ struct hn_rx_queue *hn_rx_queue_alloc(struct hn_data *hv, return NULL; } @@ -129,7 +130,7 @@ return rxq; } -@@ -953,6 +970,7 @@ hn_dev_rx_queue_setup(struct rte_eth_dev *dev, +@@ -904,6 +921,7 @@ hn_dev_rx_queue_setup(struct rte_eth_dev *dev, fail: rte_ring_free(rxq->rx_ring); @@ -137,7 +138,7 @@ rte_free(rxq->event_buf); rte_free(rxq); return error; -@@ -975,6 +993,7 @@ hn_rx_queue_free(struct hn_rx_queue *rxq, bool keep_primary) +@@ -926,6 +944,7 @@ hn_rx_queue_free(struct hn_rx_queue *rxq, bool keep_primary) if (keep_primary && rxq == rxq->hv->primary) return; @@ -146,10 +147,10 @@ rte_free(rxq); } diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h -index 7cb7713e93..4b63f87607 100644 +index b8e351deeb..a4d47abca3 100644 --- a/drivers/net/netvsc/hn_var.h +++ b/drivers/net/netvsc/hn_var.h -@@ -83,13 +83,15 @@ struct hn_rx_queue { +@@ -82,13 +82,15 @@ struct hn_rx_queue { struct hn_stats stats; void *event_buf; @@ -166,7 +167,7 @@ uint64_t xactid; struct rte_mbuf_ext_shared_info shinfo; } __rte_cache_aligned; -@@ -111,9 +113,7 @@ struct hn_data { +@@ -110,9 +112,7 @@ struct hn_data { uint32_t link_speed; struct rte_mem_resource *rxbuf_res; /* UIO resource for Rx */