From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by dpdk.org (Postfix) with ESMTP id 67A9F343C for ; Wed, 19 Sep 2018 14:58:15 +0200 (CEST) Received: by mail-wr1-f65.google.com with SMTP id a108-v6so5679456wrc.13 for ; Wed, 19 Sep 2018 05:58:15 -0700 (PDT) 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; bh=oFsaAzc/ia0HQrdN2OIOnfFX+61bMmIKXRVsmdt2e7o=; b=h3rSXcWI4MYu4ybOhmX0E3v5Ee55+4IEqGpx5S6YqTr+tpy5oG869hDACq9lCAoDW5 AXUMXFc2lM2Q3JCSEsaw/ENvuXNQlRwoEBXHUfDQFJeagWyTKUVzfSYlr/DvLhSpDA+n oO97m9VqXVqupKiqOxGxKX5sBq/JLc2qV8aKNWjPrfNTsBkPK4NIkZ0mpZU38f75BBvT ZoSkjtyTbqW2dzXS7ekLQtcjxg+YnqJOjhNtwtxSdT/da+vX9K1cIc3+EkHk6X5HXGQN zX+msUU5iBxja2yMI9iWMppK7N+3ZjMd/o6zy63M0KLuAVcRryn3Ieqdy/aAQf1FqjVP YROQ== X-Gm-Message-State: APzg51Abck2LMtvzM+Y3RqRZO8OnMue319k8EBqbu/LBlxia5e28th6a vxQxIy6dH85aWgrJxEapiR8Q1XSeDew= X-Google-Smtp-Source: ANB0Vdan95qjQgmu7OwbHbp1UyaaibWKkcsrW0rJfv284alH3AbixXM5HeD5L9r+cr/kri2GY2st3Q== X-Received: by 2002:adf:fd12:: with SMTP id e18-v6mr29567140wrr.280.1537361894646; Wed, 19 Sep 2018 05:58:14 -0700 (PDT) Received: from localhost ([2001:1be0:110d:fcfe:489f:80a9:5d59:c6bd]) by smtp.gmail.com with ESMTPSA id o15-v6sm21468205wru.23.2018.09.19.05.58.12 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 19 Sep 2018 05:58:13 -0700 (PDT) From: Luca Boccassi To: dev@dpdk.org Cc: maxime.coquelin@redhat.com, tiwei.bie@intel.com, yongwang@vmware.com, 3chas3@gmail.com, bruce.richardson@intel.com, jianfeng.tan@intel.com, anatoly.burakov@intel.com, llouis@vmware.com, brussell@vyatta.att-mail.com Date: Wed, 19 Sep 2018 13:57:56 +0100 Message-Id: <20180919125757.17938-2-bluca@debian.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180919125757.17938-1-bluca@debian.org> References: <20180816135032.28283-1-bluca@debian.org> <20180919125757.17938-1-bluca@debian.org> Subject: [dpdk-dev] [PATCH v2 2/3] net/vmxnet3: fix vmxnet3 dev_uninit() hot-unplug 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: , X-List-Received-Date: Wed, 19 Sep 2018 12:58:15 -0000 The vmxnet3 driver can't call back into dev_close(), and possibly dev_stop(), in dev_uninit(). When dev_uninit() is called, anything that those routines would want to clean up has already been released. Further, for complete cleanup, it is necessary to release any of the queue resources during dev_close(). This allows a vmxnet3 device to be hot-unplugged without leaking queues. Fixes: dfaff37fc46d ("vmxnet3: import new vmxnet3 poll mode driver implementation") Cc: stable@dpdk.org Signed-off-by: Brian Russell Signed-off-by: Luca Boccassi --- v2: add back extra close() call in uninit() for buggy applications as requested by the reviewers, and add debug log noting the issue drivers/net/vmxnet3/vmxnet3_ethdev.c | 35 +++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c index f1596ab19d..98e5d01890 100644 --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c @@ -354,8 +354,10 @@ eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; - if (hw->adapter_stopped == 0) + if (hw->adapter_stopped == 0) { + PMD_INIT_LOG(DEBUG, "Device has not been closed."); vmxnet3_dev_close(eth_dev); + } eth_dev->dev_ops = NULL; eth_dev->rx_pkt_burst = NULL; @@ -802,7 +804,7 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); if (hw->adapter_stopped == 1) { - PMD_INIT_LOG(DEBUG, "Device already closed."); + PMD_INIT_LOG(DEBUG, "Device already stopped."); return; } @@ -826,7 +828,6 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev) /* reset the device */ VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV); PMD_INIT_LOG(DEBUG, "Device reset."); - hw->adapter_stopped = 0; vmxnet3_dev_clear_queues(dev); @@ -836,6 +837,30 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev) link.link_speed = ETH_SPEED_NUM_10G; link.link_autoneg = ETH_LINK_FIXED; rte_eth_linkstatus_set(dev, &link); + + hw->adapter_stopped = 1; +} + +static void +vmxnet3_free_queues(struct rte_eth_dev *dev) +{ + int i; + + PMD_INIT_FUNC_TRACE(); + + for (i = 0; i < dev->data->nb_rx_queues; i++) { + void *rxq = dev->data->rx_queues[i]; + + vmxnet3_dev_rx_queue_release(rxq); + } + dev->data->nb_rx_queues = 0; + + for (i = 0; i < dev->data->nb_tx_queues; i++) { + void *txq = dev->data->tx_queues[i]; + + vmxnet3_dev_tx_queue_release(txq); + } + dev->data->nb_tx_queues = 0; } /* @@ -844,12 +869,10 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev) static void vmxnet3_dev_close(struct rte_eth_dev *dev) { - struct vmxnet3_hw *hw = dev->data->dev_private; - PMD_INIT_FUNC_TRACE(); vmxnet3_dev_stop(dev); - hw->adapter_stopped = 1; + vmxnet3_free_queues(dev); } static void -- 2.18.0