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 749C1A0518 for ; Fri, 24 Jul 2020 14:10:52 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6C4561C23B; Fri, 24 Jul 2020 14:10:52 +0200 (CEST) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by dpdk.org (Postfix) with ESMTP id 190F51C235 for ; Fri, 24 Jul 2020 14:10:51 +0200 (CEST) Received: by mail-wr1-f65.google.com with SMTP id f1so7547363wro.2 for ; Fri, 24 Jul 2020 05:10:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=l+YL/QapwasHKD61CtmJAUTCYC/xNx/0L+kIUGtR/FQ=; b=ThogQa1T7mLF5AfCMDRNAl03O/+G5s0+huX1fiMhkSFNNmyLggWUWnWq54UZRmBWVk /t/y3KjoYDKM+X98mPAkm8FeQeiG1bonZztynTgMlj6NtPYwydE7YYLhKu+w8bELgV5S OscyvQLokbG9BGfgC3CCYdPeI+8Ej+ghrD1mWaiq918CzqdrP+jW5obk3xTZBhA/khA5 tOJi9FHmE6d9DqRnZ+w0YamFMCBHTCqQbLjxzO05naysDm3LuRvg6Er99/xuZYj08cOE zqGxSTkuoHTFyhgQiTpcXWROTpcoKTB6EjaPjJgS1wHQEiNIknZrN/JoxxZS5289m6h2 whzQ== 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=l+YL/QapwasHKD61CtmJAUTCYC/xNx/0L+kIUGtR/FQ=; b=o0MkvF2OfBzMVJxHKPQibgAmy0O0O6JRU8XpnhEjR4Zyux00gWHSYRwaUe12iGDorK 15BwqIE5u3EGfpgFlM7fehj8SEnBSruYBn3pC0gDyUcU1Jw/sPdOu7VpCo5uSqsU7fZV i5IaLawHDxumLkY9Cq6OXIQCP5gSE7CXRS1RMFkSlYNpFYeFeYGNMtEf4x0k5hxJPKeq dMhIa6TDlxMgmG5K+b1SIl3q91zmvUA7O2H2gRuvBDiVBJM6mdwTK4wQ/KNqLSo53bvM ijg7njbxrHxl2pLos/P9Z6xX5ArGX7QdjJd57QLrqS+zu1UKT8IcUwD7DqHMa/VmcIJV SYJw== X-Gm-Message-State: AOAM532R+DWZXvvSuXupEHv/7j9kvfV7ahwnXi4NSZPZcqCaNSRGBc3s Z6aWRYAUuhdh/Dm2eUiPjPw= X-Google-Smtp-Source: ABdhPJz61kIE3Bk7WI5SZSHHQLS8FestcBapfUk8+0f4NlCPxpJllSGMJkKKbu7n8f21ULqVN7WHBQ== X-Received: by 2002:adf:dfc7:: with SMTP id q7mr8382134wrn.80.1595592650716; Fri, 24 Jul 2020 05:10:50 -0700 (PDT) Received: from localhost ([88.98.246.218]) by smtp.gmail.com with ESMTPSA id t14sm1113997wrv.14.2020.07.24.05.10.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2020 05:10:50 -0700 (PDT) From: luca.boccassi@gmail.com To: Alvin Zhang Cc: Jeff Guo , dpdk stable Date: Fri, 24 Jul 2020 12:59:58 +0100 Message-Id: <20200724120030.1863487-160-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200724120030.1863487-1-luca.boccassi@gmail.com> References: <20200724120030.1863487-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] patch 'net/i40e: fix queue pairs configuration in VF' has been queued to stable release 19.11.4 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" Hi, FYI, your patch has been queued to stable release 19.11.4 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 07/26/20. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Thanks. Luca Boccassi --- >From 71e127b7febe0c9ce6456e4b7f2580679e63e4e2 Mon Sep 17 00:00:00 2001 From: Alvin Zhang Date: Thu, 16 Jul 2020 14:33:36 +0800 Subject: [PATCH] net/i40e: fix queue pairs configuration in VF [ upstream commit e230514582c8734424c6804d22d21427e9c3a088 ] If a VF request PF to allocate more number of queue pairs, the PF will free the queue pairs which have been allocated and reset the VF. So, VF should stop to work until all the process is done. This patch modify the process of the request queue pairs. To improve efficiency and eliminate code redundancy, the promiscuous ops were also updated. Fixes: c48eb308ed13 ("net/i40e: support VF request more queues") Signed-off-by: Alvin Zhang Acked-by: Jeff Guo --- drivers/net/i40e/i40e_ethdev_vf.c | 112 ++++++++++++++---------------- 1 file changed, 54 insertions(+), 58 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c index 1f1764908..0381ba64e 100644 --- a/drivers/net/i40e/i40e_ethdev_vf.c +++ b/drivers/net/i40e/i40e_ethdev_vf.c @@ -91,7 +91,8 @@ 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_close(struct rte_eth_dev *dev); -static int i40evf_dev_reset(struct rte_eth_dev *dev); +static int i40evf_dev_reset(struct rte_eth_dev *dev); +static int i40evf_check_vf_reset_done(struct rte_eth_dev *dev); static int i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev); static int i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev); static int i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev); @@ -518,10 +519,19 @@ i40evf_config_promisc(struct rte_eth_dev *dev, err = i40evf_execute_vf_cmd(dev, &args); - if (err) + if (err) { PMD_DRV_LOG(ERR, "fail to execute command " "CONFIG_PROMISCUOUS_MODE"); - return err; + + if (err == I40E_NOT_SUPPORTED) + return -ENOTSUP; + + return -EAGAIN; + } + + vf->promisc_unicast_enabled = enable_unicast; + vf->promisc_multicast_enabled = enable_multicast; + return 0; } static int @@ -1055,12 +1065,28 @@ i40evf_request_queues(struct rte_eth_dev *dev, uint16_t num) 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) + + rte_eal_alarm_set(I40EVF_ALARM_INTERVAL, i40evf_dev_alarm_handler, dev); + + if (err != I40E_SUCCESS) { PMD_DRV_LOG(ERR, "fail to execute command OP_REQUEST_QUEUES"); + return err; + } + + /* The PF will issue a reset to the VF when change the number of + * queues. The PF will set I40E_VFGEN_RSTAT to COMPLETE first, then + * wait 10ms and set it to ACTIVE. In this duration, vf may not catch + * the moment that COMPLETE is set. So, for vf, we'll try to wait a + * long time. + */ + rte_delay_ms(100); + + err = i40evf_check_vf_reset_done(dev); + if (err) + PMD_DRV_LOG(ERR, "VF is still resetting"); - rte_eal_alarm_set(I40EVF_ALARM_INTERVAL, - i40evf_dev_alarm_handler, dev); return err; } @@ -1490,7 +1516,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_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 @@ -1586,7 +1612,20 @@ i40evf_dev_configure(struct rte_eth_dev *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; + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { + PMD_DRV_LOG(ERR, + "For secondary processes, change queue pairs is not supported!"); + return -ENOTSUP; + } + + hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private); + if (!hw->adapter_stopped) { + PMD_DRV_LOG(ERR, "Device must be stopped first!"); + return -EBUSY; + } PMD_DRV_LOG(INFO, "change queue pairs from %u to %u", vf->vsi_res->num_queue_pairs, num_queue_pairs); @@ -2158,76 +2197,32 @@ static int i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev) { struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); - int ret; - /* If enabled, just return */ - if (vf->promisc_unicast_enabled) - return 0; - - ret = i40evf_config_promisc(dev, 1, vf->promisc_multicast_enabled); - if (ret == 0) - vf->promisc_unicast_enabled = TRUE; - else - ret = -EAGAIN; - - return ret; + return i40evf_config_promisc(dev, true, vf->promisc_multicast_enabled); } static int i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev) { struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); - int ret; - /* If disabled, just return */ - if (!vf->promisc_unicast_enabled) - return 0; - - ret = i40evf_config_promisc(dev, 0, vf->promisc_multicast_enabled); - if (ret == 0) - vf->promisc_unicast_enabled = FALSE; - else - ret = -EAGAIN; - - return ret; + return i40evf_config_promisc(dev, false, vf->promisc_multicast_enabled); } static int i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev) { struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); - int ret; - /* If enabled, just return */ - if (vf->promisc_multicast_enabled) - return 0; - - ret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 1); - if (ret == 0) - vf->promisc_multicast_enabled = TRUE; - else - ret = -EAGAIN; - - return ret; + return i40evf_config_promisc(dev, vf->promisc_unicast_enabled, true); } static int i40evf_dev_allmulticast_disable(struct rte_eth_dev *dev) { struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); - int ret; - /* If enabled, just return */ - if (!vf->promisc_multicast_enabled) - return 0; - - ret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 0); - if (ret == 0) - vf->promisc_multicast_enabled = FALSE; - else - ret = -EAGAIN; - - return ret; + return i40evf_config_promisc(dev, vf->promisc_unicast_enabled, false); } static int @@ -2349,8 +2344,9 @@ i40evf_dev_close(struct rte_eth_dev *dev) * it is a workaround solution when work with kernel driver * and it is not the normal way */ - i40evf_dev_promiscuous_disable(dev); - i40evf_dev_allmulticast_disable(dev); + if (vf->promisc_unicast_enabled || vf->promisc_multicast_enabled) + i40evf_config_promisc(dev, false, false); + rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev); i40evf_reset_vf(dev); -- 2.20.1 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2020-07-24 12:53:54.724871645 +0100 +++ 0160-net-i40e-fix-queue-pairs-configuration-in-VF.patch 2020-07-24 12:53:48.527010931 +0100 @@ -1,8 +1,10 @@ -From e230514582c8734424c6804d22d21427e9c3a088 Mon Sep 17 00:00:00 2001 +From 71e127b7febe0c9ce6456e4b7f2580679e63e4e2 Mon Sep 17 00:00:00 2001 From: Alvin Zhang Date: Thu, 16 Jul 2020 14:33:36 +0800 Subject: [PATCH] net/i40e: fix queue pairs configuration in VF +[ upstream commit e230514582c8734424c6804d22d21427e9c3a088 ] + If a VF request PF to allocate more number of queue pairs, the PF will free the queue pairs which have been allocated and reset the VF. So, VF should stop to work until all the process is done. This patch modify @@ -10,16 +12,15 @@ eliminate code redundancy, the promiscuous ops were also updated. Fixes: c48eb308ed13 ("net/i40e: support VF request more queues") -Cc: stable@dpdk.org Signed-off-by: Alvin Zhang Acked-by: Jeff Guo --- - drivers/net/i40e/i40e_ethdev_vf.c | 104 ++++++++++++++++-------------- - 1 file changed, 54 insertions(+), 50 deletions(-) + drivers/net/i40e/i40e_ethdev_vf.c | 112 ++++++++++++++---------------- + 1 file changed, 54 insertions(+), 58 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c -index eca716a6a..69cab8e73 100644 +index 1f1764908..0381ba64e 100644 --- a/drivers/net/i40e/i40e_ethdev_vf.c +++ b/drivers/net/i40e/i40e_ethdev_vf.c @@ -91,7 +91,8 @@ static int i40evf_vlan_filter_set(struct rte_eth_dev *dev, @@ -32,7 +33,7 @@ static int i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev); static int i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev); static int i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev); -@@ -519,10 +520,19 @@ i40evf_config_promisc(struct rte_eth_dev *dev, +@@ -518,10 +519,19 @@ i40evf_config_promisc(struct rte_eth_dev *dev, err = i40evf_execute_vf_cmd(dev, &args); @@ -54,7 +55,7 @@ } static int -@@ -1081,12 +1091,28 @@ i40evf_request_queues(struct rte_eth_dev *dev, uint16_t num) +@@ -1055,12 +1065,28 @@ i40evf_request_queues(struct rte_eth_dev *dev, uint16_t num) args.out_size = I40E_AQ_BUF_SZ; rte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev); @@ -86,7 +87,7 @@ return err; } -@@ -1514,7 +1540,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev) +@@ -1490,7 +1516,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_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; @@ -95,7 +96,7 @@ hw->adapter_closed = 0; /* Pass the information to the rte_eth_dev_close() that it should also -@@ -1610,7 +1636,20 @@ i40evf_dev_configure(struct rte_eth_dev *dev) +@@ -1586,7 +1612,20 @@ i40evf_dev_configure(struct rte_eth_dev *dev) ad->tx_vec_allowed = true; if (num_queue_pairs > vf->vsi_res->num_queue_pairs) { @@ -117,17 +118,19 @@ PMD_DRV_LOG(INFO, "change queue pairs from %u to %u", vf->vsi_res->num_queue_pairs, num_queue_pairs); -@@ -2182,68 +2221,32 @@ static int +@@ -2158,76 +2197,32 @@ static int i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev) { struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); - int ret; +- /* If enabled, just return */ +- if (vf->promisc_unicast_enabled) +- return 0; +- - ret = i40evf_config_promisc(dev, 1, vf->promisc_multicast_enabled); - if (ret == 0) - vf->promisc_unicast_enabled = TRUE; -- else if (ret == I40E_NOT_SUPPORTED) -- ret = -ENOTSUP; - else - ret = -EAGAIN; - @@ -141,11 +144,13 @@ struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); - int ret; +- /* If disabled, just return */ +- if (!vf->promisc_unicast_enabled) +- return 0; +- - ret = i40evf_config_promisc(dev, 0, vf->promisc_multicast_enabled); - if (ret == 0) - vf->promisc_unicast_enabled = FALSE; -- else if (ret == I40E_NOT_SUPPORTED) -- ret = -ENOTSUP; - else - ret = -EAGAIN; - @@ -159,11 +164,13 @@ struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); - int ret; +- /* If enabled, just return */ +- if (vf->promisc_multicast_enabled) +- return 0; +- - ret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 1); - if (ret == 0) - vf->promisc_multicast_enabled = TRUE; -- else if (ret == I40E_NOT_SUPPORTED) -- ret = -ENOTSUP; - else - ret = -EAGAIN; - @@ -177,11 +184,13 @@ struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); - int ret; +- /* If enabled, just return */ +- if (!vf->promisc_multicast_enabled) +- return 0; +- - ret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 0); - if (ret == 0) - vf->promisc_multicast_enabled = FALSE; -- else if (ret == I40E_NOT_SUPPORTED) -- ret = -ENOTSUP; - else - ret = -EAGAIN; - @@ -190,7 +199,7 @@ } static int -@@ -2365,8 +2368,9 @@ i40evf_dev_close(struct rte_eth_dev *dev) +@@ -2349,8 +2344,9 @@ i40evf_dev_close(struct rte_eth_dev *dev) * it is a workaround solution when work with kernel driver * and it is not the normal way */