get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/74065/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 74065,
    "url": "http://patchwork.dpdk.org/api/patches/74065/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20200715072811.12592-1-alvinx.zhang@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20200715072811.12592-1-alvinx.zhang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200715072811.12592-1-alvinx.zhang@intel.com",
    "date": "2020-07-15T07:28:11",
    "name": "[v3] net/i40e: fix modify the number of qps in VF",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "fce02fa53a797c10e8ec3d6b27a0f02c47a3899a",
    "submitter": {
        "id": 1398,
        "url": "http://patchwork.dpdk.org/api/people/1398/?format=api",
        "name": "Alvin Zhang",
        "email": "alvinx.zhang@intel.com"
    },
    "delegate": {
        "id": 1540,
        "url": "http://patchwork.dpdk.org/api/users/1540/?format=api",
        "username": "qzhan15",
        "first_name": "Qi",
        "last_name": "Zhang",
        "email": "qi.z.zhang@intel.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20200715072811.12592-1-alvinx.zhang@intel.com/mbox/",
    "series": [
        {
            "id": 11036,
            "url": "http://patchwork.dpdk.org/api/series/11036/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=11036",
            "date": "2020-07-15T07:28:11",
            "name": "[v3] net/i40e: fix modify the number of qps in VF",
            "version": 3,
            "mbox": "http://patchwork.dpdk.org/series/11036/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/74065/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/74065/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 8FD9FA0540;\n\tWed, 15 Jul 2020 09:30:24 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 428F11BFB5;\n\tWed, 15 Jul 2020 09:30:24 +0200 (CEST)",
            "from mga14.intel.com (mga14.intel.com [192.55.52.115])\n by dpdk.org (Postfix) with ESMTP id 9F5141BFB4\n for <dev@dpdk.org>; Wed, 15 Jul 2020 09:30:22 +0200 (CEST)",
            "from fmsmga002.fm.intel.com ([10.253.24.26])\n by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 15 Jul 2020 00:30:21 -0700",
            "from shwdenpg235.ccr.corp.intel.com ([10.240.182.60])\n by fmsmga002.fm.intel.com with ESMTP; 15 Jul 2020 00:30:18 -0700"
        ],
        "IronPort-SDR": [
            "\n kCx9DCMD+5JlvknInsQD1yUx0Kk9tnUz7HWBhET9ZITCEVdsFrp4Yz8AGnRyC5+INaABXSiggN\n zwwz2Tvm/H6Q==",
            "\n uTrPD2zfd2izqKDxVRjAMBy42sjKxOHtr+nXOeSyAt1p+Vw+lrfXQPvJns95son05Wit34w5Iw\n Q9/hIQuQeUHQ=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9682\"; a=\"148247999\"",
            "E=Sophos;i=\"5.75,354,1589266800\"; d=\"scan'208\";a=\"148247999\"",
            "E=Sophos;i=\"5.75,354,1589266800\"; d=\"scan'208\";a=\"317977718\""
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "From": "alvinx.zhang@intel.com",
        "To": "jia.guo@intel.com",
        "Cc": "dev@dpdk.org,\n\tbeilei.xing@intel.com",
        "Date": "Wed, 15 Jul 2020 15:28:11 +0800",
        "Message-Id": "<20200715072811.12592-1-alvinx.zhang@intel.com>",
        "X-Mailer": "git-send-email 2.21.0.windows.1",
        "In-Reply-To": "<20200702032610.11076-1-alvinx.zhang@intel.com>",
        "References": "<20200702032610.11076-1-alvinx.zhang@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v3] net/i40e: fix modify the number of qps in VF",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Alvin Zhang <alvinx.zhang@intel.com>\n\nIf a VF request PF to allocate more number of queue pairs, the PF will\nfree the queue pairs which have been allocated and reset the VF. So,\nVF should stop to work until all the process is done. This patch modify\nthe process of the request queue pairs. To improve efficiency and\neliminate code redundancy, the promiscuous ops were also updated.\n\nFixes: c48eb308ed13 (\"net/i40e: support VF request more queues\")\nCc: stable@dpdk.org\n\nSigned-off-by: Alvin Zhang <alvinx.zhang@intel.com>\n---\n\nV2: Update git log and modify codes according to comments.\nV3: All the code was refactored.\n---\n drivers/net/i40e/i40e_ethdev_vf.c | 109 +++++++++++++++++++++-----------------\n 1 file changed, 59 insertions(+), 50 deletions(-)",
    "diff": "diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c\nindex eca716a..758d444 100644\n--- a/drivers/net/i40e/i40e_ethdev_vf.c\n+++ b/drivers/net/i40e/i40e_ethdev_vf.c\n@@ -91,7 +91,8 @@ static int i40evf_vlan_filter_set(struct rte_eth_dev *dev,\n \t\t\t\t  uint16_t vlan_id, int on);\n static int i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n static void i40evf_dev_close(struct rte_eth_dev *dev);\n-static int  i40evf_dev_reset(struct rte_eth_dev *dev);\n+static int i40evf_dev_reset(struct rte_eth_dev *dev);\n+static int i40evf_check_vf_reset_done(struct rte_eth_dev *dev);\n static int i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev);\n static int i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev);\n static int i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev);\n@@ -519,10 +520,17 @@ struct rte_i40evf_xstats_name_off {\n \n \terr = i40evf_execute_vf_cmd(dev, &args);\n \n-\tif (err)\n-\t\tPMD_DRV_LOG(ERR, \"fail to execute command \"\n-\t\t\t    \"CONFIG_PROMISCUOUS_MODE\");\n-\treturn err;\n+\tif (err) {\n+\t\tif (err == I40E_NOT_SUPPORTED)\n+\t\t\treturn -ENOTSUP;\n+\n+\t\tPMD_DRV_LOG(ERR, \"Failed to set promiscuous mode\");\n+\t\treturn -EAGAIN;\n+\t}\n+\n+\tvf->promisc_unicast_enabled = enable_unicast;\n+\tvf->promisc_multicast_enabled = enable_multicast;\n+\treturn 0;\n }\n \n static int\n@@ -1081,12 +1089,31 @@ static int i40evf_dev_xstats_get(struct rte_eth_dev *dev,\n \targs.out_size = I40E_AQ_BUF_SZ;\n \n \trte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev);\n+\n \terr = i40evf_execute_vf_cmd(dev, &args);\n-\tif (err)\n+\tif (err != I40E_SUCCESS) {\n+\t\trte_eal_alarm_set(I40EVF_ALARM_INTERVAL,\n+\t\t\t\t  i40evf_dev_alarm_handler, dev);\n \t\tPMD_DRV_LOG(ERR, \"fail to execute command OP_REQUEST_QUEUES\");\n+\t\treturn -EIO;\n+\t}\n \n \trte_eal_alarm_set(I40EVF_ALARM_INTERVAL,\n \t\t\t  i40evf_dev_alarm_handler, dev);\n+\n+\t/*\n+\t * The PF will issue a reset to the VF when change the number of\n+\t * queues. The PF will set I40E_VFGEN_RSTAT to COMPLETE first, then\n+\t * wait 10ms and set it to ACTIVE. In this duration, vf may not catch\n+\t * the moment that COMPLETE is set. So, for vf, we'll try to wait a\n+\t * long time.\n+\t */\n+\trte_delay_ms(100);\n+\n+\terr = i40evf_check_vf_reset_done(dev);\n+\tif (err)\n+\t\tPMD_DRV_LOG(ERR, \"VF is still resetting\");\n+\n \treturn err;\n }\n \n@@ -1514,7 +1541,7 @@ static int i40evf_dev_xstats_get(struct rte_eth_dev *dev,\n \thw->bus.device = pci_dev->addr.devid;\n \thw->bus.func = pci_dev->addr.function;\n \thw->hw_addr = (void *)pci_dev->mem_resource[0].addr;\n-\thw->adapter_stopped = 0;\n+\thw->adapter_stopped = 1;\n \thw->adapter_closed = 0;\n \n \t/* Pass the information to the rte_eth_dev_close() that it should also\n@@ -1610,10 +1637,27 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev)\n \tad->tx_vec_allowed = true;\n \n \tif (num_queue_pairs > vf->vsi_res->num_queue_pairs) {\n-\t\tint ret = 0;\n+\t\tstruct i40e_hw *hw;\n+\t\tint ret;\n+\n+\t\t/*\n+\t\t * All VF resources will be reallocated, so change queue pairs\n+\t\t * in secondary processes is forbidden.\n+\t\t */\n+\t\tif (rte_eal_process_type() != RTE_PROC_PRIMARY) {\n+\t\t\tPMD_DRV_LOG(ERR,\n+\t\t\t\t\"For secondary processes, change queue pairs is forbidden!\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n \n+\t\thw  = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \t\tPMD_DRV_LOG(INFO, \"change queue pairs from %u to %u\",\n \t\t\t    vf->vsi_res->num_queue_pairs, num_queue_pairs);\n+\t\tif (hw->adapter_stopped == 0) {\n+\t\t\tPMD_DRV_LOG(WARNING, \"Device must be stopped first!\");\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\n \t\tret = i40evf_request_queues(dev, num_queue_pairs);\n \t\tif (ret != 0)\n \t\t\treturn ret;\n@@ -2182,68 +2226,32 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev)\n i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev)\n {\n \tstruct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);\n-\tint ret;\n-\n-\tret = i40evf_config_promisc(dev, 1, vf->promisc_multicast_enabled);\n-\tif (ret == 0)\n-\t\tvf->promisc_unicast_enabled = TRUE;\n-\telse if (ret == I40E_NOT_SUPPORTED)\n-\t\tret = -ENOTSUP;\n-\telse\n-\t\tret = -EAGAIN;\n \n-\treturn ret;\n+\treturn i40evf_config_promisc(dev, true, vf->promisc_multicast_enabled);\n }\n \n static int\n i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev)\n {\n \tstruct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);\n-\tint ret;\n-\n-\tret = i40evf_config_promisc(dev, 0, vf->promisc_multicast_enabled);\n-\tif (ret == 0)\n-\t\tvf->promisc_unicast_enabled = FALSE;\n-\telse if (ret == I40E_NOT_SUPPORTED)\n-\t\tret = -ENOTSUP;\n-\telse\n-\t\tret = -EAGAIN;\n \n-\treturn ret;\n+\treturn i40evf_config_promisc(dev, false, vf->promisc_multicast_enabled);\n }\n \n static int\n i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev)\n {\n \tstruct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);\n-\tint ret;\n-\n-\tret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 1);\n-\tif (ret == 0)\n-\t\tvf->promisc_multicast_enabled = TRUE;\n-\telse if (ret == I40E_NOT_SUPPORTED)\n-\t\tret = -ENOTSUP;\n-\telse\n-\t\tret = -EAGAIN;\n \n-\treturn ret;\n+\treturn i40evf_config_promisc(dev, vf->promisc_unicast_enabled, true);\n }\n \n static int\n i40evf_dev_allmulticast_disable(struct rte_eth_dev *dev)\n {\n \tstruct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);\n-\tint ret;\n-\n-\tret = i40evf_config_promisc(dev, vf->promisc_unicast_enabled, 0);\n-\tif (ret == 0)\n-\t\tvf->promisc_multicast_enabled = FALSE;\n-\telse if (ret == I40E_NOT_SUPPORTED)\n-\t\tret = -ENOTSUP;\n-\telse\n-\t\tret = -EAGAIN;\n \n-\treturn ret;\n+\treturn i40evf_config_promisc(dev, vf->promisc_unicast_enabled, false);\n }\n \n static int\n@@ -2365,8 +2373,9 @@ static int eth_i40evf_pci_remove(struct rte_pci_device *pci_dev)\n \t * it is a workaround solution when work with kernel driver\n \t * and it is not the normal way\n \t */\n-\ti40evf_dev_promiscuous_disable(dev);\n-\ti40evf_dev_allmulticast_disable(dev);\n+\tif (vf->promisc_unicast_enabled || vf->promisc_multicast_enabled)\n+\t\ti40evf_config_promisc(dev, false, false);\n+\n \trte_eal_alarm_cancel(i40evf_dev_alarm_handler, dev);\n \n \ti40evf_reset_vf(dev);\n",
    "prefixes": [
        "v3"
    ]
}