Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/127905/?format=api
http://patches.dpdk.org/api/patches/127905/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230601195538.8265-33-ivan.malov@arknetworks.am/", "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": "<20230601195538.8265-33-ivan.malov@arknetworks.am>", "list_archive_url": "https://inbox.dpdk.org/dev/20230601195538.8265-33-ivan.malov@arknetworks.am", "date": "2023-06-01T19:55:36", "name": "[32/34] net/sfc: indicate MAE counter type in use for transfer flows", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "e7dcf753e021d71884d8c12d57b172ba4e50c0ab", "submitter": { "id": 2962, "url": "http://patches.dpdk.org/api/people/2962/?format=api", "name": "Ivan Malov", "email": "ivan.malov@arknetworks.am" }, "delegate": { "id": 319, "url": "http://patches.dpdk.org/api/users/319/?format=api", "username": "fyigit", "first_name": "Ferruh", "last_name": "Yigit", "email": "ferruh.yigit@amd.com" }, "mbox": "http://patches.dpdk.org/project/dpdk/patch/20230601195538.8265-33-ivan.malov@arknetworks.am/mbox/", "series": [ { "id": 28307, "url": "http://patches.dpdk.org/api/series/28307/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=28307", "date": "2023-06-01T19:55:04", "name": "net/sfc: support HW conntrack assistance", "version": 1, "mbox": "http://patches.dpdk.org/series/28307/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/127905/comments/", "check": "warning", "checks": "http://patches.dpdk.org/api/patches/127905/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id D74AC42C07;\n\tThu, 1 Jun 2023 21:59:12 +0200 (CEST)", "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id F1C9D4301D;\n\tThu, 1 Jun 2023 21:56:21 +0200 (CEST)", "from agw.arknetworks.am (agw.arknetworks.am [79.141.165.80])\n by mails.dpdk.org (Postfix) with ESMTP id AF3CD42D17\n for <dev@dpdk.org>; Thu, 1 Jun 2023 21:55:58 +0200 (CEST)", "from localhost.localdomain (unknown [78.109.69.146])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by agw.arknetworks.am (Postfix) with ESMTPSA id 415F3E1435;\n Thu, 1 Jun 2023 23:55:58 +0400 (+04)" ], "From": "Ivan Malov <ivan.malov@arknetworks.am>", "To": "dev@dpdk.org", "Cc": "Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>,\n Ferruh Yigit <ferruh.yigit@amd.com>, Andy Moreton <amoreton@xilinx.com>", "Subject": "[PATCH 32/34] net/sfc: indicate MAE counter type in use for transfer\n flows", "Date": "Thu, 1 Jun 2023 23:55:36 +0400", "Message-Id": "<20230601195538.8265-33-ivan.malov@arknetworks.am>", "X-Mailer": "git-send-email 2.30.2", "In-Reply-To": "<20230601195538.8265-1-ivan.malov@arknetworks.am>", "References": "<20230601195538.8265-1-ivan.malov@arknetworks.am>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "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" }, "content": "Doing so assists adding support for additional counter types.\n\nCurrent implementation is only aware of action rule counters\nthat are supported by the match-action engine (MAE) on EF100\nNICs, but MAE may also support conntrack assistance counters.\n\nSigned-off-by: Ivan Malov <ivan.malov@arknetworks.am>\nReviewed-by: Andy Moreton <amoreton@xilinx.com>\n---\n drivers/net/sfc/sfc_mae.c | 56 ++++++++++++++--------\n drivers/net/sfc/sfc_mae.h | 7 ++-\n drivers/net/sfc/sfc_mae_counter.c | 77 +++++++++++++++++++++++--------\n drivers/net/sfc/sfc_mae_counter.h | 2 +-\n 4 files changed, 100 insertions(+), 42 deletions(-)", "diff": "diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c\nindex 9851690f58..5687fa3af4 100644\n--- a/drivers/net/sfc/sfc_mae.c\n+++ b/drivers/net/sfc/sfc_mae.c\n@@ -65,15 +65,24 @@ sfc_mae_assign_entity_mport(struct sfc_adapter *sa,\n \n static int\n sfc_mae_counter_registry_init(struct sfc_mae_counter_registry *registry,\n-\t\t\t uint32_t nb_counters_max)\n+\t\t\t uint32_t nb_action_counters_max)\n {\n-\treturn sfc_mae_counters_init(®istry->counters, nb_counters_max);\n+\tint ret;\n+\n+\tret = sfc_mae_counters_init(®istry->action_counters,\n+\t\t\t\t nb_action_counters_max);\n+\tif (ret != 0)\n+\t\treturn ret;\n+\n+\tregistry->action_counters.type = EFX_COUNTER_TYPE_ACTION;\n+\n+\treturn 0;\n }\n \n static void\n sfc_mae_counter_registry_fini(struct sfc_mae_counter_registry *registry)\n {\n-\tsfc_mae_counters_fini(®istry->counters);\n+\tsfc_mae_counters_fini(®istry->action_counters);\n }\n \n struct rte_flow *\n@@ -153,10 +162,10 @@ sfc_mae_attach(struct sfc_adapter *sa)\n \n \t\tsfc_log_init(sa, \"init MAE counter record registry\");\n \t\trc = sfc_mae_counter_registry_init(&mae->counter_registry,\n-\t\t\t\t\t\t limits.eml_max_n_counters);\n+\t\t\t\t\tlimits.eml_max_n_action_counters);\n \t\tif (rc != 0) {\n-\t\t\tsfc_err(sa, \"failed to init MAE counters registry for %u entries: %s\",\n-\t\t\t\tlimits.eml_max_n_counters, rte_strerror(rc));\n+\t\t\tsfc_err(sa, \"failed to init record registry for %u AR counters: %s\",\n+\t\t\t\tlimits.eml_max_n_action_counters, rte_strerror(rc));\n \t\t\tgoto fail_counter_registry_init;\n \t\t}\n \t}\n@@ -833,6 +842,9 @@ sfc_mae_counter_add(struct sfc_adapter *sa,\n \tif (counter_tmp != NULL) {\n \t\tcounter->rte_id_valid = counter_tmp->rte_id_valid;\n \t\tcounter->rte_id = counter_tmp->rte_id;\n+\t\tcounter->type = counter_tmp->type;\n+\t} else {\n+\t\tcounter->type = EFX_COUNTER_TYPE_ACTION;\n \t}\n \n \tcounter->fw_rsrc.counter_id.id = EFX_MAE_RSRC_ID_INVALID;\n@@ -864,8 +876,8 @@ sfc_mae_counter_del(struct sfc_adapter *sa, struct sfc_mae_counter *counter)\n \n \tif (counter->fw_rsrc.counter_id.id != EFX_MAE_RSRC_ID_INVALID ||\n \t counter->fw_rsrc.refcnt != 0) {\n-\t\tsfc_err(sa, \"deleting counter=%p abandons its FW resource: COUNTER_ID=0x%08x, refcnt=%u\",\n-\t\t\tcounter, counter->fw_rsrc.counter_id.id,\n+\t\tsfc_err(sa, \"deleting counter=%p abandons its FW resource: COUNTER_ID=0x%x-#%u, refcnt=%u\",\n+\t\t\tcounter, counter->type, counter->fw_rsrc.counter_id.id,\n \t\t\tcounter->fw_rsrc.refcnt);\n \t}\n \n@@ -916,8 +928,8 @@ sfc_mae_counter_enable(struct sfc_adapter *sa, struct sfc_mae_counter *counter,\n \t}\n \n \tif (fw_rsrc->refcnt == 0) {\n-\t\tsfc_dbg(sa, \"enabled counter=%p: COUNTER_ID=0x%08x\",\n-\t\t\tcounter, fw_rsrc->counter_id.id);\n+\t\tsfc_dbg(sa, \"enabled counter=%p: COUNTER_ID=0x%x-#%u\",\n+\t\t\tcounter, counter->type, fw_rsrc->counter_id.id);\n \t}\n \n \t++(fw_rsrc->refcnt);\n@@ -940,8 +952,8 @@ sfc_mae_counter_disable(struct sfc_adapter *sa, struct sfc_mae_counter *counter)\n \n \tif (fw_rsrc->counter_id.id == EFX_MAE_RSRC_ID_INVALID ||\n \t fw_rsrc->refcnt == 0) {\n-\t\tsfc_err(sa, \"failed to disable counter=%p: already disabled; COUNTER_ID=0x%08x, refcnt=%u\",\n-\t\t\tcounter, fw_rsrc->counter_id.id, fw_rsrc->refcnt);\n+\t\tsfc_err(sa, \"failed to disable counter=%p: already disabled; COUNTER_ID=0x%x-#%u, refcnt=%u\",\n+\t\t\tcounter, counter->type, fw_rsrc->counter_id.id, fw_rsrc->refcnt);\n \t\treturn;\n \t}\n \n@@ -950,11 +962,11 @@ sfc_mae_counter_disable(struct sfc_adapter *sa, struct sfc_mae_counter *counter)\n \n \t\trc = sfc_mae_counter_fw_rsrc_disable(sa, counter);\n \t\tif (rc == 0) {\n-\t\t\tsfc_dbg(sa, \"disabled counter=%p with COUNTER_ID=0x%08x\",\n-\t\t\t\tcounter, counter_id);\n+\t\t\tsfc_dbg(sa, \"disabled counter=%p with COUNTER_ID=0x%x-#%u\",\n+\t\t\t\tcounter, counter->type, counter_id);\n \t\t} else {\n-\t\t\tsfc_err(sa, \"failed to disable counter=%p with COUNTER_ID=0x%08x: %s\",\n-\t\t\t\tcounter, counter_id, strerror(rc));\n+\t\t\tsfc_err(sa, \"failed to disable counter=%p with COUNTER_ID=0x%x-#%u: %s\",\n+\t\t\t\tcounter, counter->type, counter_id, strerror(rc));\n \t\t}\n \n \t\tfw_rsrc->counter_id.id = EFX_MAE_RSRC_ID_INVALID;\n@@ -3954,6 +3966,7 @@ sfc_mae_rule_parse_action_mark(struct sfc_adapter *sa,\n static int\n sfc_mae_rule_parse_action_count(struct sfc_adapter *sa,\n \t\t\t\tconst struct rte_flow_action_count *conf,\n+\t\t\t\tefx_counter_type_t mae_counter_type,\n \t\t\t\tstruct sfc_mae_counter **counterp,\n \t\t\t\tefx_mae_actions_t *spec)\n {\n@@ -3993,6 +4006,8 @@ sfc_mae_rule_parse_action_count(struct sfc_adapter *sa,\n \t\tcounter_tmp.rte_id = conf->id;\n \t}\n \n+\tcounter_tmp.type = mae_counter_type;\n+\n \treturn sfc_mae_counter_add(sa, &counter_tmp, counterp);\n \n \treturn 0;\n@@ -4217,6 +4232,7 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,\n {\n \tstruct sfc_flow_spec_mae *spec_mae = &flow->spec.mae;\n \tconst struct sfc_mae_outer_rule *outer_rule = spec_mae->outer_rule;\n+\tefx_counter_type_t mae_counter_type = EFX_COUNTER_TYPE_ACTION;\n \tconst uint64_t rx_metadata = sa->negotiated_rx_metadata;\n \tstruct sfc_mae_counter **counterp = &ctx->counter;\n \tefx_mae_actions_t *spec = ctx->spec;\n@@ -4309,6 +4325,7 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,\n \t\tSFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_COUNT,\n \t\t\t\t bundle->actions_mask);\n \t\trc = sfc_mae_rule_parse_action_count(sa, action->conf,\n+\t\t\t\t\t\t mae_counter_type,\n \t\t\t\t\t\t counterp, spec_ptr);\n \t\tbreak;\n \tcase RTE_FLOW_ACTION_TYPE_INDIRECT:\n@@ -4887,8 +4904,7 @@ sfc_mae_query_counter(struct sfc_adapter *sa,\n \n \tif (conf == NULL ||\n \t (counter->rte_id_valid && conf->id == counter->rte_id)) {\n-\t\trc = sfc_mae_counter_get(&sa->mae.counter_registry.counters,\n-\t\t\t\t\t counter, data);\n+\t\trc = sfc_mae_counter_get(sa, counter, data);\n \t\tif (rc != 0) {\n \t\t\treturn rte_flow_error_set(error, EINVAL,\n \t\t\t\tRTE_FLOW_ERROR_TYPE_ACTION, action,\n@@ -5002,6 +5018,7 @@ sfc_mae_indir_action_create(struct sfc_adapter *sa,\n \tswitch (action->type) {\n \tcase RTE_FLOW_ACTION_TYPE_COUNT:\n \t\tret = sfc_mae_rule_parse_action_count(sa, action->conf,\n+\t\t\t\t\t\t EFX_COUNTER_TYPE_ACTION,\n \t\t\t\t\t\t &handle->counter, NULL);\n \t\tif (ret == 0)\n \t\t\thandle->counter->indirect = true;\n@@ -5065,8 +5082,7 @@ sfc_mae_indir_action_query(struct sfc_adapter *sa,\n \t\tif (handle->counter->fw_rsrc.refcnt == 0)\n \t\t\tgoto fail_not_in_use;\n \n-\t\tret = sfc_mae_counter_get(&sa->mae.counter_registry.counters,\n-\t\t\t\t\t handle->counter, data);\n+\t\tret = sfc_mae_counter_get(sa, handle->counter, data);\n \t\tif (ret != 0)\n \t\t\tgoto fail_counter_get;\n \ndiff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h\nindex e7b7d3a35e..3a3a5225fd 100644\n--- a/drivers/net/sfc/sfc_mae.h\n+++ b/drivers/net/sfc/sfc_mae.h\n@@ -86,6 +86,7 @@ struct sfc_mae_counter {\n \tstruct sfc_mae_fw_rsrc\t\tfw_rsrc;\n \n \tbool\t\t\t\tindirect;\n+\tefx_counter_type_t\t\ttype;\n };\n \n TAILQ_HEAD(sfc_mae_counters, sfc_mae_counter);\n@@ -157,6 +158,8 @@ struct sfc_mae_counter_records {\n \tstruct sfc_mae_counters_xstats\txstats;\n \t/** Count of all MAE counters */\n \tunsigned int\t\t\tn_mae_counters;\n+\t/** Counter type, for logging */\n+\tefx_counter_type_t\t\ttype;\n };\n \n /** Options for MAE counter polling mode */\n@@ -168,8 +171,8 @@ enum sfc_mae_counter_polling_mode {\n \n struct sfc_mae_counter_registry {\n \t/* Common counter information */\n-\t/** Counters collection */\n-\tstruct sfc_mae_counter_records\tcounters;\n+\t/** Action rule counter record collection */\n+\tstruct sfc_mae_counter_records\taction_counters;\n \n \t/* Information used by counter update service */\n \t/** Callback to get packets from RxQ */\ndiff --git a/drivers/net/sfc/sfc_mae_counter.c b/drivers/net/sfc/sfc_mae_counter.c\nindex 90b89e81c6..47448cba15 100644\n--- a/drivers/net/sfc/sfc_mae_counter.c\n+++ b/drivers/net/sfc/sfc_mae_counter.c\n@@ -80,19 +80,28 @@ sfc_mae_counter_fw_rsrc_enable(struct sfc_adapter *sa,\n \t\t\t struct sfc_mae_counter *counterp)\n {\n \tstruct sfc_mae_counter_registry *reg = &sa->mae.counter_registry;\n-\tstruct sfc_mae_counter_records *counters = ®->counters;\n+\tstruct sfc_mae_counter_records *counters;\n \tstruct sfc_mae_counter_record *p;\n \tefx_counter_t mae_counter;\n \tuint32_t generation_count;\n \tuint32_t unused;\n \tint rc;\n \n+\tswitch (counterp->type) {\n+\tcase EFX_COUNTER_TYPE_ACTION:\n+\t\tcounters = ®->action_counters;\n+\t\tbreak;\n+\tdefault:\n+\t\trc = EINVAL;\n+\t\tgoto fail_counter_type_check;\n+\t}\n+\n \t/*\n \t * The actual count of counters allocated is ignored since a failure\n \t * to allocate a single counter is indicated by non-zero return code.\n \t */\n-\trc = efx_mae_counters_alloc(sa->nic, 1, &unused, &mae_counter,\n-\t\t\t\t &generation_count);\n+\trc = efx_mae_counters_alloc_type(sa->nic, counterp->type, 1, &unused,\n+\t\t\t\t\t &mae_counter, &generation_count);\n \tif (rc != 0) {\n \t\tsfc_err(sa, \"failed to alloc MAE counter: %s\",\n \t\t\trte_strerror(rc));\n@@ -132,16 +141,18 @@ sfc_mae_counter_fw_rsrc_enable(struct sfc_adapter *sa,\n \t */\n \t__atomic_store_n(&p->inuse, true, __ATOMIC_RELEASE);\n \n-\tsfc_info(sa, \"enabled MAE counter #%u with reset pkts=%\" PRIu64\n-\t\t \" bytes=%\" PRIu64, mae_counter.id,\n+\tsfc_info(sa, \"enabled MAE counter 0x%x-#%u with reset pkts=%\" PRIu64\n+\t\t \" bytes=%\" PRIu64, counterp->type, mae_counter.id,\n \t\t p->reset.pkts, p->reset.bytes);\n \n \treturn 0;\n \n fail_counter_id_range:\n-\t(void)efx_mae_counters_free(sa->nic, 1, &unused, &mae_counter, NULL);\n+\t(void)efx_mae_counters_free_type(sa->nic, counterp->type, 1, &unused,\n+\t\t\t\t\t &mae_counter, NULL);\n \n fail_mae_counter_alloc:\n+fail_counter_type_check:\n \tsfc_log_init(sa, \"failed: %s\", rte_strerror(rc));\n \treturn rc;\n }\n@@ -151,12 +162,20 @@ sfc_mae_counter_fw_rsrc_disable(struct sfc_adapter *sa,\n \t\t\t\tstruct sfc_mae_counter *counter)\n {\n \tstruct sfc_mae_counter_registry *reg = &sa->mae.counter_registry;\n-\tstruct sfc_mae_counter_records *counters = ®->counters;\n \tefx_counter_t *mae_counter = &counter->fw_rsrc.counter_id;\n+\tstruct sfc_mae_counter_records *counters;\n \tstruct sfc_mae_counter_record *p;\n \tuint32_t unused;\n \tint rc;\n \n+\tswitch (counter->type) {\n+\tcase EFX_COUNTER_TYPE_ACTION:\n+\t\tcounters = ®->action_counters;\n+\t\tbreak;\n+\tdefault:\n+\t\treturn EINVAL;\n+\t}\n+\n \tSFC_ASSERT(mae_counter->id < counters->n_mae_counters);\n \t/*\n \t * The flag is set at the very end of add operation and reset\n@@ -166,13 +185,14 @@ sfc_mae_counter_fw_rsrc_disable(struct sfc_adapter *sa,\n \tp = &counters->mae_counters[mae_counter->id];\n \t__atomic_store_n(&p->inuse, false, __ATOMIC_RELEASE);\n \n-\trc = efx_mae_counters_free(sa->nic, 1, &unused, mae_counter, NULL);\n+\trc = efx_mae_counters_free_type(sa->nic, counter->type, 1, &unused,\n+\t\t\t\t\tmae_counter, NULL);\n \tif (rc != 0)\n-\t\tsfc_err(sa, \"failed to free MAE counter %u: %s\",\n-\t\t\tmae_counter->id, rte_strerror(rc));\n+\t\tsfc_err(sa, \"failed to free MAE counter 0x%x-#%u: %s\",\n+\t\t\tcounter->type, mae_counter->id, rte_strerror(rc));\n \n-\tsfc_info(sa, \"disabled MAE counter #%u with reset pkts=%\" PRIu64\n-\t\t \" bytes=%\" PRIu64, mae_counter->id,\n+\tsfc_info(sa, \"disabled MAE counter 0x%x-#%u with reset pkts=%\" PRIu64\n+\t\t \" bytes=%\" PRIu64, counter->type, mae_counter->id,\n \t\t p->reset.pkts, p->reset.bytes);\n \n \t/*\n@@ -243,8 +263,8 @@ sfc_mae_counter_increment(struct sfc_adapter *sa,\n \t\t\t\t __ATOMIC_RELAXED);\n \t}\n \n-\tsfc_info(sa, \"update MAE counter #%u: pkts+%\" PRIu64 \"=%\" PRIu64\n-\t\t \", bytes+%\" PRIu64 \"=%\" PRIu64, mae_counter_id,\n+\tsfc_info(sa, \"update MAE counter 0x%x-#%u: pkts+%\" PRIu64 \"=%\" PRIu64\n+\t\t \", bytes+%\" PRIu64 \"=%\" PRIu64, counters->type, mae_counter_id,\n \t\t pkts, cnt_val.pkts, bytes, cnt_val.bytes);\n }\n \n@@ -253,6 +273,7 @@ sfc_mae_parse_counter_packet(struct sfc_adapter *sa,\n \t\t\t struct sfc_mae_counter_registry *counter_registry,\n \t\t\t const struct rte_mbuf *m)\n {\n+\tstruct sfc_mae_counter_records *counters;\n \tuint32_t generation_count;\n \tconst efx_xword_t *hdr;\n \tconst efx_oword_t *counters_data;\n@@ -293,7 +314,12 @@ sfc_mae_parse_counter_packet(struct sfc_adapter *sa,\n \t}\n \n \tid = EFX_XWORD_FIELD(*hdr, ERF_SC_PACKETISER_HEADER_IDENTIFIER);\n-\tif (unlikely(id != ERF_SC_PACKETISER_HEADER_IDENTIFIER_AR)) {\n+\n+\tswitch (id) {\n+\tcase ERF_SC_PACKETISER_HEADER_IDENTIFIER_AR:\n+\t\tcounters = &counter_registry->action_counters;\n+\t\tbreak;\n+\tdefault:\n \t\tsfc_err(sa, \"unexpected MAE counters source identifier %u\", id);\n \t\treturn;\n \t}\n@@ -367,7 +393,7 @@ sfc_mae_parse_counter_packet(struct sfc_adapter *sa,\n \t\t\tEFX_OWORD_FIELD32(counters_data[i],\n \t\t\t\tERF_SC_PACKETISER_PAYLOAD_BYTE_COUNT_HI);\n \t\tsfc_mae_counter_increment(sa,\n-\t\t\t&counter_registry->counters,\n+\t\t\tcounters,\n \t\t\tEFX_OWORD_FIELD32(counters_data[i],\n \t\t\t\tERF_SC_PACKETISER_PAYLOAD_COUNTER_INDEX),\n \t\t\tgeneration_count,\n@@ -941,14 +967,25 @@ sfc_mae_counter_start(struct sfc_adapter *sa)\n }\n \n int\n-sfc_mae_counter_get(struct sfc_mae_counter_records *counters,\n+sfc_mae_counter_get(struct sfc_adapter *sa,\n \t\t const struct sfc_mae_counter *counter,\n \t\t struct rte_flow_query_count *data)\n {\n \tstruct sfc_ft_ctx *ft_ctx = counter->ft_ctx;\n+\tstruct sfc_mae_counter_records *counters;\n \tuint64_t non_reset_tunnel_hit_counter;\n \tstruct sfc_mae_counter_record *p;\n \tunion sfc_pkts_bytes value;\n+\tbool need_byte_count;\n+\n+\tswitch (counter->type) {\n+\tcase EFX_COUNTER_TYPE_ACTION:\n+\t\tcounters = &sa->mae.counter_registry.action_counters;\n+\t\tneed_byte_count = true;\n+\t\tbreak;\n+\tdefault:\n+\t\treturn EINVAL;\n+\t}\n \n \tSFC_ASSERT(counter->fw_rsrc.counter_id.id < counters->n_mae_counters);\n \tp = &counters->mae_counters[counter->fw_rsrc.counter_id.id];\n@@ -968,7 +1005,7 @@ sfc_mae_counter_get(struct sfc_mae_counter_records *counters,\n \t\tdata->hits += ft_ctx->switch_hit_counter;\n \t\tnon_reset_tunnel_hit_counter = data->hits;\n \t\tdata->hits -= ft_ctx->reset_tunnel_hit_counter;\n-\t} else {\n+\t} else if (need_byte_count) {\n \t\tdata->bytes_set = 1;\n \t\tdata->bytes = value.bytes - p->reset.bytes;\n \t}\n@@ -979,7 +1016,9 @@ sfc_mae_counter_get(struct sfc_mae_counter_records *counters,\n \t\t\t\tnon_reset_tunnel_hit_counter;\n \t\t} else {\n \t\t\tp->reset.pkts = value.pkts;\n-\t\t\tp->reset.bytes = value.bytes;\n+\n+\t\t\tif (need_byte_count)\n+\t\t\t\tp->reset.bytes = value.bytes;\n \t\t}\n \t}\n \ndiff --git a/drivers/net/sfc/sfc_mae_counter.h b/drivers/net/sfc/sfc_mae_counter.h\nindex 9c6d8103ac..effb037799 100644\n--- a/drivers/net/sfc/sfc_mae_counter.h\n+++ b/drivers/net/sfc/sfc_mae_counter.h\n@@ -45,7 +45,7 @@ int sfc_mae_counter_fw_rsrc_enable(struct sfc_adapter *sa,\n \t\t\t\t struct sfc_mae_counter *counterp);\n int sfc_mae_counter_fw_rsrc_disable(struct sfc_adapter *sa,\n \t\t\t\t struct sfc_mae_counter *counter);\n-int sfc_mae_counter_get(struct sfc_mae_counter_records *counters,\n+int sfc_mae_counter_get(struct sfc_adapter *sa,\n \t\t\tconst struct sfc_mae_counter *counter,\n \t\t\tstruct rte_flow_query_count *data);\n \n", "prefixes": [ "32/34" ] }{ "id": 127905, "url": "