get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 64251,
    "url": "https://patches.dpdk.org/api/patches/64251/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20200107003735.96055-4-ajit.khaparde@broadcom.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20200107003735.96055-4-ajit.khaparde@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200107003735.96055-4-ajit.khaparde@broadcom.com",
    "date": "2020-01-07T00:37:31",
    "name": "[v3,3/7] net/bnxt: fix flow flush to sync with flow destroy",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "8ceab22995e5751f2fab03d61e16d889098a3ece",
    "submitter": {
        "id": 501,
        "url": "https://patches.dpdk.org/api/people/501/?format=api",
        "name": "Ajit Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "delegate": {
        "id": 1766,
        "url": "https://patches.dpdk.org/api/users/1766/?format=api",
        "username": "ajitkhaparde",
        "first_name": "Ajit",
        "last_name": "Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20200107003735.96055-4-ajit.khaparde@broadcom.com/mbox/",
    "series": [
        {
            "id": 7997,
            "url": "https://patches.dpdk.org/api/series/7997/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=7997",
            "date": "2020-01-07T00:37:28",
            "name": "bnxt patchset",
            "version": 3,
            "mbox": "https://patches.dpdk.org/series/7997/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/64251/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/64251/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 F37DFA04F6;\n\tTue,  7 Jan 2020 01:38:01 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id D97AE1D71F;\n\tTue,  7 Jan 2020 01:37:46 +0100 (CET)",
            "from rnd-relay.smtp.broadcom.com (rnd-relay.smtp.broadcom.com\n [192.19.229.170]) by dpdk.org (Postfix) with ESMTP id 9D29B1D70E;\n Tue,  7 Jan 2020 01:37:41 +0100 (CET)",
            "from mail-irv-17.broadcom.com (mail-irv-17.lvn.broadcom.net\n [10.75.242.48])\n by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id 7B61730C2CF;\n Mon,  6 Jan 2020 16:31:49 -0800 (PST)",
            "from C02VPB22HTD6.wifi.broadcom.net (c02vpb22htd6.wifi.broadcom.net\n [10.69.74.102])\n by mail-irv-17.broadcom.com (Postfix) with ESMTP id 89B5114008F;\n Mon,  6 Jan 2020 16:37:38 -0800 (PST)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com 7B61730C2CF",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com;\n s=dkimrelay; t=1578357109;\n bh=K0m/+68+9pq0KujqN6new/VRvpLClaXvIFOYiPvOhrM=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=X9IW5coYzZ0/h85RaqlvKrL/NaQsvvwA2oAZO9qCWVmY0MZF5tgbGLL4gQweQCDnT\n j3EWI8RW1KYzzNLMW89UscDQncYbEUgfdwFnFzqLDb03aL5KqMoEAaFbf6EpT+saoQ\n dXyrLi9CZ71y2CO2MBM3nHOjGPMR7ZNUZKBLZTZQ=",
        "From": "Ajit Khaparde <ajit.khaparde@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "ferruh.yigit@intel.com, Somnath Kotur <somnath.kotur@broadcom.com>,\n stable@dpdk.org,\n Santoshkumar Karanappa Rastapur <santosh.rastapur@broadcom.com>",
        "Date": "Mon,  6 Jan 2020 16:37:31 -0800",
        "Message-Id": "<20200107003735.96055-4-ajit.khaparde@broadcom.com>",
        "X-Mailer": "git-send-email 2.21.0 (Apple Git-122.2)",
        "In-Reply-To": "<20200107003735.96055-1-ajit.khaparde@broadcom.com>",
        "References": "<20191221022937.54397-1-ajit.khaparde@broadcom.com>\n <20200107003735.96055-1-ajit.khaparde@broadcom.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v3 3/7] net/bnxt: fix flow flush to sync with\n\tflow destroy",
        "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: Somnath Kotur <somnath.kotur@broadcom.com>\n\nSync flow flush routine with flow destroy so that the operations\nperformed per flow during a flush are the same as that are done for an\nindividual flow destroy by having a common function to call for both.\nOne of the things that was missed in the flow flush routine was the\ndeletion of the L2 filter that would have been created as part of an\nn-tuple filter.\nAlso, decrement the l2_ref_cnt for a filter in the case of a filter\nupdate as it would've bumped up previously in validate_and_parse_flow()\n\nFixes: 89278c59d97c58 (\"net/bnxt: fix flow flush handling\")\nCc: stable@dpdk.org\n\nSigned-off-by: Somnath Kotur <somnath.kotur@broadcom.com>\nReviewed-by: Santoshkumar Karanappa Rastapur <santosh.rastapur@broadcom.com>\n---\n drivers/net/bnxt/bnxt_flow.c | 132 ++++++++++++-----------------------\n 1 file changed, 46 insertions(+), 86 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c\nindex 7bd6811f1..7343b7e7b 100644\n--- a/drivers/net/bnxt/bnxt_flow.c\n+++ b/drivers/net/bnxt/bnxt_flow.c\n@@ -1536,10 +1536,13 @@ bnxt_update_filter(struct bnxt *bp, struct bnxt_filter_info *old_filter,\n \t * filter which points to the new destination queue and so we clear\n \t * the previous L2 filter. For ntuple filters, we are going to reuse\n \t * the old L2 filter and create new NTUPLE filter with this new\n-\t * destination queue subsequently during bnxt_flow_create.\n+\t * destination queue subsequently during bnxt_flow_create. So we\n+\t * decrement the ref cnt of the L2 filter that would've been bumped\n+\t * up previously in bnxt_validate_and_parse_flow as the old n-tuple\n+\t * filter that was referencing it will be deleted now.\n \t */\n+\tbnxt_hwrm_clear_l2_filter(bp, old_filter);\n \tif (new_filter->filter_type == HWRM_CFA_L2_FILTER) {\n-\t\tbnxt_hwrm_clear_l2_filter(bp, old_filter);\n \t\tbnxt_hwrm_set_l2_filter(bp, new_filter->dst_id, new_filter);\n \t} else {\n \t\tif (new_filter->filter_type == HWRM_CFA_EM_FILTER)\n@@ -1816,46 +1819,24 @@ static int bnxt_handle_tunnel_redirect_destroy(struct bnxt *bp,\n }\n \n static int\n-bnxt_flow_destroy(struct rte_eth_dev *dev,\n-\t\t  struct rte_flow *flow,\n-\t\t  struct rte_flow_error *error)\n+_bnxt_flow_destroy(struct bnxt *bp,\n+\t\t   struct rte_flow *flow,\n+\t\t    struct rte_flow_error *error)\n {\n-\tstruct bnxt *bp = dev->data->dev_private;\n \tstruct bnxt_filter_info *filter;\n \tstruct bnxt_vnic_info *vnic;\n \tint ret = 0;\n \n-\tbnxt_acquire_flow_lock(bp);\n-\tif (!flow) {\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n-\t\t\t\t   \"Invalid flow: failed to destroy flow.\");\n-\t\tbnxt_release_flow_lock(bp);\n-\t\treturn -EINVAL;\n-\t}\n-\n \tfilter = flow->filter;\n \tvnic = flow->vnic;\n \n-\tif (!filter) {\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n-\t\t\t\t   \"Invalid flow: failed to destroy flow.\");\n-\t\tbnxt_release_flow_lock(bp);\n-\t\treturn -EINVAL;\n-\t}\n-\n \tif (filter->filter_type == HWRM_CFA_TUNNEL_REDIRECT_FILTER &&\n \t    filter->enables == filter->tunnel_type) {\n-\t\tret = bnxt_handle_tunnel_redirect_destroy(bp,\n-\t\t\t\t\t\t\t  filter,\n-\t\t\t\t\t\t\t  error);\n-\t\tif (!ret) {\n+\t\tret = bnxt_handle_tunnel_redirect_destroy(bp, filter, error);\n+\t\tif (!ret)\n \t\t\tgoto done;\n-\t\t} else {\n-\t\t\tbnxt_release_flow_lock(bp);\n+\t\telse\n \t\t\treturn ret;\n-\t\t}\n \t}\n \n \tret = bnxt_match_filter(bp, filter);\n@@ -1902,7 +1883,36 @@ bnxt_flow_destroy(struct rte_eth_dev *dev,\n \t\t\t\t   \"Failed to destroy flow.\");\n \t}\n \n+\treturn ret;\n+}\n+\n+static int\n+bnxt_flow_destroy(struct rte_eth_dev *dev,\n+\t\t  struct rte_flow *flow,\n+\t\t  struct rte_flow_error *error)\n+{\n+\tstruct bnxt *bp = dev->data->dev_private;\n+\tint ret = 0;\n+\n+\tbnxt_acquire_flow_lock(bp);\n+\tif (!flow) {\n+\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n+\t\t\t\t   \"Invalid flow: failed to destroy flow.\");\n+\t\tbnxt_release_flow_lock(bp);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (!flow->filter) {\n+\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n+\t\t\t\t   \"Invalid flow: failed to destroy flow.\");\n+\t\tbnxt_release_flow_lock(bp);\n+\t\treturn -EINVAL;\n+\t}\n+\tret = _bnxt_flow_destroy(bp, flow, error);\n \tbnxt_release_flow_lock(bp);\n+\n \treturn ret;\n }\n \n@@ -1910,7 +1920,6 @@ static int\n bnxt_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error)\n {\n \tstruct bnxt *bp = dev->data->dev_private;\n-\tstruct bnxt_filter_info *filter = NULL;\n \tstruct bnxt_vnic_info *vnic;\n \tstruct rte_flow *flow;\n \tunsigned int i;\n@@ -1924,66 +1933,17 @@ bnxt_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error)\n \n \t\twhile (!STAILQ_EMPTY(&vnic->flow_list)) {\n \t\t\tflow = STAILQ_FIRST(&vnic->flow_list);\n-\t\t\tfilter = flow->filter;\n-\n-\t\t\tif (filter->filter_type ==\n-\t\t\t    HWRM_CFA_TUNNEL_REDIRECT_FILTER &&\n-\t\t\t    filter->enables == filter->tunnel_type) {\n-\t\t\t\tret =\n-\t\t\t\tbnxt_handle_tunnel_redirect_destroy(bp,\n-\t\t\t\t\t\t\t\t    filter,\n-\t\t\t\t\t\t\t\t    error);\n-\t\t\t\tif (!ret) {\n-\t\t\t\t\tgoto done;\n-\t\t\t\t} else {\n-\t\t\t\t\tbnxt_release_flow_lock(bp);\n-\t\t\t\t\treturn ret;\n-\t\t\t\t}\n-\t\t\t}\n-\n-\t\t\tif (filter->filter_type == HWRM_CFA_EM_FILTER)\n-\t\t\t\tret = bnxt_hwrm_clear_em_filter(bp, filter);\n-\t\t\tif (filter->filter_type == HWRM_CFA_NTUPLE_FILTER)\n-\t\t\t\tret = bnxt_hwrm_clear_ntuple_filter(bp, filter);\n-\t\t\telse if (i)\n-\t\t\t\tret = bnxt_hwrm_clear_l2_filter(bp, filter);\n-\n-\t\t\tif (ret) {\n-\t\t\t\trte_flow_error_set\n-\t\t\t\t\t(error,\n-\t\t\t\t\t -ret,\n-\t\t\t\t\t RTE_FLOW_ERROR_TYPE_HANDLE,\n-\t\t\t\t\t NULL,\n-\t\t\t\t\t \"Failed to flush flow in HW.\");\n-\t\t\t\tbnxt_release_flow_lock(bp);\n-\t\t\t\treturn -rte_errno;\n-\t\t\t}\n-done:\n-\t\t\tSTAILQ_REMOVE(&vnic->flow_list, flow,\n-\t\t\t\t      rte_flow, next);\n-\n-\t\t\tSTAILQ_REMOVE(&vnic->filter,\n-\t\t\t\t      filter,\n-\t\t\t\t      bnxt_filter_info,\n-\t\t\t\t      next);\n-\t\t\tbnxt_free_filter(bp, filter);\n \n-\t\t\trte_free(flow);\n+\t\t\tif (!flow->filter)\n+\t\t\t\tcontinue;\n \n-\t\t\t/* If this was the last flow associated with this vnic,\n-\t\t\t * switch the queue back to RSS pool.\n-\t\t\t */\n-\t\t\tif (STAILQ_EMPTY(&vnic->flow_list)) {\n-\t\t\t\trte_free(vnic->fw_grp_ids);\n-\t\t\t\tif (vnic->rx_queue_cnt > 1)\n-\t\t\t\t\tbnxt_hwrm_vnic_ctx_free(bp, vnic);\n-\t\t\t\tbnxt_hwrm_vnic_free(bp, vnic);\n-\t\t\t\tvnic->rx_queue_cnt = 0;\n-\t\t\t}\n+\t\t\tret = _bnxt_flow_destroy(bp, flow, error);\n+\t\t\tif (ret)\n+\t\t\t\tbreak;\n \t\t}\n \t}\n-\n \tbnxt_release_flow_lock(bp);\n+\n \treturn ret;\n }\n \n",
    "prefixes": [
        "v3",
        "3/7"
    ]
}