From patchwork Tue Apr 30 18:12:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 53171 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8C9035911; Tue, 30 Apr 2019 20:12:31 +0200 (CEST) Received: from mail-pg1-f194.google.com (mail-pg1-f194.google.com [209.85.215.194]) by dpdk.org (Postfix) with ESMTP id 5AA2458CB for ; Tue, 30 Apr 2019 20:12:29 +0200 (CEST) Received: by mail-pg1-f194.google.com with SMTP id i21so3759992pgi.12 for ; Tue, 30 Apr 2019 11:12:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GBfwROpRn1A3EvCiDHFVOFv9FQA/Vfy9DII+/71GiMw=; b=bN4fNtSCWIIlbptkZvv0V2Y39OI3KoHJQuLS5NVDUVRYt0iy8xNtw1eJk+0o0t1TcV uXxknzLIA6v0lh7AJNnqUI8GXuCvpACH9f1fALUoYmUIM4pwVslC0U1kgP7bP8AGCw3V B9YNpot/6S+X0WFL5kVUmSgN3cdANA3Nm51wndv9U1HsLu4rnDjVmIw+aOuS++M9ZGEf 4TTQP+GZJfy+4mQ80hPjcMd23rncMiOcwQgEby7fafLYdUNICNwYiDh0Ahf2gE3Rogvs Z5IAqm6iFm/rU01hqA7sQDPRfdg1GV26IdC+8FUhlEwVW19h+90o71UkXSoZu6bPDuto pVGA== 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=GBfwROpRn1A3EvCiDHFVOFv9FQA/Vfy9DII+/71GiMw=; b=VT0MaAjkxbAV42WbU/+RvFPrYJ527ogKamW9nzGsqwENOCvWEjHIU8A15bmi6v1Yst Tx1z0PlLxFgZEIGqCi2jWwiGwPbD2yD5O01khpxOBsxz02RCH/uI68dZ7sUniGJ9pi18 NqyAHGg/W3ziUcq9GxqrvvyXhOD2XGR0S7cOnlNR6821II9cCCKoaU2SVdxkiBwKzzsN ZMPud8SbiQOpz2gYtWnma8tBrvvG7PbOjzcpC6py50QF9yKZ5+vP38MHSg6gc/PLuaW+ Ehde/+MS2poWtEXN62HsaDkwFWwdXfUQKG90joNges6AjM54ulbOYgt2TDHmvexf+TNT 6w2Q== X-Gm-Message-State: APjAAAVl4CBrmwxjixevsaK1nbIg6JPCIEQMEVdVebe7Sc8MrTiiBvGx t29Q5CMQ5mW67IMcWck//jH/aPq1myc= X-Google-Smtp-Source: APXvYqxvQ0fHDlf4dS8teQS2kG7IHoDig+wdZY5VIDMKKR4flRpwJgkMoS9Ol6rEXYwImTTPK1tQrg== X-Received: by 2002:aa7:8589:: with SMTP id w9mr72570985pfn.97.1556647947921; Tue, 30 Apr 2019 11:12:27 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id z7sm68660462pgh.81.2019.04.30.11.12.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Apr 2019 11:12:26 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Tue, 30 Apr 2019 11:12:16 -0700 Message-Id: <20190430181217.20875-2-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190430181217.20875-1-stephen@networkplumber.org> References: <20190429203325.10696-1-stephen@networkplumber.org> <20190430181217.20875-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 1/2] net/netvsc: reset mbuf port on VF receive X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Stephen Hemminger Redo the receive logic to set m->port on packets received on VF. When using VF, still need to check for packets and completions arriving on the VMBus path even if application is not doing bursting (ie n_rx == 0). Also, fix comment. Signed-off-by: Stephen Hemminger Fixes: dc7680e8597c ("net/netvsc: support integrated VF") --- v2 - add fixes drivers/net/netvsc/hn_rxtx.c | 47 +++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c index c67e9ae25376..7856f7e6ec48 100644 --- a/drivers/net/netvsc/hn_rxtx.c +++ b/drivers/net/netvsc/hn_rxtx.c @@ -1393,6 +1393,24 @@ hn_xmit_pkts(void *ptxq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) return nb_tx; } +static uint16_t +hn_recv_vf(uint16_t vf_port, const struct hn_rx_queue *rxq, + struct rte_mbuf **rx_pkts, uint16_t nb_pkts) +{ + uint16_t i, n; + + if (unlikely(nb_pkts == 0)) + return 0; + + n = rte_eth_rx_burst(vf_port, rxq->queue_id, rx_pkts, nb_pkts); + + /* relabel the received mbufs */ + for (i = 0; i < n; i++) + rx_pkts[i]->port = rxq->port_id; + + return n; +} + uint16_t hn_recv_pkts(void *prxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) { @@ -1404,30 +1422,21 @@ hn_recv_pkts(void *prxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) if (unlikely(hv->closed)) return 0; - /* Transmit over VF if present and up */ + /* Receive from VF if present and up */ vf_dev = hn_get_vf_dev(hv); - if (vf_dev && vf_dev->data->dev_started) { - /* Normally, with SR-IOV the ring buffer will be empty */ + /* Check for new completions */ + if (likely(rte_ring_count(rxq->rx_ring) < nb_pkts)) hn_process_events(hv, rxq->queue_id, 0); - /* Get mbufs some bufs off of staging ring */ - nb_rcv = rte_ring_sc_dequeue_burst(rxq->rx_ring, - (void **)rx_pkts, - nb_pkts / 2, NULL); - /* And rest off of VF */ - nb_rcv += rte_eth_rx_burst(vf_dev->data->port_id, - rxq->queue_id, - rx_pkts + nb_rcv, nb_pkts - nb_rcv); - } else { - /* If receive ring is not full then get more */ - if (rte_ring_count(rxq->rx_ring) < nb_pkts) - hn_process_events(hv, rxq->queue_id, 0); + /* Always check the vmbus path for multicast and new flows */ + nb_rcv = rte_ring_sc_dequeue_burst(rxq->rx_ring, + (void **)rx_pkts, nb_pkts, NULL); - nb_rcv = rte_ring_sc_dequeue_burst(rxq->rx_ring, - (void **)rx_pkts, - nb_pkts, NULL); - } + /* If VF is available, check that as well */ + if (vf_dev && vf_dev->data->dev_started) + nb_rcv += hn_recv_vf(vf_dev->data->port_id, rxq, + rx_pkts + nb_rcv, nb_pkts - nb_rcv); return nb_rcv; } From patchwork Tue Apr 30 18:12:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 53172 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8DE135A6A; Tue, 30 Apr 2019 20:12:35 +0200 (CEST) Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) by dpdk.org (Postfix) with ESMTP id DC69658FA for ; Tue, 30 Apr 2019 20:12:30 +0200 (CEST) Received: by mail-pf1-f195.google.com with SMTP id v80so2863616pfa.3 for ; Tue, 30 Apr 2019 11:12:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+Npx3od60mYH++vwE/jnwhQuPa57NeERy/zWuRjkxhc=; b=gzmc8fI2TFBlCrHj95R85gctL9PHvYmPD18QTr0A88mT6wQ30sBB2KcqkgRznTlkht b55I8RTBKjT1pMXw8rEqGL0X0xuZCrAslKtAOUSOMmp2gstejQyaZkzclJ/B3H3nkdWD EaXb8V7MmmTEHakrQWwipLMEBbEPSCCL5we5skXA+c8Qz3l49RywS4mMIUw4IdpopIQD Kzn1qz05My7Jg6mXdhF/3nySwDWIGxvQBNv3mv8VWDh8Cz9JXrY9RZXXRZqa8UmIlrn7 6VAtVtOsbj6xhNwQGaO/1UYFiunXZPpPNT61ZE4AWAqAgAdwq87GHcQGXcCV23sI2QjX m5rA== 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=+Npx3od60mYH++vwE/jnwhQuPa57NeERy/zWuRjkxhc=; b=E6DYffBg0aafDrAvucr0AeY15mqeLm5KwFQEzNbBwiIF7iRIJ44S7LHtVPtOeN0syO gIOpoK2X6qXOU7oTrA1XY2/zckOf9HRkm8s9V0e0G3wVvvhAScs/hXAdA0q+gwbiNVZ9 XtOXLa+xeRJ2ceW9fNaOmxxaasQFOglAj2KRssCgqixvJ44rmZJhNmcgv0dRXBcts/l1 bInJumzhwZKIfTIJhIwJn54GSQwGxJfdY37YMOiuhe+3lnTEFpaa5q00AEOeW7RvV+Hx o+d3hyH0JPzggp11PgPSf+iu4ICZpWRXk6Tb5sQ7HRym/dO0P4Tx6DE5EVEYGqehVtri qr6w== X-Gm-Message-State: APjAAAV8j7QvRHxxcuIeEkQTRBSMPRphWWt1j7WZkC8iA7jHBIh41/+W xS79l8IMDcSRfNv7Y7xfBEZYFjDnFKU= X-Google-Smtp-Source: APXvYqz3TxNyGf4q/lermho+ZwSnLa041qsSIkWrHMhEbv6QRrU2KDR9tiBTG5p9jCUITECUD5O+Qg== X-Received: by 2002:a62:f247:: with SMTP id y7mr9075445pfl.18.1556647949767; Tue, 30 Apr 2019 11:12:29 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id z7sm68660462pgh.81.2019.04.30.11.12.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Apr 2019 11:12:28 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Tue, 30 Apr 2019 11:12:17 -0700 Message-Id: <20190430181217.20875-3-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190430181217.20875-1-stephen@networkplumber.org> References: <20190429203325.10696-1-stephen@networkplumber.org> <20190430181217.20875-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 2/2] net/netvsc: free all queues on close X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Stephen Hemminger When dev_close is called, the netvsc driver will clean up all queues including the primary ring buffer. Signed-off-by: Stephen Hemminger --- v2 - fix logic on close of primary avoid double free if close is called twice drivers/net/netvsc/hn_ethdev.c | 8 ++++-- drivers/net/netvsc/hn_rxtx.c | 46 +++++++++++++++++++++++++++------- drivers/net/netvsc/hn_var.h | 1 + drivers/net/netvsc/hn_vf.c | 11 +++++++- 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c index 407ee484935a..553cb06f6e33 100644 --- a/drivers/net/netvsc/hn_ethdev.c +++ b/drivers/net/netvsc/hn_ethdev.c @@ -112,6 +112,9 @@ eth_dev_vmbus_allocate(struct rte_vmbus_device *dev, size_t private_data_size) eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC; eth_dev->intr_handle = &dev->intr_handle; + /* allow ethdev to remove on close */ + eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE; + return eth_dev; } @@ -632,11 +635,12 @@ hn_dev_stop(struct rte_eth_dev *dev) } static void -hn_dev_close(struct rte_eth_dev *dev __rte_unused) +hn_dev_close(struct rte_eth_dev *dev) { - PMD_INIT_LOG(DEBUG, "close"); + PMD_INIT_FUNC_TRACE(); hn_vf_close(dev); + hn_dev_free_queues(dev); } static const struct eth_dev_ops hn_eth_dev_ops = { diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c index 7856f7e6ec48..7d7b557785fa 100644 --- a/drivers/net/netvsc/hn_rxtx.c +++ b/drivers/net/netvsc/hn_rxtx.c @@ -840,12 +840,9 @@ hn_dev_rx_queue_setup(struct rte_eth_dev *dev, return error; } -void -hn_dev_rx_queue_release(void *arg) +static void +hn_rx_queue_free(struct hn_rx_queue *rxq, bool keep_primary) { - struct hn_rx_queue *rxq = arg; - - PMD_INIT_FUNC_TRACE(); if (!rxq) return; @@ -857,10 +854,21 @@ hn_dev_rx_queue_release(void *arg) hn_vf_rx_queue_release(rxq->hv, rxq->queue_id); /* Keep primary queue to allow for control operations */ - if (rxq != rxq->hv->primary) { - rte_free(rxq->event_buf); - rte_free(rxq); - } + if (keep_primary && rxq == rxq->hv->primary) + return; + + rte_free(rxq->event_buf); + rte_free(rxq); +} + +void +hn_dev_rx_queue_release(void *arg) +{ + struct hn_rx_queue *rxq = arg; + + PMD_INIT_FUNC_TRACE(); + + hn_rx_queue_free(rxq, true); } int @@ -1440,3 +1448,23 @@ hn_recv_pkts(void *prxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) return nb_rcv; } + +void +hn_dev_free_queues(struct rte_eth_dev *dev) +{ + unsigned int i; + + for (i = 0; i < dev->data->nb_rx_queues; i++) { + struct hn_rx_queue *rxq = dev->data->rx_queues[i]; + + hn_rx_queue_free(rxq, false); + dev->data->rx_queues[i] = NULL; + } + dev->data->nb_rx_queues = 0; + + for (i = 0; i < dev->data->nb_tx_queues; i++) { + hn_dev_tx_queue_release(dev->data->tx_queues[i]); + dev->data->tx_queues[i] = NULL; + } + dev->data->nb_tx_queues = 0; +} diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h index 8383f3246ca4..de885d898e6a 100644 --- a/drivers/net/netvsc/hn_var.h +++ b/drivers/net/netvsc/hn_var.h @@ -173,6 +173,7 @@ int hn_dev_rx_queue_setup(struct rte_eth_dev *dev, const struct rte_eth_rxconf *rx_conf, struct rte_mempool *mp); void hn_dev_rx_queue_release(void *arg); +void hn_dev_free_queues(struct rte_eth_dev *dev); /* Check if VF is attached */ static inline bool diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c index 883272ff498c..b980bb8a4d8a 100644 --- a/drivers/net/netvsc/hn_vf.c +++ b/drivers/net/netvsc/hn_vf.c @@ -362,7 +362,16 @@ void hn_vf_reset(struct rte_eth_dev *dev) void hn_vf_close(struct rte_eth_dev *dev) { - VF_ETHDEV_FUNC(dev, rte_eth_dev_close); + struct hn_data *hv = dev->data->dev_private; + uint16_t vf_port; + + rte_spinlock_lock(&hv->vf_lock); + vf_port = hv->vf_port; + if (vf_port != HN_INVALID_PORT) + rte_eth_dev_close(vf_port); + + hv->vf_port = HN_INVALID_PORT; + rte_spinlock_unlock(&hv->vf_lock); } void hn_vf_stats_reset(struct rte_eth_dev *dev)