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 4CB654416A; Thu, 6 Jun 2024 14:33:40 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3ECA2410FC; Thu, 6 Jun 2024 14:33:40 +0200 (CEST) Received: from NAM04-MW2-obe.outbound.protection.outlook.com (mail-mw2nam04on2074.outbound.protection.outlook.com [40.107.101.74]) by mails.dpdk.org (Postfix) with ESMTP id 68B8B410FC for ; Thu, 6 Jun 2024 14:33:38 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZUqsaZrHHK1n28jMKV+mmKu/oAYNJyY2LTJlpe1CqYuFUPq0435PgNztb5Uz7OM7yD9PMJYyjoy6WHVsnQkKfKqaHkc6bTMG3dng5T8P9yZ4h7DXPl3Toa8NpvrVFJAxKwVldMPzKVjHNzlFr7blPfxeR7XqVviRoXDUXRNG2dGDm6u2oPyIxclJbVfOzjdAHIJRHOAva4GRjy4U+SYmZ3H3lHPzIDEf3hnwiXsvKwE0nGyFnD+1pYExamCzV0SQIXMf7wSfZ+VE5wGP6Df13kHbGI7QIdM8HLo2UqPAdu/LVJ8PhiytrwWi3CGY4v3fn5w9ILvdW0iG6RCgm6rR+g== 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=GDzoCcoGXR5FPyrWTMYfpCT4a1W3h2o8fGgHdpXHYBQ=; b=HsXQSA7eDHBvn10nIEt0NrEQUmJmgjvZmknOU6SbSNixKzSLSJKSIk8mNgUtC+abiMFtQtXUAmZTUQ+L6RrrbMA3FczRRZwq+lIw+jc/jFhEq+g3vDgC8Evc+aTE0bFfGdzJ8pXzcZkLYX2+MedIciuB6JckOt31brjwfOWyldvW3u6LZMJdB2fKVR188UUFAJBgGNPhx7ryO14BAcnFMmjqgoxuMHunufka0+7sQOPjZ8SkHoRihVo6+2p0md6Ecnwfw0EUwHNIHwiL2xl7AC0YUfKe99BPdKQkF24ZOyxBQZH2rTGWeL7hbv/WQqdtKOtQM+/ecgrV9dpXeRtP4w== 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=GDzoCcoGXR5FPyrWTMYfpCT4a1W3h2o8fGgHdpXHYBQ=; b=ITN2j8t8fCu0TDcqN19831ESO5NNnV/hTCYZWyv30B5pkJNTaNGzCGIZvuYiN+yQGCMRxqBwRuNhsklLb+raTTOfHmRcNiPqKjLPcAYVzFffpzJpwyTBGYISDTZhJWG6vVKESCYY5xUM/zduDgCGPoAn/N6Iv/FfgJ7wl4K33kc+aEDSTsEECMHjaEcItpCeVe+RRAZ9HceWAhCECHr4Ty/TKoq2WqA0rxmFMvGFoe2DkQCI6AE38pKAfcorGaVItASW6EQptFw08fO46T1hVP0ce0SLDa3GvJ8VfgvfsX+VeqmtUXIiMpMMIYLtL58M0CDe/K/9jXBNfy9jh7LjUQ== Received: from SJ0PR03CA0374.namprd03.prod.outlook.com (2603:10b6:a03:3a1::19) by DM4PR12MB8522.namprd12.prod.outlook.com (2603:10b6:8:18f::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.33; Thu, 6 Jun 2024 12:33:32 +0000 Received: from SJ1PEPF00002325.namprd03.prod.outlook.com (2603:10b6:a03:3a1:cafe::19) by SJ0PR03CA0374.outlook.office365.com (2603:10b6:a03:3a1::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7656.19 via Frontend Transport; Thu, 6 Jun 2024 12:33:31 +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 SJ1PEPF00002325.mail.protection.outlook.com (10.167.242.88) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.15 via Frontend Transport; Thu, 6 Jun 2024 12:33:31 +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; Thu, 6 Jun 2024 05:33:15 -0700 Received: from rnnvmail203.nvidia.com (10.129.68.9) 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; Thu, 6 Jun 2024 05:33:15 -0700 Received: from nvidia.com (10.127.8.14) by mail.nvidia.com (10.129.68.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4 via Frontend Transport; Thu, 6 Jun 2024 05:33:12 -0700 From: Maayan Kashani To: CC: , , , "Bing Zhao" , Viacheslav Ovsiienko , "Ori Kam" , Suanming Mou , Matan Azrad Subject: [PATCH v5 03/11] net/mlx5: add basic actions support for non-template API Date: Thu, 6 Jun 2024 15:32:48 +0300 Message-ID: <20240606123256.177947-3-mkashani@nvidia.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20240606123256.177947-1-mkashani@nvidia.com> References: <20240606102317.172553-1-mkashani@nvidia.com> <20240606123256.177947-1-mkashani@nvidia.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00002325:EE_|DM4PR12MB8522:EE_ X-MS-Office365-Filtering-Correlation-Id: 3927c17d-17d8-4cad-8d54-08dc8624e034 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230031|376005|36860700004|1800799015|82310400017; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?7WOhrNBhkE2zrxKUzTO/9/eUpZ/1fACepdRpolIGg4dHbOi4cmCp1fvUonBX?= =?us-ascii?Q?7lxkLGw+EEpuXk0XPCMosVV6tfNtar4VKsqALHEdrMWdFsVm5QcTdfTt1W+I?= =?us-ascii?Q?Woe3fCpeRe5VY/5ZrfX7MrTcgdZWcsOrwXgS9zUOMHUZeR8uIqUDvyeZsOc8?= =?us-ascii?Q?A9dxNeTdCly49wXL53of0HUSKCXehIZs/GojcxlVBSl5wsfmlaurYunRDGmq?= =?us-ascii?Q?DpBuwZVbAJL+Q0vJnaDqu2wTRiUvVfk2yOu8/AA3LyAGUGtrryE6otb6EnnI?= =?us-ascii?Q?7AForKTMpIWV/+hU2PH62z3Abp9t7VFuWvE4n4W/nVA514yHJIOOOi5tPUnt?= =?us-ascii?Q?hxQ9+SFGbtDxGKkv7TTBnxwNbc/Pck4mg0PyciSigoLTPqUjlRB9atr/t1Gv?= =?us-ascii?Q?eJeTXz8ZbRt8Whh0lssdEDpG5MCNXkxnqmjAOCfLwsrVp9zei8Cgp9DfhlIM?= =?us-ascii?Q?0ajRzR9PO4t9F5DN962eFBM+a3AqKa549/Be3Dx2mAhYj4fpvTPH+OW/iL2D?= =?us-ascii?Q?2BCA00eTdUTSxnfVhNfz9nI99G+NOmqY6jv5NFhSVvOLufwJaflOH/ESPn+W?= =?us-ascii?Q?2Yw4G7U89DDvsiUKc59KjH8hgO478PvGIrP8hTb35qCvmwPP8R0BS0jRpZcI?= =?us-ascii?Q?yBHdu6s3PSgoDjpSuKM7Wihtxz93VjL4fhGusxbXMc9R7cIzn7ZB7/Ad+eMQ?= =?us-ascii?Q?l6ROqvoNBdCdeM4boIhIil9Vms7UfWkzsn6s7OKfXIQOhBOG8tPblD8mGCoz?= =?us-ascii?Q?CRiYrFwUJMPAqThyehBokuJca5hELu8xohaoQWvL5TMfGdaoNpb1mIUo/ndW?= =?us-ascii?Q?7VKFv1LcQml013sO88ReLqH9bjpZk60oDIT0XTgTe46SPqgdniolD1xcA5mD?= =?us-ascii?Q?cwBvXEJchFbrbS86ZzQHEuktvEJVNQb2ectrNQDX0/88+Wiix0MVKv/R/FwI?= =?us-ascii?Q?SN+kFdKOkckJHkP6qom2yw83l69dFeWuxoqcxF1RaFaGFLqzqm0bwREVsz+Z?= =?us-ascii?Q?gE9VHNHUbFQVQOU269qAIzl0zom3wxusoJ7zj85wDPkM3qo6F3d1RTDoiDCH?= =?us-ascii?Q?7J2ONXNnxcv6BB63W9jcbi6MIBLTxralZVOwz24HfJcGST04ZCbbWckNFz8S?= =?us-ascii?Q?HJ0NVfQk40SAfn3zqDwCjGcfw/ubTZGnqFF4OqLuZvv01Db+aL7+SVuwTqvF?= =?us-ascii?Q?hmq5z/VYK/pcMB9kSMSGeHzMBdqImj1hBhcyTsUD7H166ORhS0pZC+obpmoc?= =?us-ascii?Q?xXUICIzE+vmW7gLMBzCvmJ4l79oKoxJRhQRpN9nyZIxBTFoK5Y/h3cyETKSb?= =?us-ascii?Q?plgSPjND2wEq/TmomYT0Mp7w7wFROvoF/HTKZCTZz0+T3QvgKgMw8U3FTA5x?= =?us-ascii?Q?5KQhGcljBfDv5MUa4uRAnefBhWXI9S7a7yzgjC7Wqo04TaAZdQ=3D=3D?= 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:(13230031)(376005)(36860700004)(1800799015)(82310400017); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Jun 2024 12:33:31.7002 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3927c17d-17d8-4cad-8d54-08dc8624e034 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: SJ1PEPF00002325.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB8522 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 From: Bing Zhao Support JUMP / DROP / QUEUE / MARK / FLAG now. Signed-off-by: Bing Zhao Acked-by: Dariusz Sosnowski --- drivers/net/mlx5/mlx5_flow_hw.c | 153 ++++++++++++++++++++++++++++---- 1 file changed, 135 insertions(+), 18 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c index 8bcef4c58d..1676579a0c 100644 --- a/drivers/net/mlx5/mlx5_flow_hw.c +++ b/drivers/net/mlx5/mlx5_flow_hw.c @@ -546,8 +546,7 @@ flow_hw_jump_release(struct rte_eth_dev *dev, struct mlx5_hw_jump_action *jump) struct mlx5_priv *priv = dev->data->dev_private; struct mlx5_flow_group *grp; - grp = container_of - (jump, struct mlx5_flow_group, jump); + grp = container_of(jump, struct mlx5_flow_group, jump); mlx5_hlist_unregister(priv->sh->flow_tbls, &grp->entry); } @@ -647,17 +646,9 @@ flow_hw_template_destroy_mhdr_action(struct mlx5_hw_modify_header_action *mhdr) * Pointer to the template HW steering DR actions. */ static void -__flow_hw_action_template_destroy(struct rte_eth_dev *dev, - struct mlx5_hw_actions *acts) +__flow_hw_actions_release(struct rte_eth_dev *dev, struct mlx5_hw_actions *acts) { struct mlx5_priv *priv = dev->data->dev_private; - struct mlx5_action_construct_data *data; - - while (!LIST_EMPTY(&acts->act_list)) { - data = LIST_FIRST(&acts->act_list); - LIST_REMOVE(data, next); - mlx5_ipool_free(priv->acts_ipool, data->idx); - } if (acts->mark) if (!(rte_atomic_fetch_sub_explicit(&priv->hws_mark_refcnt, 1, @@ -702,6 +693,32 @@ __flow_hw_action_template_destroy(struct rte_eth_dev *dev, } } +/** + * Destroy DR actions created by action template. + * + * For DR actions created during table creation's action translate. + * Need to destroy the DR action when destroying the table. + * + * @param[in] dev + * Pointer to the rte_eth_dev structure. + * @param[in] acts + * Pointer to the template HW steering DR actions. + */ +static void +__flow_hw_action_template_destroy(struct rte_eth_dev *dev, struct mlx5_hw_actions *acts) +{ + struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_action_construct_data *data; + + while (!LIST_EMPTY(&acts->act_list)) { + data = LIST_FIRST(&acts->act_list); + LIST_REMOVE(data, next); + mlx5_ipool_free(priv->acts_ipool, data->idx); + } + + __flow_hw_actions_release(dev, acts); +} + /** * Append dynamic action to the dynamic action list. * @@ -12690,14 +12707,113 @@ static int flow_hw_prepare(struct rte_eth_dev *dev, return 0; } -static int flow_hw_translate_actions(struct rte_eth_dev *dev __rte_unused, - const struct rte_flow_attr *attr __rte_unused, - const struct rte_flow_action actions[] __rte_unused, - struct rte_flow_hw *flow __rte_unused, - struct rte_flow_error *error __rte_unused) +static int +flow_hw_translate_actions(struct rte_eth_dev *dev, + const struct rte_flow_attr *attr, + const struct rte_flow_action actions[], + struct rte_flow_hw *flow, + struct mlx5_hw_actions *hw_acts, + bool external, + struct rte_flow_error *error) { - /* TODO implement */ + struct mlx5_priv *priv = dev->data->dev_private; + enum mlx5dr_table_type type; + enum mlx5_hw_action_flag_type flag_type; + bool actions_end = false; + uint64_t action_flags = 0; /* to be used when needed */ + uint32_t actions_n = 0; + uint32_t mark_id; + uint32_t jump_group; + bool is_mark; + struct mlx5_flow_template_table_cfg tbl_cfg; + enum mlx5_flow_fate_type fate_type = MLX5_FLOW_FATE_NONE; + + if (attr->transfer) + type = MLX5DR_TABLE_TYPE_FDB; + else if (attr->egress) + type = MLX5DR_TABLE_TYPE_NIC_TX; + else + type = MLX5DR_TABLE_TYPE_NIC_RX; + /* The group in the attribute translation was done in advance. */ + flag_type = (attr->group == 0) ? MLX5_HW_ACTION_FLAG_ROOT : + MLX5_HW_ACTION_FLAG_NONE_ROOT; + for (; !actions_end; actions++) { + switch (actions->type) { + case RTE_FLOW_ACTION_TYPE_VOID: + break; + case RTE_FLOW_ACTION_TYPE_DROP: + hw_acts->rule_acts[actions_n++].action = priv->hw_drop[flag_type]; + fate_type = MLX5_FLOW_FATE_DROP; + break; + case RTE_FLOW_ACTION_TYPE_FLAG: + case RTE_FLOW_ACTION_TYPE_MARK: + is_mark = actions->type == RTE_FLOW_ACTION_TYPE_MARK; + mark_id = is_mark ? + ((const struct rte_flow_action_mark *)(actions->conf))->id : + MLX5_FLOW_MARK_DEFAULT; + hw_acts->rule_acts[actions_n].tag.value = mlx5_flow_mark_set(mark_id); + hw_acts->rule_acts[actions_n].action = priv->hw_tag[flag_type]; + actions_n++; + action_flags |= is_mark ? MLX5_FLOW_ACTION_MARK : MLX5_FLOW_ACTION_FLAG; + hw_acts->mark = true; + rte_atomic_fetch_add_explicit(&priv->hws_mark_refcnt, 1, + rte_memory_order_relaxed); + flow_hw_rxq_flag_set(dev, true); + break; + case RTE_FLOW_ACTION_TYPE_JUMP: + jump_group = ((const struct rte_flow_action_jump *)actions->conf)->group; + tbl_cfg.attr.flow_attr = *attr; + tbl_cfg.external = external; + /* The flow_hw_jump_action_register() can be refactored. */ + hw_acts->jump = flow_hw_jump_action_register(dev, &tbl_cfg, + jump_group, error); + if (hw_acts->jump == NULL) + goto clean_up; + hw_acts->rule_acts[actions_n++].action = + (flag_type == MLX5_HW_ACTION_FLAG_NONE_ROOT) ? + hw_acts->jump->hws_action : hw_acts->jump->root_action; + action_flags |= MLX5_FLOW_ACTION_JUMP; + fate_type = MLX5_FLOW_FATE_JUMP; + break; + case RTE_FLOW_ACTION_TYPE_QUEUE: + /* Right now, only Rx supports the TIR, validation is needed. */ + hw_acts->tir = flow_hw_tir_action_register(dev, + mlx5_hw_act_flag[flag_type][type], actions); + if (hw_acts->tir == NULL) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ACTION, NULL, + "Failed to translate queue."); + goto clean_up; + } + action_flags |= MLX5_FLOW_ACTION_QUEUE; + fate_type = MLX5_FLOW_FATE_QUEUE; + break; + case RTE_FLOW_ACTION_TYPE_END: + /* + * Using NULL action right now, maybe a new API can be used + * to create a dummy action with type MLX5DR_ACTION_TYP_LAST. + */ + hw_acts->rule_acts[actions_n++].action = priv->sh->hw_dummy_last; + actions_end = true; + break; + default: + break; + } + } + if (fate_type == MLX5_FLOW_FATE_QUEUE) { + hw_acts->rule_acts[actions_n++].action = hw_acts->tir->action; + flow->hrxq = hw_acts->tir; + } else { + if (fate_type == MLX5_FLOW_FATE_JUMP) + flow->jump = hw_acts->jump; + } + /* Total actions number should be validated before. */ + MLX5_ASSERT(actions_n <= MLX5_HW_MAX_ACTS); return 0; +clean_up: + /* Make sure that there is no garbage in the actions. */ + __flow_hw_actions_release(dev, hw_acts); + return -rte_errno; } static int flow_hw_register_matcher(struct rte_eth_dev *dev, @@ -12891,7 +13007,8 @@ static int flow_hw_create_flow(struct rte_eth_dev *dev, if (ret) goto error; - ret = flow_hw_translate_actions(dev, attr, actions, *flow, error); + /* Note: the actions should be saved in the sub-flow rule itself for reference. */ + ret = flow_hw_translate_actions(dev, attr, actions, *flow, &hw_act, external, error); if (ret) goto error; -- 2.21.0