From patchwork Tue Oct 26 03:56:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haifei Luo X-Patchwork-Id: 102830 X-Patchwork-Delegate: rasland@nvidia.com Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id 5A2DBA0C47; Tue, 26 Oct 2021 05:57:15 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1E36B40A4B; Tue, 26 Oct 2021 05:57:15 +0200 (CEST) Received: from NAM02-DM3-obe.outbound.protection.outlook.com (mail-dm3nam07on2041.outbound.protection.outlook.com [40.107.95.41]) by mails.dpdk.org (Postfix) with ESMTP id 9888D4003E for ; Tue, 26 Oct 2021 05:57:13 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lJY6r4dbaNydhAKvpExyW6pCnHj/6lrW16uq4mqUxPrXXGI4/gq4wcOHF2ip0DkhXW5wa/m3SBS+wyU4Wi7uGrq5KXB3ErSUAU1Sx7V0zWdp1veqnSSMLzH9U7ULHReSIBaDm8nxSPSkXk/1rfh8ky08ds4buF8GlRHQbMZ1BwAwssM8VS1NKgP/CtTezIeC4eOP/PVYMitAbuq5BzOJkuzFPLp+b5o/S/5bBQ+Xw8n9y4bEVH4I8R4YbTCm8NKbeo02fUjlnplYb3iXF01ANphA4BkroZUaJQDbPkX+E3Tu22LekTP85q0d6DzdT6y/G+bqTgq0859dFeRLeoavTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=otM1R3oMGyyfljVTe190gWu3ttGU1HfL6l5xejGVKUY=; b=Qsaei0dAdRGoxLg48ay/V/+Xd/w176qgGvvkSFPJT/OTWAQjsugsLJ/LGi7QINJiy/9RRcOc2R3V3YOQEHwNs51wLDZ6rY+NbgL893J9rsZvdetdgynaGa+0AJ2Cd4+M0OI1n+QGxV/EBVsZoJ3ERXAq8zxTTWB8uJ7Qiie+jBLbunIXnrS8rt9fnZHHlywaYTGBoLA9jSJe7/Xu8SbAO2JKrgmvAIu1iA0PmU5nkZVFoi2Jp1qbz2uaUk7M3oaT2wpsKAAmCCGmEKZ3B6xw0QEZqgLc1sF00E/bTZ1VbODdygIjH7tRE4D8FYk33r97rBcFST/g0C0+j2ZTq5b+kQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.112.34) smtp.rcpttodomain=monjalon.net smtp.mailfrom=nvidia.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=otM1R3oMGyyfljVTe190gWu3ttGU1HfL6l5xejGVKUY=; b=FjQiiKjgoOyilwQ9gvimQRmuT7EzscwTqCOa4kTgtRjYdkh526ZMm3oXdZwDoD0aF0tcV+fc5QtctLb1jEA5BpBDxoMcj6vMhIk6YDWwZQo8rXXXgiN64jMBsIfejPOawtaKln9txZaSagh6JeHLuHEiuiRXqVdE7RO0RMQZ0lGdrsXVN1OF8YuL4Q+qcpTDjrLpC/rivPhKldAZhrywAt0BPifVxVV+ZsZMr1XeYCIN6EHrDTvvaBLLVyjg6Jrh6VUHE2iEbCClpBG/Bku0cUx0k9dA/4ftwawZvY9I5f1ETwZMwS0Z1YXqh7JzPbAcYuakrs6fPP7i17IHoXdRTw== Received: from BN1PR13CA0020.namprd13.prod.outlook.com (2603:10b6:408:e2::25) by DM5PR12MB1340.namprd12.prod.outlook.com (2603:10b6:3:76::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4628.18; Tue, 26 Oct 2021 03:57:11 +0000 Received: from BN8NAM11FT061.eop-nam11.prod.protection.outlook.com (2603:10b6:408:e2:cafe::7f) by BN1PR13CA0020.outlook.office365.com (2603:10b6:408:e2::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4649.13 via Frontend Transport; Tue, 26 Oct 2021 03:57:11 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.112.34) smtp.mailfrom=nvidia.com; monjalon.net; dkim=none (message not signed) header.d=none;monjalon.net; dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.112.34 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.112.34; helo=mail.nvidia.com; Received: from mail.nvidia.com (216.228.112.34) by BN8NAM11FT061.mail.protection.outlook.com (10.13.177.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.4628.16 via Frontend Transport; Tue, 26 Oct 2021 03:57:10 +0000 Received: from nvidia.com (172.20.187.6) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Tue, 26 Oct 2021 03:57:06 +0000 From: Haifei Luo To: , , , CC: , , Date: Tue, 26 Oct 2021 06:56:32 +0300 Message-ID: <20211026035632.11840-1-haifeil@nvidia.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 X-Originating-IP: [172.20.187.6] X-ClientProxiedBy: HQMAIL101.nvidia.com (172.20.187.10) To HQMAIL107.nvidia.com (172.20.187.13) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c9e6267f-ba2a-47ba-8fe1-08d99834b022 X-MS-TrafficTypeDiagnostic: DM5PR12MB1340: X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:4125; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3bbEV37CDphs7CPNrY2BWceequT9HihVoQo2mkCKXZcUkAyuMIZhiS0/KgQEl2BqLLcUqLOCrX8s0wgM5MI9yg7u4p0yzEv4NA/+4HSk3MA4pGPxL0Yh+7X9fUQ4upp4XWIvv8rPg4MEEbO0IGkay20VQai8ThCub8oi94FNtLrYWlTZW66Esokx3VkWo2XXc1vnWcC0NKPfiiV1vI2PAXL4H7lZaeSb//P19RZwo6LGJeZg9ZhlETRjZAUdpVe199f1T72jM/zo834zs6iXuMPxiHLjZUUw+Kdh9f7FdlxQde4xRnq2Ke3EVBvrrEHbb1nI0BCWAlfLq4H5YpScbZMHw3m9c1idXNGSqzJ7l+LKw5aeVxLQgy1Xo7oNMnt+0mzH6qB6c0wUpgse7csL1q2m+RCLVrXGfyjk4K6v3gbUUaxGOKJ4R3NvK6DChDYHUHLAHLrP3cIGFIa6U+AheBJzypLcrHHBvs2htz50K8Hd5NXuGoJ48/uIYM7umIbXQ+baY6+7qP66XFbfjjK9uvoIR9ouNNqqfWU4eC0EKDP2VjxuLEdsAJLqlz9zA7UxeeePAzVusFfS36jXi2UNegUWdOIU3ytk2bw1cW4W+ST8OfG2EuUALBL/W/j64ixu1DlifM9SF29JhUwnMCUWjszze4MjpEHqhaVr0aw6n5oEGnLsUowNJndOO7nAzXomuPlVNuZLCUrbf4Ppb9xf6w== X-Forefront-Antispam-Report: CIP:216.228.112.34; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid03.nvidia.com; CAT:NONE; SFS:(4636009)(36840700001)(46966006)(70586007)(8936002)(6286002)(316002)(55016002)(8676002)(107886003)(36860700001)(70206006)(110136005)(47076005)(86362001)(30864003)(508600001)(1076003)(16526019)(6666004)(36756003)(426003)(7696005)(7636003)(2616005)(26005)(186003)(5660300002)(2906002)(336012)(4326008)(356005)(83380400001)(54906003)(82310400003); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Oct 2021 03:57:10.8423 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c9e6267f-ba2a-47ba-8fe1-08d99834b022 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.34]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT061.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR12MB1340 Subject: [dpdk-dev] [PATCH] net/mlx5: enhancement for flow dump value X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Multiple rules could use the same encap_decap/modify_hdr/counter action. The flow dump data could be duplicated. To avoid redundancy, flow dump value is based on the actions' pointer instead of previous rules' pointer. For counter, the data is stored in cmng of priv->sh. For encap_decap/modify_hdr, the data stored in encaps_decaps/modify_cmds. Traverse the fields and get action's pointer and information. Formats are same for information in the dump except "id" stands for actions' pointer: Counter: rec_type,id,hits,bytes Modify_hdr: rec_type,id,actions_number,actions Encap_decap: rec_type,id,buf Signed-off-by: Haifei Luo Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5.h | 2 +- drivers/net/mlx5/mlx5_flow.c | 161 ++++++++++++++++++++++++++++++++++------ drivers/net/mlx5/mlx5_flow.h | 5 ++ drivers/net/mlx5/mlx5_flow_dv.c | 44 ++++++++++- 4 files changed, 188 insertions(+), 24 deletions(-) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 5da5cea..5fad077 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -1685,7 +1685,7 @@ int mlx5_counter_query(struct rte_eth_dev *dev, uint32_t cnt, int mlx5_flow_dev_dump(struct rte_eth_dev *dev, struct rte_flow *flow, FILE *file, struct rte_flow_error *error); int save_dump_file(const unsigned char *data, uint32_t size, - uint32_t type, uint32_t id, void *arg, FILE *file); + uint32_t type, uint64_t id, void *arg, FILE *file); int mlx5_flow_query_counter(struct rte_eth_dev *dev, struct rte_flow *flow, struct rte_flow_query_count *count, struct rte_flow_error *error); #ifdef HAVE_IBV_FLOW_DV_SUPPORT diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 5d19ef1..e746e20 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -8173,7 +8173,7 @@ struct mlx5_flow_workspace* int save_dump_file(const uint8_t *data, uint32_t size, - uint32_t type, uint32_t id, void *arg, FILE *file) + uint32_t type, uint64_t id, void *arg, FILE *file) { char line[BUF_SIZE]; uint32_t out = 0; @@ -8185,17 +8185,18 @@ struct mlx5_flow_workspace* switch (type) { case DR_DUMP_REC_TYPE_PMD_MODIFY_HDR: actions_num = *(uint32_t *)(arg); - out += snprintf(line + out, BUF_SIZE - out, "%d,0x%x,%d,", + out += snprintf(line + out, BUF_SIZE - out, "%d,0x%" PRIx64 ",%d,", type, id, actions_num); break; case DR_DUMP_REC_TYPE_PMD_PKT_REFORMAT: - out += snprintf(line + out, BUF_SIZE - out, "%d,0x%x,", + out += snprintf(line + out, BUF_SIZE - out, "%d,0x%" PRIx64 ",", type, id); break; case DR_DUMP_REC_TYPE_PMD_COUNTER: count = (struct rte_flow_query_count *)arg; - fprintf(file, "%d,0x%x,%" PRIu64 ",%" PRIu64 "\n", type, - id, count->hits, count->bytes); + fprintf(file, + "%d,0x%" PRIx64 ",%" PRIu64 ",%" PRIu64 "\n", + type, id, count->hits, count->bytes); return 0; default: return -1; @@ -8269,30 +8270,34 @@ struct mlx5_flow_workspace* uint32_t actions_num; const uint8_t *data; size_t size; - uint32_t id; + uint64_t id; uint32_t type; + void *action = NULL; if (!flow) { return rte_flow_error_set(error, ENOENT, - RTE_FLOW_ERROR_TYPE_UNSPECIFIED, - NULL, - "invalid flow handle"); + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "invalid flow handle"); } handle_idx = flow->dev_handles; while (handle_idx) { dh = mlx5_ipool_get(priv->sh->ipool - [MLX5_IPOOL_MLX5_FLOW], handle_idx); + [MLX5_IPOOL_MLX5_FLOW], handle_idx); if (!dh) continue; handle_idx = dh->next.next; - id = (uint32_t)(uintptr_t)dh->drv_flow; /* query counter */ type = DR_DUMP_REC_TYPE_PMD_COUNTER; - if (!mlx5_flow_query_counter(dev, flow, &count, error)) - save_dump_file(NULL, 0, type, - id, (void *)&count, file); - + flow_dv_query_count_ptr(dev, flow->counter, + &action, error); + if (action) { + id = (uint64_t)(uintptr_t)action; + if (!mlx5_flow_query_counter(dev, flow, &count, error)) + save_dump_file(NULL, 0, type, + id, (void *)&count, file); + } /* Get modify_hdr and encap_decap buf from ipools. */ encap_decap = NULL; modify_hdr = dh->dvh.modify_hdr; @@ -8305,14 +8310,16 @@ struct mlx5_flow_workspace* if (modify_hdr) { data = (const uint8_t *)modify_hdr->actions; size = (size_t)(modify_hdr->actions_num) * 8; + id = (uint64_t)(uintptr_t)modify_hdr->action; actions_num = modify_hdr->actions_num; type = DR_DUMP_REC_TYPE_PMD_MODIFY_HDR; save_dump_file(data, size, type, id, - (void *)(&actions_num), file); + (void *)(&actions_num), file); } if (encap_decap) { data = encap_decap->buf; size = encap_decap->size; + id = (uint64_t)(uintptr_t)encap_decap->action; type = DR_DUMP_REC_TYPE_PMD_PKT_REFORMAT; save_dump_file(data, size, type, id, NULL, file); @@ -8320,6 +8327,119 @@ struct mlx5_flow_workspace* } return 0; } + +/** + * Dump all flow's encap_decap/modify_hdr/counter data to file + * + * @param[in] dev + * The pointer to Ethernet device. + * @param[in] file + * A pointer to a file for output. + * @param[out] error + * Perform verbose error reporting if not NULL. PMDs initialize this + * structure in case of error only. + * @return + * 0 on success, a negative value otherwise. + */ +static int +mlx5_flow_dev_dump_sh_all(struct rte_eth_dev *dev, + FILE *file, struct rte_flow_error *error) +{ + struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_dev_ctx_shared *sh = priv->sh; + struct mlx5_hlist *h; + struct mlx5_flow_dv_modify_hdr_resource *modify_hdr; + struct mlx5_flow_dv_encap_decap_resource *encap_decap; + struct rte_flow_query_count count; + uint32_t actions_num; + const uint8_t *data; + size_t size; + uint64_t id; + uint32_t type; + uint32_t i; + uint32_t j; + struct mlx5_list_inconst *l_inconst; + struct mlx5_list_entry *e; + int lcore_index; + struct mlx5_flow_counter_mng *cmng = &priv->sh->cmng; + uint32_t max; + void *action; + + /* encap_decap hlist is lcore_share, get global core cache. */ + i = MLX5_LIST_GLOBAL; + h = sh->encaps_decaps; + if (h) { + for (j = 0; j <= h->mask; j++) { + l_inconst = &h->buckets[j].l; + if (!l_inconst || !l_inconst->cache[i]) + continue; + + e = LIST_FIRST(&l_inconst->cache[i]->h); + while (e) { + encap_decap = + (struct mlx5_flow_dv_encap_decap_resource *)e; + data = encap_decap->buf; + size = encap_decap->size; + id = (uint64_t)(uintptr_t)encap_decap->action; + type = DR_DUMP_REC_TYPE_PMD_PKT_REFORMAT; + save_dump_file(data, size, type, + id, NULL, file); + e = LIST_NEXT(e, next); + } + } + } + + /* get modify_hdr */ + h = sh->modify_cmds; + if (h) { + lcore_index = rte_lcore_index(rte_lcore_id()); + if (unlikely(lcore_index == -1)) { + lcore_index = MLX5_LIST_NLCORE; + rte_spinlock_lock(&h->l_const.lcore_lock); + } + i = lcore_index; + + for (j = 0; j <= h->mask; j++) { + l_inconst = &h->buckets[j].l; + if (!l_inconst || !l_inconst->cache[i]) + continue; + + e = LIST_FIRST(&l_inconst->cache[i]->h); + while (e) { + modify_hdr = + (struct mlx5_flow_dv_modify_hdr_resource *)e; + data = (const uint8_t *)modify_hdr->actions; + size = (size_t)(modify_hdr->actions_num) * 8; + actions_num = modify_hdr->actions_num; + id = (uint64_t)(uintptr_t)modify_hdr->action; + type = DR_DUMP_REC_TYPE_PMD_MODIFY_HDR; + save_dump_file(data, size, type, id, + (void *)(&actions_num), file); + e = LIST_NEXT(e, next); + } + } + + if (unlikely(lcore_index == MLX5_LIST_NLCORE)) + rte_spinlock_unlock(&h->l_const.lcore_lock); + } + + /* get counter */ + MLX5_ASSERT(cmng->n_valid <= cmng->n); + max = MLX5_COUNTERS_PER_POOL * cmng->n_valid; + for (j = 1; j <= max; j++) { + action = NULL; + flow_dv_query_count_ptr(dev, j, &action, error); + if (action) { + if (!flow_dv_query_count(dev, j, &count, error)) { + type = DR_DUMP_REC_TYPE_PMD_COUNTER; + id = (uint64_t)(uintptr_t)action; + save_dump_file(NULL, 0, type, + id, (void *)&count, file); + } + } + } + return 0; +} #endif /** @@ -8346,9 +8466,6 @@ struct mlx5_flow_workspace* int ret; struct mlx5_flow_handle *dh; struct rte_flow *flow; -#ifdef HAVE_IBV_FLOW_DV_SUPPORT - uint32_t idx; -#endif if (!priv->config.dv_flow_en) { if (fputs("device dv flow disabled\n", file) <= 0) @@ -8359,8 +8476,8 @@ struct mlx5_flow_workspace* /* dump all */ if (!flow_idx) { #ifdef HAVE_IBV_FLOW_DV_SUPPORT - MLX5_IPOOL_FOREACH(priv->flows[MLX5_FLOW_TYPE_GEN], idx, flow) - mlx5_flow_dev_dump_ipool(dev, flow, file, error); + if (mlx5_flow_dev_dump_sh_all(dev, file, error)) + return -EINVAL; #endif return mlx5_devx_cmd_flow_dump(sh->fdb_domain, sh->rx_domain, @@ -8370,7 +8487,7 @@ struct mlx5_flow_workspace* flow = mlx5_ipool_get(priv->flows[MLX5_FLOW_TYPE_GEN], (uintptr_t)(void *)flow_idx); if (!flow) - return -ENOENT; + return -EINVAL; #ifdef HAVE_IBV_FLOW_DV_SUPPORT mlx5_flow_dev_dump_ipool(dev, flow, file, error); diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h index 4a16f30..13a9043 100644 --- a/drivers/net/mlx5/mlx5_flow.h +++ b/drivers/net/mlx5/mlx5_flow.h @@ -1674,6 +1674,11 @@ struct mlx5_list_entry *flow_dv_dest_array_clone_cb(void *tool_ctx, struct mlx5_list_entry *entry, void *cb_ctx); void flow_dv_dest_array_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry); +int flow_dv_query_count_ptr(struct rte_eth_dev *dev, uint32_t cnt_idx, + void **action, struct rte_flow_error *error); +int +flow_dv_query_count(struct rte_eth_dev *dev, uint32_t cnt_idx, void *data, + struct rte_flow_error *error); struct mlx5_aso_age_action *flow_aso_age_get_by_idx(struct rte_eth_dev *dev, uint32_t age_idx); diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 9cba22c..052a240 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -15648,7 +15648,7 @@ struct mlx5_list_entry * * @return * 0 on success, a negative errno value otherwise and rte_errno is set. */ -static int +int flow_dv_query_count(struct rte_eth_dev *dev, uint32_t cnt_idx, void *data, struct rte_flow_error *error) { @@ -15686,6 +15686,48 @@ struct mlx5_list_entry * "counters are not available"); } + +/** + * Query counter's action pointer for a DV flow rule via DevX. + * + * @param[in] dev + * Pointer to Ethernet device. + * @param[in] cnt_idx + * Index to the flow counter. + * @param[out] action_ptr + * Action pointer for counter. + * @param[out] error + * Perform verbose error reporting if not NULL. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +int +flow_dv_query_count_ptr(struct rte_eth_dev *dev, uint32_t cnt_idx, + void **action_ptr, struct rte_flow_error *error) +{ + struct mlx5_priv *priv = dev->data->dev_private; + + if (!priv->sh->devx || !action_ptr) + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "counters are not supported"); + + if (cnt_idx) { + struct mlx5_flow_counter *cnt = NULL; + cnt = flow_dv_counter_get_by_idx(dev, cnt_idx, NULL); + if (cnt) { + *action_ptr = cnt->action; + return 0; + } + } + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "counters are not available"); +} + static int flow_dv_action_query(struct rte_eth_dev *dev, const struct rte_flow_action_handle *handle, void *data,