From patchwork Thu Sep 29 17:03:44 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 16245 X-Patchwork-Delegate: bruce.richardson@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id E2A3256A8; Thu, 29 Sep 2016 19:04:30 +0200 (CEST) Received: from mail-gw3-out.broadcom.com (mail-gw3-out.broadcom.com [216.31.210.64]) by dpdk.org (Postfix) with ESMTP id 1125F56A8 for ; Thu, 29 Sep 2016 19:04:28 +0200 (CEST) X-IronPort-AV: E=Sophos;i="5.31,415,1473145200"; d="scan'208";a="105472003" Received: from mail-irv-18.broadcom.com ([10.15.198.37]) by mail-gw3-out.broadcom.com with ESMTP; 29 Sep 2016 10:39:10 -0700 Received: from mail-irva-12.broadcom.com (mail-irva-12.broadcom.com [10.11.16.101]) by mail-irv-18.broadcom.com (Postfix) with ESMTP id C34EA8202A for ; Thu, 29 Sep 2016 10:04:29 -0700 (PDT) Received: from C02PT1RBG8WP.aus.broadcom.com (dhcp-10-46-64-52.aus.broadcom.com [10.46.64.52]) by mail-irva-12.broadcom.com (Postfix) with ESMTP id 62D77C26C8 for ; Thu, 29 Sep 2016 10:03:44 -0700 (PDT) Date: Thu, 29 Sep 2016 12:03:44 -0500 From: Ajit Khaparde To: dev@dpdk.org Message-ID: <20160929170344.GA52223@C02PT1RBG8WP.aus.broadcom.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) Subject: [dpdk-dev] [PATCH 2/4] bnxt: Fix a segfault encountered during KNI exit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The bnxt PMD is running into a segfault when exiting out of KNI in the dev_uninit/close path. This patch fixes that. Signed-off-by: Ajit Khaparde --- drivers/net/bnxt/bnxt.h | 1 + drivers/net/bnxt/bnxt_ethdev.c | 34 ++++++++++++++++++++++------------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h index c77ecef..07b4cf2 100644 --- a/drivers/net/bnxt/bnxt.h +++ b/drivers/net/bnxt/bnxt.h @@ -175,6 +175,7 @@ struct bnxt { struct bnxt_pf_info pf; struct bnxt_vf_info vf; uint8_t port_partition_type; + uint8_t dev_stopped; }; #endif diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index bd1ffc0..1e3519b 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -428,6 +428,7 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev) struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private; int rc; + bp->dev_stopped = 0; rc = bnxt_hwrm_func_reset(bp); if (rc) { RTE_LOG(ERR, PMD, "hwrm chip reset failure rc: %x\n", rc); @@ -471,10 +472,27 @@ static int bnxt_dev_set_link_down_op(struct rte_eth_dev *eth_dev) return 0; } +/* Unload the driver, release resources */ +static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev) +{ + struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private; + + if (bp->eth_dev->data->dev_started) { + /* TBD: STOP HW queues DMA */ + eth_dev->data->dev_link.link_status = 0; + } + bnxt_set_hwrm_link_config(bp, false); + bnxt_shutdown_nic(bp); + bp->dev_stopped = 1; +} + static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev) { struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private; + if (bp->dev_stopped == 0) + bnxt_dev_stop_op(eth_dev); + bnxt_free_tx_mbufs(bp); bnxt_free_rx_mbufs(bp); bnxt_free_mem(bp); @@ -488,18 +506,6 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev) } } -/* Unload the driver, release resources */ -static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev) -{ - struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private; - - if (bp->eth_dev->data->dev_started) { - /* TBD: STOP HW queues DMA */ - eth_dev->data->dev_link.link_status = 0; - } - bnxt_shutdown_nic(bp); -} - static void bnxt_mac_addr_remove_op(struct rte_eth_dev *eth_dev, uint32_t index) { @@ -1078,6 +1084,8 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev) eth_dev->pci_dev->mem_resource[0].phys_addr, eth_dev->pci_dev->mem_resource[0].addr); + bp->dev_stopped = 0; + return 0; error_free: @@ -1101,6 +1109,8 @@ bnxt_dev_uninit(struct rte_eth_dev *eth_dev) { } rc = bnxt_hwrm_func_driver_unregister(bp, 0); bnxt_free_hwrm_resources(bp); + if (bp->dev_stopped == 0) + bnxt_dev_close_op(eth_dev); eth_dev->dev_ops = NULL; eth_dev->rx_pkt_burst = NULL; eth_dev->tx_pkt_burst = NULL;