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