From patchwork Mon Apr 29 20:33:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 53157 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 50B231B10E; Mon, 29 Apr 2019 22:33:38 +0200 (CEST) Received: from mail-pf1-f193.google.com (mail-pf1-f193.google.com [209.85.210.193]) by dpdk.org (Postfix) with ESMTP id 803581B105 for ; Mon, 29 Apr 2019 22:33:32 +0200 (CEST) Received: by mail-pf1-f193.google.com with SMTP id u17so1934867pfn.7 for ; Mon, 29 Apr 2019 13:33:32 -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=vOgnAzJjXJuiKSaZY/XjFaMuwTuY/SygBmNT+9wspLc=; b=qftRlekbYFDdgQ6qF2tmCiqKYCMl6reZss3ibA2wY8QDXDuAqhwFNHI3b6lK+3wiwt LblkkDUVYBiyCbB5GAGGZUz7Kj+IX8qFoGQ3maNadp5KBjvNhENu4vM4Bk4scuGL33bg 28HCknBDH4jAr5ZiVT+MgR+SgLsLCLKCp6fvSOcnrFsdWVtn6hLY5rn71SKSaH5cwpb7 MCw2rT/H9dj7uiJ0yIgQ6NFWN4Wsy+MgFXGfxpxQcMiCaPWfrYebFkKwnYI/iuVidiLr SVndSREOUYf4kQOuLCyHr/U9bQYVYsr5/+F9p33botN57VyqbpHPUVNDrikTSue2CXtU meqA== 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=vOgnAzJjXJuiKSaZY/XjFaMuwTuY/SygBmNT+9wspLc=; b=OcZWpOUrHn2p+fQFdkiPInKwWnlfZ5hfKuOIPeKFI6giZoHDcSruYGIbAK3KOZroXZ VQTzT2W0S6Gpi8F76mFdLOiWUu4GUvJSrgqwfB0JQu77uJ0eoJZ5nSxVXwOYGyoZHjRd LLSk2y5McbrdyPRervs3KRNJsGubg1ohH5yDxl/yroO/J6J99o25eoVWl+YdHGEfYcsr 0r7KOV9WOKrPYLPJV+yJQOD88FVubET8Qeo7/kKH/BnOaAASyy7Lf8x5YO+UUmK9OrZD Gm+H6jd5Mw6SDVpWRf1Eo8x9xSRb4ZoabSYZeXAGMmGw/7DOzn35U+Mncpe4cTs47sOt tkdw== X-Gm-Message-State: APjAAAURqaujNlpkEOH/ZF32fouyIeYlTU5HLAiDXBCRvujIHbemrajo a3Qr4jSIwwH+tsNk775KbSWBqn4BCus= X-Google-Smtp-Source: APXvYqz1urpJUaQyihh88xEvhn+TQkv5inTq2EPDTaseWtWsUa4yb6UmnyBCt3t9DHVMzL9EQdg6rA== X-Received: by 2002:a62:6086:: with SMTP id u128mr66785231pfb.148.1556570011359; Mon, 29 Apr 2019 13:33:31 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id i4sm3557424pfa.44.2019.04.29.13.33.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 29 Apr 2019 13:33:30 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger , Stephen Hemminger Date: Mon, 29 Apr 2019 13:33:25 -0700 Message-Id: <20190429203325.10696-3-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190429203325.10696-1-stephen@networkplumber.org> References: <20190429203325.10696-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 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" When dev_close is called, the netvsc driver will clean up all queues including the primary ring buffer. Signed-off-by: Stephen Hemminger --- drivers/net/netvsc/hn_ethdev.c | 8 +++++-- drivers/net/netvsc/hn_rxtx.c | 39 ++++++++++++++++++++++++++++------ drivers/net/netvsc/hn_var.h | 1 + 3 files changed, 40 insertions(+), 8 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..1bebae7cddd4 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,12 +854,22 @@ 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) { + if (keep_primary && rxq != rxq->hv->primary) { 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 hn_dev_tx_done_cleanup(void *arg, uint32_t free_cnt) { @@ -1440,3 +1447,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