Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/110298/?format=api
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" ] }{ "id": 110298, "url": "