get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 64255,
    "url": "http://patches.dpdk.org/api/patches/64255/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200107003735.96055-6-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": "<20200107003735.96055-6-ajit.khaparde@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200107003735.96055-6-ajit.khaparde@broadcom.com",
    "date": "2020-01-07T00:37:33",
    "name": "[v3,5/7] net/bnxt: fix to reuse an L2 filter",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "d10c49fd53d5842deccf3a686a94b188923c7420",
    "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/20200107003735.96055-6-ajit.khaparde@broadcom.com/mbox/",
    "series": [
        {
            "id": 7997,
            "url": "http://patches.dpdk.org/api/series/7997/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=7997",
            "date": "2020-01-07T00:37:28",
            "name": "bnxt patchset",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/7997/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/64255/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/64255/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 4036FA04F6;\n\tTue,  7 Jan 2020 01:38:37 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id C12CC1D716;\n\tTue,  7 Jan 2020 01:37:54 +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 9C9851D70E;\n Tue,  7 Jan 2020 01:37:42 +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 AC3EC30C2D2;\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 C3D7E140069;\n Mon,  6 Jan 2020 16:37:38 -0800 (PST)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com AC3EC30C2D2",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com;\n s=dkimrelay; t=1578357109;\n bh=s8erLrRIWa9H1szVDQMTATdyUg0WsNlFNt4NMN8Giwk=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=fDHKXqvDSMTTVw8UesHukWriWUOeXD2sc8/6MnRthbYbhC6k2tJhzpLLD4dB7ts7o\n Te5KQnzDYzkcYwVxoiitjvpDfvSrMTZfG2dzw5vCIlJZFdi9CDWjjvIefbYk8v08nH\n a0EzdS12/ZdU4ej02olzkom6nB0xzFMHTssxbno0=",
        "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",
        "Date": "Mon,  6 Jan 2020 16:37:33 -0800",
        "Message-Id": "<20200107003735.96055-6-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 5/7] net/bnxt: fix to reuse an L2 filter",
        "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\nThe software L2 filter was being released back to the free pool,\nthough it was created in HW and the filter corresponding to an actual\n'flow' would have reference to the HW L2 filter.\nBut if this 'flow were to be deleted, then this HW L2 filter also\nwould be gone.\nFix this by storing the L2 filter created originally either for an\nn-tuple flow or otherwise as part of the vnic's filter list.\nThis would require the filter_info struct to have a backptr to the\nvnic which it came from.\nNow that L2 filters can be re-used for an n-tuple filter(s), delete\nL2 filter as well so the reference count of an L2 filter (if reused)\ncan be decremented appropriately.\n\nFixes: 5c1171c97216 (\"net/bnxt: refactor filter/flow\")\nCc: stable@dpdk.org\n\nSigned-off-by: Somnath Kotur <somnath.kotur@broadcom.com>\nReviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>\n---\n drivers/net/bnxt/bnxt_filter.h |  4 ++++\n drivers/net/bnxt/bnxt_flow.c   | 20 +++++++++-----------\n drivers/net/bnxt/bnxt_hwrm.c   | 20 +++++++++++++++-----\n 3 files changed, 28 insertions(+), 16 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt_filter.h b/drivers/net/bnxt/bnxt_filter.h\nindex 9db3e7487..fc40f112b 100644\n--- a/drivers/net/bnxt/bnxt_filter.h\n+++ b/drivers/net/bnxt/bnxt_filter.h\n@@ -77,6 +77,10 @@ struct bnxt_filter_info {\n \tuint16_t                ip_addr_type;\n \tuint16_t                ethertype;\n \tuint32_t\t\tpriority;\n+\t/* Backptr to vnic. As of now, used only by an L2 filter\n+\t * to remember which vnic it was created on\n+\t */\n+\tstruct\t\t\tbnxt_vnic_info *vnic;\n };\n \n struct bnxt_filter_info *bnxt_alloc_filter(struct bnxt *bp);\ndiff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c\nindex 855994a6b..2bd492ea3 100644\n--- a/drivers/net/bnxt/bnxt_flow.c\n+++ b/drivers/net/bnxt/bnxt_flow.c\n@@ -746,10 +746,9 @@ bnxt_find_matching_l2_filter(struct bnxt *bp, struct bnxt_filter_info *nf)\n {\n \tstruct bnxt_filter_info *mf, *f0;\n \tstruct bnxt_vnic_info *vnic0;\n-\tstruct rte_flow *flow;\n \tint i;\n \n-\tvnic0 = &bp->vnic_info[0];\n+\tvnic0 = BNXT_GET_DEFAULT_VNIC(bp);\n \tf0 = STAILQ_FIRST(&vnic0->filter);\n \n \t/* This flow has same DST MAC as the port/l2 filter. */\n@@ -762,8 +761,7 @@ bnxt_find_matching_l2_filter(struct bnxt *bp, struct bnxt_filter_info *nf)\n \t\tif (vnic->fw_vnic_id == INVALID_VNIC_ID)\n \t\t\tcontinue;\n \n-\t\tSTAILQ_FOREACH(flow, &vnic->flow_list, next) {\n-\t\t\tmf = flow->filter;\n+\t\tSTAILQ_FOREACH(mf, &vnic->filter, next) {\n \n \t\t\tif (mf->matching_l2_fltr_ptr)\n \t\t\t\tcontinue;\n@@ -798,6 +796,8 @@ bnxt_create_l2_filter(struct bnxt *bp, struct bnxt_filter_info *nf,\n \tif (filter1 == NULL)\n \t\treturn NULL;\n \n+\tmemcpy(filter1, nf, sizeof(*filter1));\n+\n \tfilter1->flags = HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_XDP_DISABLE;\n \tfilter1->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX;\n \tif (nf->valid_flags & BNXT_FLOW_L2_SRC_VALID_FLAG ||\n@@ -880,11 +880,14 @@ bnxt_get_l2_filter(struct bnxt *bp, struct bnxt_filter_info *nf,\n \tl2_filter = bnxt_find_matching_l2_filter(bp, nf);\n \tif (l2_filter) {\n \t\tl2_filter->l2_ref_cnt++;\n-\t\tnf->matching_l2_fltr_ptr = l2_filter;\n \t} else {\n \t\tl2_filter = bnxt_create_l2_filter(bp, nf, vnic);\n-\t\tnf->matching_l2_fltr_ptr = NULL;\n+\t\tif (l2_filter) {\n+\t\t\tSTAILQ_INSERT_TAIL(&vnic->filter, l2_filter, next);\n+\t\t\tl2_filter->vnic = vnic;\n+\t\t}\n \t}\n+\tnf->matching_l2_fltr_ptr = l2_filter;\n \n \treturn l2_filter;\n }\n@@ -1429,11 +1432,6 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev,\n \t\tgoto ret;\n \t}\n \n-\tif (filter1 && !filter->matching_l2_fltr_ptr) {\n-\t\tbnxt_free_filter(bp, filter1);\n-\t\tfilter1->fw_l2_filter_id = -1;\n-\t}\n-\n done:\n \tact = bnxt_flow_non_void_action(++act);\n \tif (act->type != RTE_FLOW_ACTION_TYPE_END) {\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c\nindex bee4c154f..8178213e5 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.c\n+++ b/drivers/net/bnxt/bnxt_hwrm.c\n@@ -363,10 +363,11 @@ int bnxt_hwrm_cfa_vlan_antispoof_cfg(struct bnxt *bp, uint16_t fid,\n }\n \n int bnxt_hwrm_clear_l2_filter(struct bnxt *bp,\n-\t\t\t   struct bnxt_filter_info *filter)\n+\t\t\t     struct bnxt_filter_info *filter)\n {\n \tint rc = 0;\n \tstruct bnxt_filter_info *l2_filter = filter;\n+\tstruct bnxt_vnic_info *vnic = NULL;\n \tstruct hwrm_cfa_l2_filter_free_input req = {.req_type = 0 };\n \tstruct hwrm_cfa_l2_filter_free_output *resp = bp->hwrm_cmd_resp_addr;\n \n@@ -379,6 +380,9 @@ int bnxt_hwrm_clear_l2_filter(struct bnxt *bp,\n \tPMD_DRV_LOG(DEBUG, \"filter: %p l2_filter: %p ref_cnt: %d\\n\",\n \t\t    filter, l2_filter, l2_filter->l2_ref_cnt);\n \n+\tif (l2_filter->l2_ref_cnt == 0)\n+\t\treturn 0;\n+\n \tif (l2_filter->l2_ref_cnt > 0)\n \t\tl2_filter->l2_ref_cnt--;\n \n@@ -395,6 +399,14 @@ int bnxt_hwrm_clear_l2_filter(struct bnxt *bp,\n \tHWRM_UNLOCK();\n \n \tfilter->fw_l2_filter_id = UINT64_MAX;\n+\tif (l2_filter->l2_ref_cnt == 0) {\n+\t\tvnic = l2_filter->vnic;\n+\t\tif (vnic) {\n+\t\t\tSTAILQ_REMOVE(&vnic->filter, l2_filter,\n+\t\t\t\t      bnxt_filter_info, next);\n+\t\t\tbnxt_free_filter(bp, l2_filter);\n+\t\t}\n+\t}\n \n \treturn 0;\n }\n@@ -2483,8 +2495,7 @@ int bnxt_clear_hwrm_vnic_filters(struct bnxt *bp, struct bnxt_vnic_info *vnic)\n \t\t\trc = bnxt_hwrm_clear_em_filter(bp, filter);\n \t\telse if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER)\n \t\t\trc = bnxt_hwrm_clear_ntuple_filter(bp, filter);\n-\t\telse\n-\t\t\trc = bnxt_hwrm_clear_l2_filter(bp, filter);\n+\t\trc = bnxt_hwrm_clear_l2_filter(bp, filter);\n \t\tSTAILQ_REMOVE(&vnic->filter, filter, bnxt_filter_info, next);\n \t\tbnxt_free_filter(bp, filter);\n \t}\n@@ -2506,8 +2517,7 @@ bnxt_clear_hwrm_vnic_flows(struct bnxt *bp, struct bnxt_vnic_info *vnic)\n \t\t\trc = bnxt_hwrm_clear_em_filter(bp, filter);\n \t\telse if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER)\n \t\t\trc = bnxt_hwrm_clear_ntuple_filter(bp, filter);\n-\t\telse\n-\t\t\trc = bnxt_hwrm_clear_l2_filter(bp, filter);\n+\t\trc = bnxt_hwrm_clear_l2_filter(bp, filter);\n \n \t\tSTAILQ_REMOVE(&vnic->flow_list, flow, rte_flow, next);\n \t\trte_free(flow);\n",
    "prefixes": [
        "v3",
        "5/7"
    ]
}