From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2D5BC45A58; Tue, 15 Oct 2024 18:48:28 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7A76740695; Tue, 15 Oct 2024 18:48:22 +0200 (CEST) Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2073.outbound.protection.outlook.com [40.107.92.73]) by mails.dpdk.org (Postfix) with ESMTP id 8725A40678 for ; Tue, 15 Oct 2024 18:48:20 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=zSMVn+bIwTmdJPoApW5tmgZE1trO9bomqs7xdO6ErBlGpUZoY7gvGFSmfklS0GNt/QyxQRLDHdhrE9QdaRfYohGM0WtPkEMCdZDA+oUWCG+9b/7EJFRMwAUkglqSn4RVFRWLDCrdUDHQa3YkQdq7H8HDYt7WT9RAlHUeQBYxsRXfIvb6WAgl6AnJw11HSCISYo0HzOIz1z6Ytko07fGyGGFSpjOtxKIn1SKQyKJ0vR+3WtHer4wMqIimLBfLqwTZO5e6WtMDcxd1i700FU3rfDQOMn/M/rNO6cj3AcCmComhprR7m7Oo0fqRnF9Hi4g0HYkPfIjL+2qexCBg3yZVEw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=CdrrwC31e4JqYq99mrngeBgtYK/5ICNhOpTxKrgdZBk=; b=hxmeRiNOV6U9TXv8iovqvZAZBSXbWy2cnWGTSSJQvJANkvHG6jCF2Vyg0IcHrOezsnbVYzLLHQUm9tH78cUqRhBjc1AylGs9I45tY1EDrTRqlBZ8acK4p7jcPWpDFGO/EDUta3qA8wUs3sgccirliNUIUlfs0HLPl3YDV2nllN+Q1s3mWkE4PaB1bSnwdAh0LTs8bPTo1bkqM0HEnZgAEe2jgEwvr0zyv7Y7ykEbmKuWme57QKwcjzVuq9yDwL6HpyKoMTI//W5h2uflR2o09IVVvRnPlccqV/JIWOvlDPIyoHInifG8DSBpFjjlPjShstQfi+AgXaURdtFDCOgSiw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=dpdk.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=CdrrwC31e4JqYq99mrngeBgtYK/5ICNhOpTxKrgdZBk=; b=ADMibP8L8fi2zdORhE0BDtE/Hem/rK30r0FiK9vwodrBOcuXhm/YaHJesloVG7grxrN3K4/8xWS5WrrJpr7MFlMN7auy9T2Gk3KHR6s1suXJ7M1a0SASEoCdI9ZP8Z6LmFpGUaS60ZD9a6ps+PWyYyxrBpVpAbQMbokMIbSadu+8r8zN1ZLojJacPd64E7Z/56mHEK4SMiKxwZRHQDW1narJ1gg15oBMYa4lkPTm5XVqfpUAFtQfGU4N66vTh3bEGq8x+ion9CVRLjPNOFQqUaZOZF0o+SY3fu/JJYzkZ2gvtBLCrFvATc/Mk6labosSmtdx9NFgpgq3fepVtsz7rw== Received: from BN9PR03CA0779.namprd03.prod.outlook.com (2603:10b6:408:13a::34) by DS0PR12MB7851.namprd12.prod.outlook.com (2603:10b6:8:14a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8048.27; Tue, 15 Oct 2024 16:48:11 +0000 Received: from BN3PEPF0000B372.namprd21.prod.outlook.com (2603:10b6:408:13a:cafe::29) by BN9PR03CA0779.outlook.office365.com (2603:10b6:408:13a::34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8069.18 via Frontend Transport; Tue, 15 Oct 2024 16:48:11 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN3PEPF0000B372.mail.protection.outlook.com (10.167.243.169) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8093.1 via Frontend Transport; Tue, 15 Oct 2024 16:48:11 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Tue, 15 Oct 2024 09:47:52 -0700 Received: from pegasus01.mtr.labs.mlnx (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Tue, 15 Oct 2024 09:47:49 -0700 From: Alexander Kozyrev To: CC: , , , , , , , , Subject: [PATCH v2 4/5] net/mlx5: add flow rule insertion by index with pattern Date: Tue, 15 Oct 2024 19:47:17 +0300 Message-ID: <20241015164718.607858-4-akozyrev@nvidia.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20241015164718.607858-1-akozyrev@nvidia.com> References: <20241015164718.607858-1-akozyrev@nvidia.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.126.231.35] X-ClientProxiedBy: rnnvmail202.nvidia.com (10.129.68.7) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF0000B372:EE_|DS0PR12MB7851:EE_ X-MS-Office365-Filtering-Correlation-Id: 3eaf5636-886a-47db-7112-08dced3927cb X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|36860700013|1800799024|376014|82310400026; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?S2pI9jxKebf7IfOurZFvATrJQqvZcRDOObcV7ZmOlVag9oJxMLShRaCHa+YE?= =?us-ascii?Q?sbFqD/vHWTkOcIfFlilPuE2Jf1uizy754e7nlSYomUyClHOQbri7WidiPPdi?= =?us-ascii?Q?4zfzyQXdyaaL9QWr6fE/DQojruzkgTrBAneDQeLd0zaP/pAiZqzVCBqyWr39?= =?us-ascii?Q?84lQ+48kPbRZNoWMNCNsR81Mc54jof4WBzNNYX3upe1cOChaQlKVrh8oAOyU?= =?us-ascii?Q?d+m4oKCyKFGoY6RLubFm3pPMC2h4ni0zJ4CK/UNsgFUGbI0MzeGq2YIdI4AH?= =?us-ascii?Q?s+3SwGsuTYKH0pmZcxg9MItPxwfR3//GDDaXEI1CRsl+YlqyR5MQ17939X3n?= =?us-ascii?Q?bCCugT8yHz4DdPdhRf2Gg2Z1Bw3Y0nN0EDJKKpP1WUMo7wXcwmWUK3wfJfWa?= =?us-ascii?Q?UUQIWnZ/XlyXuY/FVHvtKRAxBtgu4kuIzYxQYeZfi6/T3r93aGCQLyZlUqoI?= =?us-ascii?Q?wjHuU/DHYkKZUtzFPR4sV5HAkXv+afw0WUTWXjcUqaTbDogodfsNSaon+W9j?= =?us-ascii?Q?lU3iKTVu4P1Hq6/+v4zfku3uMivZSr1rjqIxUk6o/YxBhhSmHPz/lOGsN7qE?= =?us-ascii?Q?gxidQxHVHCdK3jsS/8aZ5la6mJTgZgwFi61elFkyc/z1jkcLU7PAbuKRwtwp?= =?us-ascii?Q?b4ZjQV6rsmu6CjBP34SD93CU0kMOsIOKpGnJ0sbBn4knkEGX+MhNHdfLGXVt?= =?us-ascii?Q?DN8V2cEqyKR3qQL8xfu9lcw0gT7IfCI/lXg2mUx7ZNrPjHn+uJ7UbiNh46rF?= =?us-ascii?Q?bJpJUPsPU1aGoboCy5WPNqNcz32uvAn8XkQKMJxvXLYukItK/bxY6WUWEmI+?= =?us-ascii?Q?aj4WlZTo1BhOrIr7BkFO2yCjr6eJwoflc46NC+QshhJeA7KKeNTL7iAPPVdV?= =?us-ascii?Q?Fpp/LYktOtDlfoPeXDxdhXXvOsdvZ+y5JnPLfHo7NE2SReTqHyFFxpHyQyWS?= =?us-ascii?Q?97w6W4KEvY1+RcnU5NGLOyS3V+6UZ9RPRLNhP8U0QgWxEr7vtc2W/nHVvm6m?= =?us-ascii?Q?J2V4XxTZidRGajGM8crLoCXU8MC2L2FHyyVymc8eZGrZb8UKXuuuTq7ctQH/?= =?us-ascii?Q?aLUZfC7VKi3V9cwCleUgRQAIBunEz//AQqQKkb0e0IHhS43GZ/IR8xMneSFd?= =?us-ascii?Q?JgzscNUsB/c6k2Y2q7JX/GanUJDhEGwsbzSW6dIk0W3VVgXvmqE95J7R/WDs?= =?us-ascii?Q?T3pgbEqLpCgkaJw5tK4Pi35kFm/NwiW4qj8adQ2s/LM2mBHK0vLdZd7KW9sI?= =?us-ascii?Q?MCwuUBTnTHniVTSAEWROo2LKprFXE342wT0lqkoAE2irpfHjq5Ws8Kai3rBe?= =?us-ascii?Q?P4wPW3L0lj7xmrbqPN0moRCH25jyY0uE0R/5aXKZlF4cbr/SxJhZv9rRhJYy?= =?us-ascii?Q?IrD8eCB5Wo4dywqeMKDxsUMcgo2C?= X-Forefront-Antispam-Report: CIP:216.228.117.161; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge2.nvidia.com; CAT:NONE; SFS:(13230040)(36860700013)(1800799024)(376014)(82310400026); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Oct 2024 16:48:11.4455 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3eaf5636-886a-47db-7112-08dced3927cb X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.161]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF0000B372.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7851 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 Implement rte_flow_async_create_by_index_with_pattern() function. Rework the driver implementation to reduce code duplication by providing a single flow insertion routine, that can be called with different parameters depending on the insertion type. Signed-off-by: Alexander Kozyrev --- drivers/net/mlx5/mlx5_flow_hw.c | 281 +++++++++----------------------- 1 file changed, 81 insertions(+), 200 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c index 6434937562..6c8404ee2c 100644 --- a/drivers/net/mlx5/mlx5_flow_hw.c +++ b/drivers/net/mlx5/mlx5_flow_hw.c @@ -335,18 +335,13 @@ static __rte_always_inline uint32_t flow_hw_tx_tag_regc_value(struct rte_eth_dev static int flow_hw_async_create_validate(struct rte_eth_dev *dev, const uint32_t queue, const struct rte_flow_template_table *table, + enum rte_flow_table_insertion_type insertion_type, + const uint32_t rule_index, const struct rte_flow_item items[], const uint8_t pattern_template_index, const struct rte_flow_action actions[], const uint8_t action_template_index, struct rte_flow_error *error); -static int flow_hw_async_create_by_index_validate(struct rte_eth_dev *dev, - const uint32_t queue, - const struct rte_flow_template_table *table, - const uint32_t rule_index, - const struct rte_flow_action actions[], - const uint8_t action_template_index, - struct rte_flow_error *error); static int flow_hw_async_update_validate(struct rte_eth_dev *dev, const uint32_t queue, const struct rte_flow_hw *flow, @@ -3884,6 +3879,12 @@ flow_hw_get_rule_items(struct rte_eth_dev *dev, * The queue to create the flow. * @param[in] attr * Pointer to the flow operation attributes. + * @param[in] table + * Pointer to the template table. + * @param[in] insertion_type + * Insertion type for flow rules. + * @param[in] rule_index + * The item pattern flow follows from the table. * @param[in] items * Items with flow spec value. * @param[in] pattern_template_index @@ -3900,17 +3901,19 @@ flow_hw_get_rule_items(struct rte_eth_dev *dev, * @return * Flow pointer on success, NULL otherwise and rte_errno is set. */ -static struct rte_flow * -flow_hw_async_flow_create(struct rte_eth_dev *dev, - uint32_t queue, - const struct rte_flow_op_attr *attr, - struct rte_flow_template_table *table, - const struct rte_flow_item items[], - uint8_t pattern_template_index, - const struct rte_flow_action actions[], - uint8_t action_template_index, - void *user_data, - struct rte_flow_error *error) +static __rte_always_inline struct rte_flow * +flow_hw_async_flow_create_generic(struct rte_eth_dev *dev, + uint32_t queue, + const struct rte_flow_op_attr *attr, + struct rte_flow_template_table *table, + enum rte_flow_table_insertion_type insertion_type, + uint32_t rule_index, + const struct rte_flow_item items[], + uint8_t pattern_template_index, + const struct rte_flow_action actions[], + uint8_t action_template_index, + void *user_data, + struct rte_flow_error *error) { struct mlx5_priv *priv = dev->data->dev_private; struct mlx5dr_rule_attr rule_attr = { @@ -3928,8 +3931,8 @@ flow_hw_async_flow_create(struct rte_eth_dev *dev, int ret; if (mlx5_fp_debug_enabled()) { - if (flow_hw_async_create_validate(dev, queue, table, items, pattern_template_index, - actions, action_template_index, error)) + if (flow_hw_async_create_validate(dev, queue, table, insertion_type, rule_index, + items, pattern_template_index, actions, action_template_index, error)) return NULL; } flow = mlx5_ipool_malloc(table->flow, &flow_idx); @@ -3967,7 +3970,7 @@ flow_hw_async_flow_create(struct rte_eth_dev *dev, * Indexed pool returns 1-based indices, but mlx5dr expects 0-based indices * for rule insertion hints. */ - flow->rule_idx = flow->res_idx - 1; + flow->rule_idx = (rule_index == UINT32_MAX) ? flow->res_idx - 1 : rule_index; rule_attr.rule_idx = flow->rule_idx; /* * Construct the flow actions based on the input actions. @@ -4023,33 +4026,26 @@ flow_hw_async_flow_create(struct rte_eth_dev *dev, return NULL; } -/** - * Enqueue HW steering flow creation by index. - * - * The flow will be applied to the HW only if the postpone bit is not set or - * the extra push function is called. - * The flow creation status should be checked from dequeue result. - * - * @param[in] dev - * Pointer to the rte_eth_dev structure. - * @param[in] queue - * The queue to create the flow. - * @param[in] attr - * Pointer to the flow operation attributes. - * @param[in] rule_index - * The item pattern flow follows from the table. - * @param[in] actions - * Action with flow spec value. - * @param[in] action_template_index - * The action pattern flow follows from the table. - * @param[in] user_data - * Pointer to the user_data. - * @param[out] error - * Pointer to error structure. - * - * @return - * Flow pointer on success, NULL otherwise and rte_errno is set. - */ +static struct rte_flow * +flow_hw_async_flow_create(struct rte_eth_dev *dev, + uint32_t queue, + const struct rte_flow_op_attr *attr, + struct rte_flow_template_table *table, + const struct rte_flow_item items[], + uint8_t pattern_template_index, + const struct rte_flow_action actions[], + uint8_t action_template_index, + void *user_data, + struct rte_flow_error *error) +{ + uint32_t rule_index = UINT32_MAX; + + return flow_hw_async_flow_create_generic(dev, queue, attr, table, + RTE_FLOW_TABLE_INSERTION_TYPE_PATTERN, rule_index, + items, pattern_template_index, actions, action_template_index, + user_data, error); +} + static struct rte_flow * flow_hw_async_flow_create_by_index(struct rte_eth_dev *dev, uint32_t queue, @@ -4062,105 +4058,31 @@ flow_hw_async_flow_create_by_index(struct rte_eth_dev *dev, struct rte_flow_error *error) { struct rte_flow_item items[] = {{.type = RTE_FLOW_ITEM_TYPE_END,}}; - struct mlx5_priv *priv = dev->data->dev_private; - struct mlx5dr_rule_attr rule_attr = { - .queue_id = queue, - .user_data = user_data, - .burst = attr->postpone, - }; - struct mlx5dr_rule_action *rule_acts; - struct mlx5_flow_hw_action_params ap; - struct rte_flow_hw *flow = NULL; - uint32_t flow_idx = 0; - uint32_t res_idx = 0; - int ret; + uint8_t pattern_template_index = 0; - if (mlx5_fp_debug_enabled()) { - if (flow_hw_async_create_by_index_validate(dev, queue, table, rule_index, - actions, action_template_index, error)) - return NULL; - } - flow = mlx5_ipool_malloc(table->flow, &flow_idx); - if (!flow) { - rte_errno = ENOMEM; - goto error; - } - rule_acts = flow_hw_get_dr_action_buffer(priv, table, action_template_index, queue); - /* - * Set the table here in order to know the destination table - * when free the flow afterwards. - */ - flow->table = table; - flow->mt_idx = 0; - flow->idx = flow_idx; - if (table->resource) { - mlx5_ipool_malloc(table->resource, &res_idx); - if (!res_idx) { - rte_errno = ENOMEM; - goto error; - } - flow->res_idx = res_idx; - } else { - flow->res_idx = flow_idx; - } - flow->flags = 0; - /* - * Set the flow operation type here in order to know if the flow memory - * should be freed or not when get the result from dequeue. - */ - flow->operation_type = MLX5_FLOW_HW_FLOW_OP_TYPE_CREATE; - flow->user_data = user_data; - rule_attr.user_data = flow; - /* Set the rule index. */ - flow->rule_idx = rule_index; - rule_attr.rule_idx = flow->rule_idx; - /* - * Construct the flow actions based on the input actions. - * The implicitly appended action is always fixed, like metadata - * copy action from FDB to NIC Rx. - * No need to copy and contrust a new "actions" list based on the - * user's input, in order to save the cost. - */ - if (flow_hw_actions_construct(dev, flow, &ap, - &table->ats[action_template_index], - table->its[0]->item_flags, table, - actions, rule_acts, queue, error)) { - rte_errno = EINVAL; - goto error; - } - if (likely(!rte_flow_template_table_resizable(dev->data->port_id, &table->cfg.attr))) { - ret = mlx5dr_rule_create(table->matcher_info[0].matcher, - 0, items, action_template_index, - rule_acts, &rule_attr, - (struct mlx5dr_rule *)flow->rule); - } else { - struct rte_flow_hw_aux *aux = mlx5_flow_hw_aux(dev->data->port_id, flow); - uint32_t selector; + return flow_hw_async_flow_create_generic(dev, queue, attr, table, + RTE_FLOW_TABLE_INSERTION_TYPE_INDEX, rule_index, + items, pattern_template_index, actions, action_template_index, + user_data, error); +} - flow->operation_type = MLX5_FLOW_HW_FLOW_OP_TYPE_RSZ_TBL_CREATE; - rte_rwlock_read_lock(&table->matcher_replace_rwlk); - selector = table->matcher_selector; - ret = mlx5dr_rule_create(table->matcher_info[selector].matcher, - 0, items, action_template_index, - rule_acts, &rule_attr, - (struct mlx5dr_rule *)flow->rule); - rte_rwlock_read_unlock(&table->matcher_replace_rwlk); - aux->matcher_selector = selector; - flow->flags |= MLX5_FLOW_HW_FLOW_FLAG_MATCHER_SELECTOR; - } - if (likely(!ret)) { - flow_hw_q_inc_flow_ops(priv, queue); - return (struct rte_flow *)flow; - } -error: - if (table->resource && res_idx) - mlx5_ipool_free(table->resource, res_idx); - if (flow_idx) - mlx5_ipool_free(table->flow, flow_idx); - rte_flow_error_set(error, rte_errno, - RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, - "fail to create rte flow"); - return NULL; +static struct rte_flow * +flow_hw_async_flow_create_by_index_with_pattern(struct rte_eth_dev *dev, + uint32_t queue, + const struct rte_flow_op_attr *attr, + struct rte_flow_template_table *table, + uint32_t rule_index, + const struct rte_flow_item items[], + uint8_t pattern_template_index, + const struct rte_flow_action actions[], + uint8_t action_template_index, + void *user_data, + struct rte_flow_error *error) +{ + return flow_hw_async_flow_create_generic(dev, queue, attr, table, + RTE_FLOW_TABLE_INSERTION_TYPE_INDEX_WITH_PATTERN, rule_index, + items, pattern_template_index, actions, action_template_index, + user_data, error); } /** @@ -16579,6 +16501,8 @@ flow_hw_async_op_validate(struct rte_eth_dev *dev, * The queue to create the flow. * @param[in] table * Pointer to template table. + * @param[in] rule_index + * The item pattern flow follows from the table. * @param[in] items * Items with flow spec value. * @param[in] pattern_template_index @@ -16598,6 +16522,8 @@ static int flow_hw_async_create_validate(struct rte_eth_dev *dev, const uint32_t queue, const struct rte_flow_template_table *table, + enum rte_flow_table_insertion_type insertion_type, + uint32_t rule_index, const struct rte_flow_item items[], const uint8_t pattern_template_index, const struct rte_flow_action actions[], @@ -16607,63 +16533,18 @@ flow_hw_async_create_validate(struct rte_eth_dev *dev, if (flow_hw_async_op_validate(dev, queue, table, error)) return -rte_errno; - if (table->cfg.attr.insertion_type != RTE_FLOW_TABLE_INSERTION_TYPE_PATTERN) - return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, - "Only pattern insertion is allowed on this table"); - - if (flow_hw_validate_rule_pattern(dev, table, pattern_template_index, items, error)) - return -rte_errno; - - if (flow_hw_validate_rule_actions(dev, table, action_template_index, actions, error)) - return -rte_errno; - - return 0; -} + if (insertion_type != table->cfg.attr.insertion_type) + return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, "Flow rule insertion type mismatch with table configuration"); -/** - * Validate user input for rte_flow_async_create_by_index() implementation. - * - * If RTE_LIBRTE_MLX5_DEBUG macro is not defined, this function is a no-op. - * - * @param[in] dev - * Pointer to the rte_eth_dev structure. - * @param[in] queue - * The queue to create the flow. - * @param[in] table - * Pointer to template table. - * @param[in] rule_index - * Rule index in the table. - * Inserting a rule to already occupied index results in undefined behavior. - * @param[in] actions - * Action with flow spec value. - * @param[in] action_template_index - * The action pattern flow follows from the table. - * @param[out] error - * Pointer to error structure. - * - * @return - * 0 if user input is valid. - * Negative errno otherwise, rte_errno and error struct is set. - */ -static int -flow_hw_async_create_by_index_validate(struct rte_eth_dev *dev, - const uint32_t queue, - const struct rte_flow_template_table *table, - const uint32_t rule_index, - const struct rte_flow_action actions[], - const uint8_t action_template_index, - struct rte_flow_error *error) -{ - if (flow_hw_async_op_validate(dev, queue, table, error)) - return -rte_errno; + if (table->cfg.attr.insertion_type != RTE_FLOW_TABLE_INSERTION_TYPE_PATTERN) + if (rule_index >= table->cfg.attr.nb_flows) + return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, "Flow rule index exceeds table size"); if (table->cfg.attr.insertion_type != RTE_FLOW_TABLE_INSERTION_TYPE_INDEX) - return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, - "Only index insertion is allowed on this table"); - - if (rule_index >= table->cfg.attr.nb_flows) - return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, - "Flow rule index exceeds table size"); + if (flow_hw_validate_rule_pattern(dev, table, pattern_template_index, items, error)) + return -rte_errno; if (flow_hw_validate_rule_actions(dev, table, action_template_index, actions, error)) return -rte_errno; @@ -16671,7 +16552,6 @@ flow_hw_async_create_by_index_validate(struct rte_eth_dev *dev, return 0; } - /** * Validate user input for rte_flow_async_update() implementation. * @@ -16744,6 +16624,7 @@ flow_hw_async_destroy_validate(struct rte_eth_dev *dev, static struct rte_flow_fp_ops mlx5_flow_hw_fp_ops = { .async_create = flow_hw_async_flow_create, .async_create_by_index = flow_hw_async_flow_create_by_index, + .async_create_by_index_with_pattern = flow_hw_async_flow_create_by_index_with_pattern, .async_actions_update = flow_hw_async_flow_update, .async_destroy = flow_hw_async_flow_destroy, .push = flow_hw_push, -- 2.18.2