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 7117BA0523 for ; Thu, 2 Jul 2020 05:15:24 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 41AEC1C1BF; Thu, 2 Jul 2020 05:15:24 +0200 (CEST) Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by dpdk.org (Postfix) with ESMTP id 62B021C1BF for ; Thu, 2 Jul 2020 05:15:22 +0200 (CEST) IronPort-SDR: +tVTdP5mATRoy0lI6bUJpH3S4z0g4TYI8tAn6+DfPVWpQ9yLiPYTw+SLd3HqlNF9OArOB7iMl1 JHuawMR4AgwA== X-IronPort-AV: E=McAfee;i="6000,8403,9669"; a="134235201" X-IronPort-AV: E=Sophos;i="5.75,302,1589266800"; d="scan'208";a="134235201" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Jul 2020 20:15:20 -0700 IronPort-SDR: pKLgZOi01Y9I2c0WOvJq7w2o5LxXrACpT9Qkd/M+TOHD6njnL8dTRnMX/ScHIL6gpWU7XPpi64 HnJdlLlSs4nA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,302,1589266800"; d="scan'208";a="313983884" Received: from shwdenpg235.ccr.corp.intel.com ([10.240.182.60]) by fmsmga002.fm.intel.com with ESMTP; 01 Jul 2020 20:15:19 -0700 From: alvinx.zhang@intel.com To: qabuild@intel.com Cc: Alvin Zhang , stable@dpdk.org Date: Thu, 2 Jul 2020 11:13:10 +0800 Message-Id: <20200702031310.20392-1-alvinx.zhang@intel.com> X-Mailer: git-send-email 2.21.0.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] [DPDK] net/i40e: fix modify the number of qps in VF 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" From: Alvin Zhang For a VF, if the number of request queue pairs is greater than that has been allocated by the kernel driver, the app may fail to start. This patch modify the request queue process. Fixes: c48eb308ed13 ("net/i40e: support VF request more queues") Fixes: dbda2092deb5 ("net/i40e: fix request queue in VF") Cc: stable@dpdk.org Signed-off-by: Alvin Zhang --- V2: Update git log and modify codes according to comments. --- drivers/net/i40e/i40e_ethdev_vf.c | 57 +++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c index eca716a..86e90e7 100644 --- a/drivers/net/i40e/i40e_ethdev_vf.c +++ b/drivers/net/i40e/i40e_ethdev_vf.c @@ -90,6 +90,7 @@ static int i40evf_dev_xstats_get_names(struct rte_eth_dev *dev, static int i40evf_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on); static int i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask); +static void i40evf_dev_release(struct rte_eth_dev *dev); static void i40evf_dev_close(struct rte_eth_dev *dev); static int i40evf_dev_reset(struct rte_eth_dev *dev); static int i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev); @@ -1080,13 +1081,10 @@ static int i40evf_dev_xstats_get(struct rte_eth_dev *dev, args.out_buffer = vf->aq_resp; args.out_size = I40E_AQ_BUF_SZ; - rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev); err = i40evf_execute_vf_cmd(dev, &args); if (err) PMD_DRV_LOG(ERR, "fail to execute command OP_REQUEST_QUEUES"); - rte_eal_alarm_set(I40EVF_ALARM_INTERVAL, - i40evf_dev_alarm_handler, dev); return err; } @@ -1514,7 +1512,7 @@ static int i40evf_dev_xstats_get(struct rte_eth_dev *dev, hw->bus.device = pci_dev->addr.devid; hw->bus.func = pci_dev->addr.function; hw->hw_addr = (void *)pci_dev->mem_resource[0].addr; - hw->adapter_stopped = 0; + hw->adapter_stopped = 1; hw->adapter_closed = 0; /* Pass the information to the rte_eth_dev_close() that it should also @@ -1610,16 +1608,39 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev) ad->tx_vec_allowed = true; if (num_queue_pairs > vf->vsi_res->num_queue_pairs) { - int ret = 0; + struct i40e_hw *hw; + int ret; + + /* + * All VF resources will be reallocated, so change queue pairs + * in secondary processes is forbidden. + */ + if (rte_eal_process_type() != RTE_PROC_PRIMARY){ + PMD_DRV_LOG(ERR, + "For secondary processes, change queue pairs is forbidden!"); + return -ENOTSUP; + } + hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private); PMD_DRV_LOG(INFO, "change queue pairs from %u to %u", vf->vsi_res->num_queue_pairs, num_queue_pairs); + if (hw->adapter_stopped == 0) { + PMD_DRV_LOG(WARNING, "Device must be stopped first!"); + return -EINVAL; + } + + rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev); ret = i40evf_request_queues(dev, num_queue_pairs); - if (ret != 0) + if (ret) return ret; - ret = i40evf_dev_reset(dev); - if (ret != 0) + /* + * The device has been reseted after queue resources changed + * and must be reinitiated. + */ + i40evf_dev_release(dev); + ret = i40evf_dev_init(dev); + if (ret) return ret; } @@ -2356,10 +2377,7 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev) i40evf_dev_close(struct rte_eth_dev *dev) { struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); - i40evf_dev_stop(dev); - i40e_dev_free_queues(dev); /* * disable promiscuous mode before reset vf * it is a workaround solution when work with kernel driver @@ -2370,19 +2388,30 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev) rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev); i40evf_reset_vf(dev); - i40e_shutdown_adminq(hw); - i40evf_disable_irq0(hw); + i40evf_dev_release(dev); dev->dev_ops = NULL; dev->rx_pkt_burst = NULL; dev->tx_pkt_burst = NULL; + hw->adapter_closed = 1; +} + +static void +i40evf_dev_release(struct rte_eth_dev *dev) +{ + struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private); + struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); + + i40e_shutdown_adminq(hw); + i40evf_disable_irq0(hw); + rte_free(vf->vf_res); vf->vf_res = NULL; rte_free(vf->aq_resp); vf->aq_resp = NULL; - hw->adapter_closed = 1; + i40e_dev_free_queues(dev); } /* -- 1.8.3.1