get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 110298,
    "url": "http://patches.dpdk.org/api/patches/110298/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20220427152524.228930-1-yidingx.zhou@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.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": "<20220427152524.228930-1-yidingx.zhou@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20220427152524.228930-1-yidingx.zhou@intel.com",
    "date": "2022-04-27T15:25:24",
    "name": "[v2] net/iavf: fix segfaults when calling API after VF reset failed",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "1e6fba44c50b02dfb4001194240a9a47af8d00df",
    "submitter": {
        "id": 2501,
        "url": "http://patches.dpdk.org/api/people/2501/?format=api",
        "name": "Yiding Zhou",
        "email": "yidingx.zhou@intel.com"
    },
    "delegate": {
        "id": 1540,
        "url": "http://patches.dpdk.org/api/users/1540/?format=api",
        "username": "qzhan15",
        "first_name": "Qi",
        "last_name": "Zhang",
        "email": "qi.z.zhang@intel.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20220427152524.228930-1-yidingx.zhou@intel.com/mbox/",
    "series": [
        {
            "id": 22682,
            "url": "http://patches.dpdk.org/api/series/22682/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=22682",
            "date": "2022-04-27T15:25:24",
            "name": "[v2] net/iavf: fix segfaults when calling API after VF reset failed",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/22682/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/110298/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/110298/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id BD94DA050F;\n\tWed, 27 Apr 2022 09:19:15 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4261A4113F;\n\tWed, 27 Apr 2022 09:19:15 +0200 (CEST)",
            "from mga11.intel.com (mga11.intel.com [192.55.52.93])\n by mails.dpdk.org (Postfix) with ESMTP id 2D8E140691;\n Wed, 27 Apr 2022 09:19:13 +0200 (CEST)",
            "from orsmga006.jf.intel.com ([10.7.209.51])\n by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 27 Apr 2022 00:19:12 -0700",
            "from unknown (HELO localhost.localdomain) ([10.239.251.174])\n by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 27 Apr 2022 00:19:09 -0700"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1651043953; x=1682579953;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=l5cYzVq5+9ynNrC0db77RRpKeGvtzEnUahfRagEPoKw=;\n b=TxOoS1Y/3aNxAArIC6yZmmiPdj0XxsZpmyi0huPtW0ozm/4g1FXAzURp\n M1PAkL6rl4CCfehiMxiAjY0mDh9b9E82zSlTYSKeNcq4POCcW0q5e15az\n 31aTrp241Bau95Y7zH9aLaUHQXCEJP+W8MHBHIWRmjkltDzHmeHJwPUh1\n f3eLWP7s5XBjNAC93DEXTvkPakQK1ak08QYCo9RzECikQffiRWqMtUwC4\n Em0MQdQgA5rkRXSmRXUxDM8SmQmOZp3eiweHW96m4T4Lnn0IADvoYDjuj\n 1OZ7GA3YjQPMgQ5EUnIw+J+twqqnvFGRhcxgR8q7Goepa9RxpsFxOaWx2 g==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6400,9594,10329\"; a=\"263434590\"",
            "E=Sophos;i=\"5.90,292,1643702400\"; d=\"scan'208\";a=\"263434590\"",
            "E=Sophos;i=\"5.90,292,1643702400\"; d=\"scan'208\";a=\"533074741\""
        ],
        "From": "Yiding Zhou <yidingx.zhou@intel.com>",
        "To": "dev@dpdk.org,\n\tjingjing.wu@intel.com,\n\tbeilei.xing@intel.com",
        "Cc": "qiming.yang@intel.com, qi.z.zhang@intel.com, stable@dpdk.org,\n Yiding Zhou <yidingx.zhou@intel.com>",
        "Subject": "[PATCH v2] net/iavf: fix segfaults when calling API after VF reset\n failed",
        "Date": "Wed, 27 Apr 2022 23:25:24 +0800",
        "Message-Id": "<20220427152524.228930-1-yidingx.zhou@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20220421170827.2753175-1-yidingx.zhou@intel.com>",
        "References": "<20220421170827.2753175-1-yidingx.zhou@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "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"
    },
    "content": "Some pointers will be set to NULL when iavf_dev_reset() failed,\nfor example vf->vf_res, vf->vsi_res vf->rss_key and etc.\nAPIs access these NULL pointers will trigger segfault.\n\nThis patch adds closed flag to indicate that the VF is closed,\nand rejects API calls in this state to avoid coredump.\n\nFixes: e74e1bb6280d (\"net/iavf: enable port reset\")\nCc: stable@dpdk.org\n\nSigned-off-by: Yiding Zhou <yidingx.zhou@intel.com>\n---\n drivers/net/iavf/iavf.h        |  1 +\n drivers/net/iavf/iavf_ethdev.c | 57 +++++++++++++++++++++++++++++++---\n drivers/net/iavf/iavf_rxtx.c   | 10 ++++++\n drivers/net/iavf/iavf_vchnl.c  | 17 ++++++++++\n 4 files changed, 81 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h\nindex a01d18e61b..b3b582dd21 100644\n--- a/drivers/net/iavf/iavf.h\n+++ b/drivers/net/iavf/iavf.h\n@@ -298,6 +298,7 @@ struct iavf_adapter {\n \tbool tx_vec_allowed;\n \tuint32_t ptype_tbl[IAVF_MAX_PKT_TYPE] __rte_cache_min_aligned;\n \tbool stopped;\n+\tbool closed;\n \tuint16_t fdir_ref_cnt;\n \tstruct iavf_devargs devargs;\n };\ndiff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c\nindex d6190ac24a..91b6e64840 100644\n--- a/drivers/net/iavf/iavf_ethdev.c\n+++ b/drivers/net/iavf/iavf_ethdev.c\n@@ -229,9 +229,15 @@ static const struct eth_dev_ops iavf_eth_dev_ops = {\n };\n \n static int\n-iavf_tm_ops_get(struct rte_eth_dev *dev __rte_unused,\n+iavf_tm_ops_get(struct rte_eth_dev *dev,\n \t\t\tvoid *arg)\n {\n+\tstruct iavf_adapter *adapter =\n+\t\tIAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);\n+\n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tif (!arg)\n \t\treturn -EINVAL;\n \n@@ -342,6 +348,9 @@ iavf_set_mc_addr_list(struct rte_eth_dev *dev,\n \t\treturn -EINVAL;\n \t}\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \t/* flush previous addresses */\n \terr = iavf_add_del_mc_addr_list(adapter, vf->mc_addrs, vf->mc_addrs_num,\n \t\t\t\t\tfalse);\n@@ -613,6 +622,9 @@ iavf_dev_configure(struct rte_eth_dev *dev)\n \t\tdev->data->nb_tx_queues);\n \tint ret;\n \n+\tif (ad->closed)\n+\t\treturn -EIO;\n+\n \tad->rx_bulk_alloc_allowed = true;\n \t/* Initialize to TRUE. If any of Rx queues doesn't meet the\n \t * vector Rx/Tx preconditions, it will be reset.\n@@ -932,6 +944,9 @@ iavf_dev_start(struct rte_eth_dev *dev)\n \n \tPMD_INIT_FUNC_TRACE();\n \n+\tif (adapter->closed)\n+\t\treturn -1;\n+\n \tadapter->stopped = 0;\n \n \tvf->max_pkt_len = dev->data->mtu + IAVF_ETH_OVERHEAD;\n@@ -1009,6 +1024,9 @@ iavf_dev_stop(struct rte_eth_dev *dev)\n \n \tPMD_INIT_FUNC_TRACE();\n \n+\tif (adapter->closed)\n+\t\treturn -1;\n+\n \tif (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR) &&\n \t    dev->data->dev_conf.intr_conf.rxq != 0)\n \t\trte_intr_disable(intr_handle);\n@@ -1046,6 +1064,9 @@ iavf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n \t\tIAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);\n \tstruct iavf_info *vf = &adapter->vf;\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tdev_info->max_rx_queues = IAVF_MAX_NUM_QUEUES_LV;\n \tdev_info->max_tx_queues = IAVF_MAX_NUM_QUEUES_LV;\n \tdev_info->min_rx_bufsize = IAVF_BUF_SIZE_MIN;\n@@ -1286,6 +1307,9 @@ iavf_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)\n \tstruct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);\n \tint err;\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tif (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2) {\n \t\terr = iavf_add_del_vlan_v2(adapter, vlan_id, on);\n \t\tif (err)\n@@ -1362,6 +1386,9 @@ iavf_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n \tstruct rte_eth_conf *dev_conf = &dev->data->dev_conf;\n \tint err;\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tif (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2)\n \t\treturn iavf_dev_vlan_offload_set_v2(dev, mask);\n \n@@ -1394,6 +1421,9 @@ iavf_dev_rss_reta_update(struct rte_eth_dev *dev,\n \tuint16_t i, idx, shift;\n \tint ret;\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tif (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF))\n \t\treturn -ENOTSUP;\n \n@@ -1439,6 +1469,9 @@ iavf_dev_rss_reta_query(struct rte_eth_dev *dev,\n \tstruct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);\n \tuint16_t i, idx, shift;\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tif (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF))\n \t\treturn -ENOTSUP;\n \n@@ -1492,6 +1525,9 @@ iavf_dev_rss_hash_update(struct rte_eth_dev *dev,\n \n \tadapter->dev_data->dev_conf.rx_adv_conf.rss_conf = *rss_conf;\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tif (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF))\n \t\treturn -ENOTSUP;\n \n@@ -1545,6 +1581,9 @@ iavf_dev_rss_hash_conf_get(struct rte_eth_dev *dev,\n \t\tIAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);\n \tstruct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tif (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF))\n \t\treturn -ENOTSUP;\n \n@@ -1792,6 +1831,9 @@ iavf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)\n \tstruct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);\n \tuint16_t msix_intr;\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tmsix_intr = rte_intr_vec_list_index_get(pci_dev->intr_handle,\n \t\t\t\t\t\t       queue_id);\n \tif (msix_intr == IAVF_MISC_VEC_ID) {\n@@ -2415,8 +2457,11 @@ static int\n iavf_dev_flow_ops_get(struct rte_eth_dev *dev,\n \t\t      const struct rte_flow_ops **ops)\n {\n-\tif (!dev)\n-\t\treturn -EINVAL;\n+\tstruct iavf_adapter *adapter =\n+\t\tIAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);\n+\n+\tif (adapter->closed)\n+\t\treturn -EIO;\n \n \t*ops = &iavf_flow_ops;\n \treturn 0;\n@@ -2557,7 +2602,7 @@ iavf_dev_init(struct rte_eth_dev *eth_dev)\n \n \t/* Start device watchdog */\n \tiavf_dev_watchdog_enable(adapter);\n-\n+\tadapter->closed = false;\n \n \treturn 0;\n \n@@ -2585,7 +2630,11 @@ iavf_dev_close(struct rte_eth_dev *dev)\n \tif (rte_eal_process_type() != RTE_PROC_PRIMARY)\n \t\treturn 0;\n \n+\tif (adapter->closed)\n+\t\treturn 0;\n+\n \tret = iavf_dev_stop(dev);\n+\tadapter->closed = true;\n \n \tiavf_flow_flush(dev, NULL);\n \tiavf_flow_uninit(adapter);\ndiff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c\nindex 16e8d021f9..a2dc669bfd 100644\n--- a/drivers/net/iavf/iavf_rxtx.c\n+++ b/drivers/net/iavf/iavf_rxtx.c\n@@ -554,6 +554,9 @@ iavf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,\n \n \tPMD_INIT_FUNC_TRACE();\n \n+\tif (ad->closed)\n+\t\treturn -EIO;\n+\n \toffloads = rx_conf->offloads | dev->data->dev_conf.rxmode.offloads;\n \n \tif (nb_desc % IAVF_ALIGN_RING_DESC != 0 ||\n@@ -715,6 +718,9 @@ iavf_dev_tx_queue_setup(struct rte_eth_dev *dev,\n \n \tPMD_INIT_FUNC_TRACE();\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \toffloads = tx_conf->offloads | dev->data->dev_conf.txmode.offloads;\n \n \tif (nb_desc % IAVF_ALIGN_RING_DESC != 0 ||\n@@ -2739,6 +2745,10 @@ iavf_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts,\n \tstruct iavf_tx_queue *txq = tx_queue;\n \tstruct rte_eth_dev *dev = &rte_eth_devices[txq->port_id];\n \tstruct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);\n+\tstruct iavf_adapter *adapter = IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);\n+\n+\tif (adapter->closed)\n+\t\treturn 0;\n \n \tfor (i = 0; i < nb_pkts; i++) {\n \t\tm = tx_pkts[i];\ndiff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c\nindex 169e1f2012..1bd3559ec2 100644\n--- a/drivers/net/iavf/iavf_vchnl.c\n+++ b/drivers/net/iavf/iavf_vchnl.c\n@@ -265,6 +265,11 @@ iavf_handle_pf_event_msg(struct rte_eth_dev *dev, uint8_t *msg,\n \tstruct virtchnl_pf_event *pf_msg =\n \t\t\t(struct virtchnl_pf_event *)msg;\n \n+\tif (adapter->closed) {\n+\t\tPMD_DRV_LOG(DEBUG, \"Port closed\");\n+\t\treturn;\n+\t}\n+\n \tif (msglen < sizeof(struct virtchnl_pf_event)) {\n \t\tPMD_DRV_LOG(DEBUG, \"Error event\");\n \t\treturn;\n@@ -777,6 +782,9 @@ iavf_switch_queue(struct iavf_adapter *adapter, uint16_t qid,\n \tstruct iavf_cmd_info args;\n \tint err;\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tmemset(&queue_select, 0, sizeof(queue_select));\n \tqueue_select.vsi_id = vf->vsi_res->vsi_id;\n \tif (rx)\n@@ -1241,6 +1249,9 @@ iavf_query_stats(struct iavf_adapter *adapter,\n \tstruct iavf_cmd_info args;\n \tint err;\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tmemset(&q_stats, 0, sizeof(q_stats));\n \tq_stats.vsi_id = vf->vsi_res->vsi_id;\n \targs.ops = VIRTCHNL_OP_GET_STATS;\n@@ -1269,6 +1280,9 @@ iavf_config_promisc(struct iavf_adapter *adapter,\n \tstruct iavf_cmd_info args;\n \tint err;\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tpromisc.flags = 0;\n \tpromisc.vsi_id = vf->vsi_res->vsi_id;\n \n@@ -1312,6 +1326,9 @@ iavf_add_del_eth_addr(struct iavf_adapter *adapter, struct rte_ether_addr *addr,\n \tstruct iavf_cmd_info args;\n \tint err;\n \n+\tif (adapter->closed)\n+\t\treturn -EIO;\n+\n \tlist = (struct virtchnl_ether_addr_list *)cmd_buffer;\n \tlist->vsi_id = vf->vsi_res->vsi_id;\n \tlist->num_elements = 1;\n",
    "prefixes": [
        "v2"
    ]
}