get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 73097,
    "url": "https://patches.dpdk.org/api/patches/73097/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20200703210210.40568-51-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": "<20200703210210.40568-51-ajit.khaparde@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200703210210.40568-51-ajit.khaparde@broadcom.com",
    "date": "2020-07-03T21:02:09",
    "name": "[v5,50/51] net/bnxt: add support for count action in flow query",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "3cca66f6831cc58ba4f59d9e67c7dc660d3e33db",
    "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/20200703210210.40568-51-ajit.khaparde@broadcom.com/mbox/",
    "series": [
        {
            "id": 10785,
            "url": "https://patches.dpdk.org/api/series/10785/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=10785",
            "date": "2020-07-03T21:01:19",
            "name": "net/bnxt: add features for host-based flow management",
            "version": 5,
            "mbox": "https://patches.dpdk.org/series/10785/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/73097/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/73097/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 9E8F3A0524;\n\tFri,  3 Jul 2020 23:13:51 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id ACB5B1DDF1;\n\tFri,  3 Jul 2020 23:06:21 +0200 (CEST)",
            "from rnd-relay.smtp.broadcom.com (rnd-relay.smtp.broadcom.com\n [192.19.229.170]) by dpdk.org (Postfix) with ESMTP id B61941DCA4\n for <dev@dpdk.org>; Fri,  3 Jul 2020 23:05:14 +0200 (CEST)",
            "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 A6C8030C041;\n Fri,  3 Jul 2020 14:05:13 -0700 (PDT)",
            "from localhost.localdomain (unknown [10.230.185.215])\n by mail-irv-17.broadcom.com (Postfix) with ESMTP id 7D73A14008C;\n Fri,  3 Jul 2020 14:05:13 -0700 (PDT)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com A6C8030C041",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com;\n s=dkimrelay; t=1593810313;\n bh=mpKwMTRmV6W2pl73gLNxatbd9jSYBWbAwsXy/eUoQKU=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=gdbja91UzNmF2Er8YkRcEReqtFaiNGfWLu79NwXUQ0U+WniMtyIvmvNFWalVUkiN2\n MwDQcibZCaAY0BiWeQSFARIJm+j5Uiff+fQBT1fnErWYueFpxPmJAsrw7k+MFF/7c4\n tWBNy/kq43s0894tGW5ZvBkoVSS45F7aoWIRi91k=",
        "From": "Ajit Khaparde <ajit.khaparde@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "Somnath Kotur <somnath.kotur@broadcom.com>,\n Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>",
        "Date": "Fri,  3 Jul 2020 14:02:09 -0700",
        "Message-Id": "<20200703210210.40568-51-ajit.khaparde@broadcom.com>",
        "X-Mailer": "git-send-email 2.21.1 (Apple Git-122.3)",
        "In-Reply-To": "<20200703210210.40568-1-ajit.khaparde@broadcom.com>",
        "References": "<1f5421dc-0453-6dc8-09c2-ddfff6eb4888@intel.com>\n <20200703210210.40568-1-ajit.khaparde@broadcom.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v5 50/51] net/bnxt: add support for count action\n\tin flow query",
        "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\nUse the flow counter manager to fetch the accumulated stats for\na flow.\n\nSigned-off-by: Somnath Kotur <somnath.kotur@broadcom.com>\nSigned-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>\nReviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>\n---\n drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c |  45 +++++++-\n drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c    | 141 +++++++++++++++++++++++-\n drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h    |  17 ++-\n 3 files changed, 196 insertions(+), 7 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c\nindex 7ef306e58..36a014184 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c\n@@ -9,6 +9,7 @@\n #include \"ulp_matcher.h\"\n #include \"ulp_flow_db.h\"\n #include \"ulp_mapper.h\"\n+#include \"ulp_fc_mgr.h\"\n #include <rte_malloc.h>\n \n static int32_t\n@@ -289,11 +290,53 @@ bnxt_ulp_flow_flush(struct rte_eth_dev *eth_dev,\n \treturn ret;\n }\n \n+/* Function to query the rte flows. */\n+static int32_t\n+bnxt_ulp_flow_query(struct rte_eth_dev *eth_dev,\n+\t\t    struct rte_flow *flow,\n+\t\t    const struct rte_flow_action *action,\n+\t\t    void *data,\n+\t\t    struct rte_flow_error *error)\n+{\n+\tint rc = 0;\n+\tstruct bnxt_ulp_context *ulp_ctx;\n+\tstruct rte_flow_query_count *count;\n+\tuint32_t flow_id;\n+\n+\tulp_ctx = bnxt_ulp_eth_dev_ptr2_cntxt_get(eth_dev);\n+\tif (!ulp_ctx) {\n+\t\tBNXT_TF_DBG(ERR, \"ULP context is not initialized\\n\");\n+\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n+\t\t\t\t   \"Failed to query flow.\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tflow_id = (uint32_t)(uintptr_t)flow;\n+\n+\tswitch (action->type) {\n+\tcase RTE_FLOW_ACTION_TYPE_COUNT:\n+\t\tcount = data;\n+\t\trc = ulp_fc_mgr_query_count_get(ulp_ctx, flow_id, count);\n+\t\tif (rc) {\n+\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n+\t\t\t\t\t   \"Failed to query flow.\");\n+\t\t}\n+\t\tbreak;\n+\tdefault:\n+\t\trte_flow_error_set(error, -rc, RTE_FLOW_ERROR_TYPE_ACTION_NUM,\n+\t\t\t\t   NULL, \"Unsupported action item\");\n+\t}\n+\n+\treturn rc;\n+}\n+\n const struct rte_flow_ops bnxt_ulp_rte_flow_ops = {\n \t.validate = bnxt_ulp_flow_validate,\n \t.create = bnxt_ulp_flow_create,\n \t.destroy = bnxt_ulp_flow_destroy,\n \t.flush = bnxt_ulp_flow_flush,\n-\t.query = NULL,\n+\t.query = bnxt_ulp_flow_query,\n \t.isolate = NULL\n };\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c b/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c\nindex f70d4a295..9944e9e5c 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c\n@@ -11,6 +11,7 @@\n #include \"bnxt_ulp.h\"\n #include \"bnxt_tf_common.h\"\n #include \"ulp_fc_mgr.h\"\n+#include \"ulp_flow_db.h\"\n #include \"ulp_template_db_enum.h\"\n #include \"ulp_template_struct.h\"\n #include \"tf_tbl.h\"\n@@ -226,9 +227,10 @@ void ulp_fc_mgr_thread_cancel(struct bnxt_ulp_context *ctxt)\n  * num_counters [in] The number of counters\n  *\n  */\n-static int32_t ulp_bulk_get_flow_stats(struct tf *tfp,\n+__rte_unused static int32_t ulp_bulk_get_flow_stats(struct tf *tfp,\n \t\t\t\t       struct bnxt_ulp_fc_info *fc_info,\n \t\t\t\t       enum tf_dir dir, uint32_t num_counters)\n+/* MARK AS UNUSED FOR NOW TO AVOID COMPILATION ERRORS TILL API is RESOLVED */\n {\n \tint rc = 0;\n \tstruct tf_tbl_get_bulk_parms parms = { 0 };\n@@ -275,6 +277,45 @@ static int32_t ulp_bulk_get_flow_stats(struct tf *tfp,\n \n \treturn rc;\n }\n+\n+static int ulp_get_single_flow_stat(struct tf *tfp,\n+\t\t\t\t    struct bnxt_ulp_fc_info *fc_info,\n+\t\t\t\t    enum tf_dir dir,\n+\t\t\t\t    uint32_t hw_cntr_id)\n+{\n+\tint rc = 0;\n+\tstruct tf_get_tbl_entry_parms parms = { 0 };\n+\tenum tf_tbl_type stype = TF_TBL_TYPE_ACT_STATS_64;  /* TBD:Template? */\n+\tstruct sw_acc_counter *sw_acc_tbl_entry = NULL;\n+\tuint64_t stats = 0;\n+\tuint32_t sw_cntr_indx = 0;\n+\n+\tparms.dir = dir;\n+\tparms.type = stype;\n+\tparms.idx = hw_cntr_id;\n+\t/*\n+\t * TODO:\n+\t * Size of an entry needs to obtained from template\n+\t */\n+\tparms.data_sz_in_bytes = sizeof(uint64_t);\n+\tparms.data = (uint8_t *)&stats;\n+\trc = tf_get_tbl_entry(tfp, &parms);\n+\tif (rc) {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t    \"Get failed for id:0x%x rc:%d\\n\",\n+\t\t\t    parms.idx, rc);\n+\t\treturn rc;\n+\t}\n+\n+\t/* TBD - Get PKT/BYTE COUNT SHIFT/MASK from Template */\n+\tsw_cntr_indx = hw_cntr_id - fc_info->shadow_hw_tbl[dir].start_idx;\n+\tsw_acc_tbl_entry = &fc_info->sw_acc_tbl[dir][sw_cntr_indx];\n+\tsw_acc_tbl_entry->pkt_count += FLOW_CNTR_PKTS(stats);\n+\tsw_acc_tbl_entry->byte_count += FLOW_CNTR_BYTES(stats);\n+\n+\treturn rc;\n+}\n+\n /*\n  * Alarm handler that will issue the TF-Core API to fetch\n  * data from the chip's internal flow counters\n@@ -282,15 +323,18 @@ static int32_t ulp_bulk_get_flow_stats(struct tf *tfp,\n  * ctxt [in] The ulp context for the flow counter manager\n  *\n  */\n+\n void\n ulp_fc_mgr_alarm_cb(void *arg)\n {\n-\tint rc = 0, i;\n+\tint rc = 0;\n+\tunsigned int j;\n+\tenum tf_dir i;\n \tstruct bnxt_ulp_context *ctxt = arg;\n \tstruct bnxt_ulp_fc_info *ulp_fc_info;\n \tstruct bnxt_ulp_device_params *dparms;\n \tstruct tf *tfp;\n-\tuint32_t dev_id;\n+\tuint32_t dev_id, hw_cntr_id = 0;\n \n \tulp_fc_info = bnxt_ulp_cntxt_ptr2_fc_info_get(ctxt);\n \tif (!ulp_fc_info)\n@@ -325,13 +369,27 @@ ulp_fc_mgr_alarm_cb(void *arg)\n \t\tulp_fc_mgr_thread_cancel(ctxt);\n \t\treturn;\n \t}\n-\n-\tfor (i = 0; i < TF_DIR_MAX; i++) {\n+\t/*\n+\t * Commented for now till GET_BULK is resolved, just get the first flow\n+\t * stat for now\n+\t for (i = 0; i < TF_DIR_MAX; i++) {\n \t\trc = ulp_bulk_get_flow_stats(tfp, ulp_fc_info, i,\n \t\t\t\t\t     dparms->flow_count_db_entries);\n \t\tif (rc)\n \t\t\tbreak;\n \t}\n+\t*/\n+\tfor (i = 0; i < TF_DIR_MAX; i++) {\n+\t\tfor (j = 0; j < ulp_fc_info->num_entries; j++) {\n+\t\t\tif (!ulp_fc_info->sw_acc_tbl[i][j].valid)\n+\t\t\t\tcontinue;\n+\t\t\thw_cntr_id = ulp_fc_info->sw_acc_tbl[i][j].hw_cntr_id;\n+\t\t\trc = ulp_get_single_flow_stat(tfp, ulp_fc_info, i,\n+\t\t\t\t\t\t      hw_cntr_id);\n+\t\t\tif (rc)\n+\t\t\t\tbreak;\n+\t\t}\n+\t}\n \n \tpthread_mutex_unlock(&ulp_fc_info->fc_lock);\n \n@@ -425,6 +483,7 @@ int32_t ulp_fc_mgr_cntr_set(struct bnxt_ulp_context *ctxt, enum tf_dir dir,\n \tpthread_mutex_lock(&ulp_fc_info->fc_lock);\n \tsw_cntr_idx = hw_cntr_id - ulp_fc_info->shadow_hw_tbl[dir].start_idx;\n \tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].valid = true;\n+\tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].hw_cntr_id = hw_cntr_id;\n \tulp_fc_info->num_entries++;\n \tpthread_mutex_unlock(&ulp_fc_info->fc_lock);\n \n@@ -456,6 +515,7 @@ int32_t ulp_fc_mgr_cntr_reset(struct bnxt_ulp_context *ctxt, enum tf_dir dir,\n \tpthread_mutex_lock(&ulp_fc_info->fc_lock);\n \tsw_cntr_idx = hw_cntr_id - ulp_fc_info->shadow_hw_tbl[dir].start_idx;\n \tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].valid = false;\n+\tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].hw_cntr_id = 0;\n \tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].pkt_count = 0;\n \tulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx].byte_count = 0;\n \tulp_fc_info->num_entries--;\n@@ -463,3 +523,74 @@ int32_t ulp_fc_mgr_cntr_reset(struct bnxt_ulp_context *ctxt, enum tf_dir dir,\n \n \treturn 0;\n }\n+\n+/*\n+ * Fill the rte_flow_query_count 'data' argument passed\n+ * in the rte_flow_query() with the values obtained and\n+ * accumulated locally.\n+ *\n+ * ctxt [in] The ulp context for the flow counter manager\n+ *\n+ * flow_id [in] The HW flow ID\n+ *\n+ * count [out] The rte_flow_query_count 'data' that is set\n+ *\n+ */\n+int ulp_fc_mgr_query_count_get(struct bnxt_ulp_context *ctxt,\n+\t\t\t       uint32_t flow_id,\n+\t\t\t       struct rte_flow_query_count *count)\n+{\n+\tint rc = 0;\n+\tuint32_t nxt_resource_index = 0;\n+\tstruct bnxt_ulp_fc_info *ulp_fc_info;\n+\tstruct ulp_flow_db_res_params params;\n+\tenum tf_dir dir;\n+\tuint32_t hw_cntr_id = 0, sw_cntr_idx = 0;\n+\tstruct sw_acc_counter sw_acc_tbl_entry;\n+\tbool found_cntr_resource = false;\n+\n+\tulp_fc_info = bnxt_ulp_cntxt_ptr2_fc_info_get(ctxt);\n+\tif (!ulp_fc_info)\n+\t\treturn -ENODEV;\n+\n+\tdo {\n+\t\trc = ulp_flow_db_resource_get(ctxt,\n+\t\t\t\t\t      BNXT_ULP_REGULAR_FLOW_TABLE,\n+\t\t\t\t\t      flow_id,\n+\t\t\t\t\t      &nxt_resource_index,\n+\t\t\t\t\t      &params);\n+\t\tif (params.resource_func ==\n+\t\t     BNXT_ULP_RESOURCE_FUNC_INDEX_TABLE &&\n+\t\t     (params.resource_sub_type ==\n+\t\t      BNXT_ULP_RESOURCE_SUB_TYPE_INDEX_TYPE_INT_COUNT ||\n+\t\t      params.resource_sub_type ==\n+\t\t      BNXT_ULP_RESOURCE_SUB_TYPE_INDEX_TYPE_EXT_COUNT)) {\n+\t\t\tfound_cntr_resource = true;\n+\t\t\tbreak;\n+\t\t}\n+\n+\t} while (!rc);\n+\n+\tif (rc)\n+\t\treturn rc;\n+\n+\tif (found_cntr_resource) {\n+\t\tdir = params.direction;\n+\t\thw_cntr_id = params.resource_hndl;\n+\t\tsw_cntr_idx = hw_cntr_id -\n+\t\t\t\tulp_fc_info->shadow_hw_tbl[dir].start_idx;\n+\t\tsw_acc_tbl_entry = ulp_fc_info->sw_acc_tbl[dir][sw_cntr_idx];\n+\t\tif (params.resource_sub_type ==\n+\t\t\tBNXT_ULP_RESOURCE_SUB_TYPE_INDEX_TYPE_INT_COUNT) {\n+\t\t\tcount->hits_set = 1;\n+\t\t\tcount->bytes_set = 1;\n+\t\t\tcount->hits = sw_acc_tbl_entry.pkt_count;\n+\t\t\tcount->bytes = sw_acc_tbl_entry.byte_count;\n+\t\t} else {\n+\t\t\t/* TBD: Handle External counters */\n+\t\t\trc = -EINVAL;\n+\t\t}\n+\t}\n+\n+\treturn rc;\n+}\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h b/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h\nindex faa77dd75..207267049 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h\n+++ b/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h\n@@ -23,6 +23,7 @@ struct sw_acc_counter {\n \tuint64_t pkt_count;\n \tuint64_t byte_count;\n \tbool\tvalid;\n+\tuint32_t hw_cntr_id;\n };\n \n struct hw_fc_mem_info {\n@@ -142,7 +143,21 @@ bool ulp_fc_mgr_start_idx_isset(struct bnxt_ulp_context *ctxt, enum tf_dir dir);\n  * ctxt [in] The ulp context for the flow counter manager\n  *\n  */\n-\n bool ulp_fc_mgr_thread_isstarted(struct bnxt_ulp_context *ctxt);\n \n+/*\n+ * Fill the rte_flow_query_count 'data' argument passed\n+ * in the rte_flow_query() with the values obtained and\n+ * accumulated locally.\n+ *\n+ * ctxt [in] The ulp context for the flow counter manager\n+ *\n+ * flow_id [in] The HW flow ID\n+ *\n+ * count [out] The rte_flow_query_count 'data' that is set\n+ *\n+ */\n+int ulp_fc_mgr_query_count_get(struct bnxt_ulp_context *ulp_ctx,\n+\t\t\t       uint32_t flow_id,\n+\t\t\t       struct rte_flow_query_count *count);\n #endif /* _ULP_FC_MGR_H_ */\n",
    "prefixes": [
        "v5",
        "50/51"
    ]
}