get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 77272,
    "url": "http://patches.dpdk.org/api/patches/77272/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200911015603.88359-11-ajit.khaparde@broadcom.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": "<20200911015603.88359-11-ajit.khaparde@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200911015603.88359-11-ajit.khaparde@broadcom.com",
    "date": "2020-09-11T01:55:48",
    "name": "[10/25] net/bnxt: vfr port clean up during port stop",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "8b76ff6892562af5484dd0f26d7005adcfcc3848",
    "submitter": {
        "id": 501,
        "url": "http://patches.dpdk.org/api/people/501/?format=api",
        "name": "Ajit Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "delegate": {
        "id": 1766,
        "url": "http://patches.dpdk.org/api/users/1766/?format=api",
        "username": "ajitkhaparde",
        "first_name": "Ajit",
        "last_name": "Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200911015603.88359-11-ajit.khaparde@broadcom.com/mbox/",
    "series": [
        {
            "id": 12116,
            "url": "http://patches.dpdk.org/api/series/12116/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=12116",
            "date": "2020-09-11T01:55:38",
            "name": "patchset for bnxt",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/12116/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/77272/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/77272/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 4F92FA04B5;\n\tFri, 11 Sep 2020 03:58:11 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 453DC1C13B;\n\tFri, 11 Sep 2020 03:56:56 +0200 (CEST)",
            "from mail-pj1-f98.google.com (mail-pj1-f98.google.com\n [209.85.216.98]) by dpdk.org (Postfix) with ESMTP id 15F3B1C13B\n for <dev@dpdk.org>; Fri, 11 Sep 2020 03:56:55 +0200 (CEST)",
            "by mail-pj1-f98.google.com with SMTP id mm21so937212pjb.4\n for <dev@dpdk.org>; Thu, 10 Sep 2020 18:56:55 -0700 (PDT)",
            "from localhost.localdomain ([192.19.223.252])\n by smtp-relay.gmail.com with ESMTPS id cl6sm80986pjb.15.2020.09.10.18.56.51\n (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);\n Thu, 10 Sep 2020 18:56:54 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com;\n s=google;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=G005tTvawCEfzEhkqcq+WBPU3/Lnn+p/S4nkWXadFTE=;\n b=WHwqphWDRqc/wB6UgJ4cv8PP8CBsqVR/9WwS9tJTW6WLAqy3tXOTub6+velp3bYnYn\n ZfkWObdFlunkvQZ9borN+n6JLmWiYdY8na9RMBLAF3QzfFdYb6eRY7Cmp/Cn+l/EdaZ4\n 0OxvwKFyP7k/YTzmMJdl9X6NyaL6o+niFBYnQ=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version:content-transfer-encoding;\n bh=G005tTvawCEfzEhkqcq+WBPU3/Lnn+p/S4nkWXadFTE=;\n b=Adl6KYUqH7mUYKLyui8cgSFZ4/X4jB98vkAqcK7AADYMY2tzjngy4X8pmbNqW65EHU\n LaKYsGWBZv53PMH+Rp1iD1+3+FuURnezmYUz8Ss3iKSxVS81cjmQT10D+W3Ir/CrPc60\n nYLrfy0z6bWDUAtS6IveQVc3LLwUmgDmsSxXd+2J1RvezGO0KAo6B70+5c3yTemyKqf/\n robTIpXMOCZ/gVj1QEizAYiLwAF7jfsvPZEtqVw3FTUnZL/En0EHxdK6Vrp2dSG6HAXL\n K7ui3eNMN0zkYK51LeKVGEC+aL8hNP45ccAo5iXBQg7a/V/dCBnEXAvUDqY/vQORBLqO\n h7ew==",
        "X-Gm-Message-State": "AOAM530sl2kYHsjoz+zk4cROvNgXzrabHq8opXlJAEebZyzaTmCI6q+X\n NVOqxbxxexy37Tq1yzGzZBdChwsC76BFCvduI8MOZPwxCE4wNX5xrxwk9QGr2UDBtT+1u2eNiKH\n Duzki9cp0Sx7+giieGNhISSK/YtLupLjk67caDcyqO640lMUdkllsKqiB6bGz0paeTmEzmDjEuh\n hZ9g==",
        "X-Google-Smtp-Source": "\n ABdhPJzExXP9ocm8RmpBXGMMAG5VDUUIftIsSAW8MeBEmOVtOSiatyD5vWFOxX9LC/VU9OLLyJ2abgwP/YFP",
        "X-Received": "by 2002:a17:90a:ea08:: with SMTP id w8mr46556pjy.41.1599789414157;\n Thu, 10 Sep 2020 18:56:54 -0700 (PDT)",
        "X-Relaying-Domain": "broadcom.com",
        "From": "Ajit Khaparde <ajit.khaparde@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "Kishore Padmanabha <kishore.padmanabha@broadcom.com>,\n Mike Baucom <michael.baucom@broadcom.com>,\n Shahaji Bhosle <sbhosle@broadcom.com>",
        "Date": "Thu, 10 Sep 2020 18:55:48 -0700",
        "Message-Id": "<20200911015603.88359-11-ajit.khaparde@broadcom.com>",
        "X-Mailer": "git-send-email 2.21.1 (Apple Git-122.3)",
        "In-Reply-To": "<20200911015603.88359-1-ajit.khaparde@broadcom.com>",
        "References": "<20200911015603.88359-1-ajit.khaparde@broadcom.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH 10/25] net/bnxt: vfr port clean up during port\n\tstop",
        "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: Kishore Padmanabha <kishore.padmanabha@broadcom.com>\n\nWhen parent VF or PF ports are cleaned up, the child VF representor\nports also need to be cleaned up. If not cleaned up, then deleting\nthe parent VF shall result in not cleaning up the hardware rules and\nupdating the firmware of vfr removal. The issue can occur even when\nOVS is exited without deleting vfr ports.\n\nSigned-off-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>\nReviewed-by: Mike Baucom <michael.baucom@broadcom.com>\nReviewed-by: Shahaji Bhosle <sbhosle@broadcom.com>\n---\n drivers/net/bnxt/bnxt_ethdev.c     | 20 ++++++++++++++--\n drivers/net/bnxt/bnxt_reps.c       | 38 ++++++++++++++++++++++++++----\n drivers/net/bnxt/bnxt_reps.h       |  1 +\n drivers/net/bnxt/tf_ulp/bnxt_ulp.c |  4 ++--\n 4 files changed, 55 insertions(+), 8 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex bc9aeba08..ea81ff149 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -1307,6 +1307,9 @@ static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev)\n \t/* disable uio/vfio intr/eventfd mapping */\n \trte_intr_disable(intr_handle);\n \n+\t/* Stop the child representors for this device */\n+\tbnxt_vf_rep_stop_all(bp);\n+\n \t/* delete the bnxt ULP port details */\n \tbnxt_ulp_port_deinit(bp);\n \n@@ -3709,8 +3712,13 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev,\n \t\tstruct bnxt_vf_representor *vfr = dev->data->dev_private;\n \t\tbp = vfr->parent_dev->data->dev_private;\n \t\t/* parent is deleted while children are still valid */\n-\t\tif (!bp)\n+\t\tif (!bp) {\n+\t\t\tPMD_DRV_LOG(DEBUG, \"BNXT Port:%d VFR Error %d:%d\\n\",\n+\t\t\t\t    dev->data->port_id,\n+\t\t\t\t    filter_type,\n+\t\t\t\t    filter_op);\n \t\t\treturn -EIO;\n+\t\t}\n \t}\n \n \tret = is_bnxt_in_error(bp);\n@@ -5912,8 +5920,12 @@ static int bnxt_pci_remove_dev_with_reps(struct rte_eth_dev *eth_dev)\n \t\tvf_rep_eth_dev = bp->rep_info[i].vfr_eth_dev;\n \t\tif (!vf_rep_eth_dev)\n \t\t\tcontinue;\n+\t\tPMD_DRV_LOG(DEBUG, \"BNXT Port:%d VFR pci remove\\n\",\n+\t\t\t    vf_rep_eth_dev->data->port_id);\n \t\trte_eth_dev_destroy(vf_rep_eth_dev, bnxt_vf_representor_uninit);\n \t}\n+\tPMD_DRV_LOG(DEBUG, \"BNXT Port:%d pci remove\\n\",\n+\t\t    eth_dev->data->port_id);\n \tret = rte_eth_dev_destroy(eth_dev, bnxt_dev_uninit);\n \n \treturn ret;\n@@ -6040,6 +6052,8 @@ static int bnxt_rep_port_probe(struct rte_pci_device *pci_dev,\n \t\t\t\tret = -ENODEV;\n \t\t\t\treturn ret;\n \t\t\t}\n+\t\t\tPMD_DRV_LOG(DEBUG, \"BNXT Port:%d VFR pci probe\\n\",\n+\t\t\t\t    backing_eth_dev->data->port_id);\n \t\t\tbacking_bp->rep_info[representor.vf_id].vfr_eth_dev =\n \t\t\t\tvf_rep_eth_dev;\n \t\t\tbacking_bp->num_reps++;\n@@ -6088,7 +6102,8 @@ static int bnxt_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,\n \n \t\tbacking_eth_dev = rte_eth_dev_allocated(pci_dev->device.name);\n \t}\n-\n+\tPMD_DRV_LOG(DEBUG, \"BNXT Port:%d pci probe\\n\",\n+\t\t    backing_eth_dev->data->port_id);\n \t/* probe representor ports now */\n \tret = bnxt_rep_port_probe(pci_dev, eth_da, backing_eth_dev);\n \n@@ -6107,6 +6122,7 @@ static int bnxt_pci_remove(struct rte_pci_device *pci_dev)\n \t\t\t   * +ve value will at least help in proper cleanup\n \t\t\t   */\n \n+\tPMD_DRV_LOG(DEBUG, \"BNXT Port:%d pci remove\\n\", eth_dev->data->port_id);\n \tif (rte_eal_process_type() == RTE_PROC_PRIMARY) {\n \t\tif (eth_dev->data->dev_flags & RTE_ETH_DEV_REPRESENTOR)\n \t\t\treturn rte_eth_dev_destroy(eth_dev,\ndiff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c\nindex 3101512c3..9f535c0ce 100644\n--- a/drivers/net/bnxt/bnxt_reps.c\n+++ b/drivers/net/bnxt/bnxt_reps.c\n@@ -167,6 +167,7 @@ int bnxt_vf_representor_init(struct rte_eth_dev *eth_dev, void *params)\n \tstruct rte_eth_link *link;\n \tstruct bnxt *parent_bp;\n \n+\tPMD_DRV_LOG(DEBUG, \"BNXT Port:%d VFR init\\n\", eth_dev->data->port_id);\n \tvf_rep_bp->vf_id = rep_params->vf_id;\n \tvf_rep_bp->switch_domain_id = rep_params->switch_domain_id;\n \tvf_rep_bp->parent_dev = rep_params->parent_dev;\n@@ -217,15 +218,18 @@ int bnxt_vf_representor_uninit(struct rte_eth_dev *eth_dev)\n \tstruct bnxt *parent_bp;\n \tstruct bnxt_vf_representor *rep =\n \t\t(struct bnxt_vf_representor *)eth_dev->data->dev_private;\n-\n \tuint16_t vf_id;\n \n+\tPMD_DRV_LOG(DEBUG, \"BNXT Port:%d VFR uninit\\n\", eth_dev->data->port_id);\n \teth_dev->data->mac_addrs = NULL;\n \teth_dev->dev_ops = NULL;\n \n \tparent_bp = rep->parent_dev->data->dev_private;\n-\tif (!parent_bp)\n+\tif (!parent_bp) {\n+\t\tPMD_DRV_LOG(DEBUG, \"BNXT Port:%d already freed\\n\",\n+\t\t\t    eth_dev->data->port_id);\n \t\treturn 0;\n+\t}\n \n \tparent_bp->num_reps--;\n \tvf_id = rep->vf_id;\n@@ -297,7 +301,8 @@ static int bnxt_tf_vfr_alloc(struct rte_eth_dev *vfr_ethdev)\n \t\t\t    vfr->vf_id, rc);\n \t\t(void)bnxt_ulp_delete_vfr_default_rules(vfr);\n \t}\n-\n+\tBNXT_TF_DBG(DEBUG, \"BNXT Port:%d VFR created and initialized\\n\",\n+\t\t    vfr->dpdk_port_id);\n \treturn rc;\n }\n \n@@ -362,6 +367,7 @@ int bnxt_vf_rep_dev_start_op(struct rte_eth_dev *eth_dev)\n \tparent_bp = rep_bp->parent_dev->data->dev_private;\n \trep_info = &parent_bp->rep_info[rep_bp->vf_id];\n \n+\tBNXT_TF_DBG(DEBUG, \"BNXT Port:%d VFR start\\n\", eth_dev->data->port_id);\n \tpthread_mutex_lock(&rep_info->vfr_start_lock);\n \tif (!rep_info->conduit_valid) {\n \t\trc = bnxt_get_dflt_vnic_svif(parent_bp, rep_bp);\n@@ -387,6 +393,7 @@ int bnxt_vf_rep_dev_start_op(struct rte_eth_dev *eth_dev)\n \n static int bnxt_tf_vfr_free(struct bnxt_vf_representor *vfr)\n {\n+\tBNXT_TF_DBG(DEBUG, \"BNXT Port:%d VFR ulp free\\n\", vfr->dpdk_port_id);\n \treturn bnxt_ulp_delete_vfr_default_rules(vfr);\n }\n \n@@ -402,8 +409,11 @@ static int bnxt_vfr_free(struct bnxt_vf_representor *vfr)\n \t}\n \n \tparent_bp = vfr->parent_dev->data->dev_private;\n-\tif (!parent_bp)\n+\tif (!parent_bp) {\n+\t\tPMD_DRV_LOG(DEBUG, \"BNXT Port:%d VFR already freed\\n\",\n+\t\t\t    vfr->dpdk_port_id);\n \t\treturn 0;\n+\t}\n \n \t/* Check if representor has been already freed in FW */\n \tif (!vfr->vfr_tx_cfa_action)\n@@ -433,6 +443,8 @@ void bnxt_vf_rep_dev_stop_op(struct rte_eth_dev *eth_dev)\n \teth_dev->rx_pkt_burst = &bnxt_dummy_recv_pkts;\n \teth_dev->tx_pkt_burst = &bnxt_dummy_xmit_pkts;\n \n+\tBNXT_TF_DBG(DEBUG, \"BNXT Port:%d VFR stop\\n\", eth_dev->data->port_id);\n+\n \tbnxt_vfr_free(vfr_bp);\n \n \tif (eth_dev->data->dev_started)\n@@ -443,6 +455,7 @@ void bnxt_vf_rep_dev_stop_op(struct rte_eth_dev *eth_dev)\n \n void bnxt_vf_rep_dev_close_op(struct rte_eth_dev *eth_dev)\n {\n+\tBNXT_TF_DBG(DEBUG, \"BNXT Port:%d VFR close\\n\", eth_dev->data->port_id);\n \tbnxt_vf_representor_uninit(eth_dev);\n }\n \n@@ -722,3 +735,20 @@ int bnxt_vf_rep_stats_reset_op(struct rte_eth_dev *eth_dev)\n \t}\n \treturn 0;\n }\n+\n+void bnxt_vf_rep_stop_all(struct bnxt *bp)\n+{\n+\tuint16_t vf_id;\n+\tstruct rte_eth_dev *rep_eth_dev;\n+\n+\t/* No vfrep ports just exit */\n+\tif (!bp->rep_info)\n+\t\treturn;\n+\n+\tfor (vf_id = 0; vf_id < BNXT_MAX_VF_REPS; vf_id++) {\n+\t\trep_eth_dev = bp->rep_info[vf_id].vfr_eth_dev;\n+\t\tif (!rep_eth_dev)\n+\t\t\tcontinue;\n+\t\tbnxt_vf_rep_dev_stop_op(rep_eth_dev);\n+\t}\n+}\ndiff --git a/drivers/net/bnxt/bnxt_reps.h b/drivers/net/bnxt/bnxt_reps.h\nindex 418b95afc..d877b0823 100644\n--- a/drivers/net/bnxt/bnxt_reps.h\n+++ b/drivers/net/bnxt/bnxt_reps.h\n@@ -42,4 +42,5 @@ void bnxt_vf_rep_dev_close_op(struct rte_eth_dev *eth_dev);\n int bnxt_vf_rep_stats_get_op(struct rte_eth_dev *eth_dev,\n \t\t\t     struct rte_eth_stats *stats);\n int bnxt_vf_rep_stats_reset_op(struct rte_eth_dev *eth_dev);\n+void bnxt_vf_rep_stop_all(struct bnxt *bp);\n #endif /* _BNXT_REPS_H_ */\ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\nindex 63d453ffb..272536473 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\n@@ -905,7 +905,7 @@ bnxt_ulp_port_init(struct bnxt *bp)\n \t}\n \t/* create the default rules */\n \tbnxt_ulp_create_df_rules(bp);\n-\tBNXT_TF_DBG(DEBUG, \"ULP Port:%d created and initialized\\n\",\n+\tBNXT_TF_DBG(DEBUG, \"BNXT Port:%d ULP port init\\n\",\n \t\t    bp->eth_dev->data->port_id);\n \treturn rc;\n \n@@ -940,7 +940,7 @@ bnxt_ulp_port_deinit(struct bnxt *bp)\n \t\treturn;\n \t}\n \n-\tBNXT_TF_DBG(DEBUG, \"ULP Port:%d destroyed\\n\",\n+\tBNXT_TF_DBG(DEBUG, \"BNXT Port:%d ULP port deinit\\n\",\n \t\t    bp->eth_dev->data->port_id);\n \n \t/* Get the session details  */\n",
    "prefixes": [
        "10/25"
    ]
}