From patchwork Mon Jun 12 20:05:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Kozyrev X-Patchwork-Id: 128520 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 7A4C742C9A; Mon, 12 Jun 2023 22:06:44 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8976842D0C; Mon, 12 Jun 2023 22:06:35 +0200 (CEST) Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2078.outbound.protection.outlook.com [40.107.93.78]) by mails.dpdk.org (Postfix) with ESMTP id D4E42410F9 for ; Mon, 12 Jun 2023 22:06:33 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=adfD4/OgBapyX9LbzXa4OzLDI/2AXAFWLLr1qymYjqoSq3Nwvkoaly3i9KeiqFglpLFx5RrwXCbj7j+GKx/52keNSdfkGjGsYB5t2YNBZOIJMyG0AfOYzMnUurY1vDONRnHPbTzmr/g/5poI/eRf0mrRHRkiqcDWrFb10cirpZN3LFgJ/+AvOW+fJZ64KYM0wBHXxNkFjF+wBtXGFyGPWng0YXEP0fqBD0GZ1qZs49cXrl8rKSlMQ3fwBy2peJ8yfq8Rf1hmurXqkCjNDGt0YYSqJiTDfmMRj7efaNWrjst5iugB9iklL4NnQyEqhyVzBG78rvdcIBfWsfPdNlLmSg== 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=nKBdJj/PLgEdQ66ERzx6TdOLINSCzNkiKfs5rHEW0Hg=; b=nHlzOGdK1b25m4ZwtsGGQ1NrxixuH3EOx84ged2p9nhIJQ3SC4dk1ONZz7eRpdrDRPgx9cCKuI02G8rY67t8ATZHwiMWX38PBjrwqF8uOZBMOVA+ZEgDd+CYlzj29U94+a56Bske1sbyPxZms1xRKFgbKEsiQLT6XP1VVBXYzh5196/TPvn9eFbzmYCD62qQyim4ApxDy0/hbjewqZ0uQtYxCTTiyy+CuU/0caA7Q2CTlpACZ86iYsqltUgE4WgVQpetu4NJkfRc0WNbZSNgF85mOgnCPGLd9wTQAAnE24ehWBqifeOkYQAGlembl7LDa2OQbtzXHHKcaRKEqSlSqA== 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 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=nKBdJj/PLgEdQ66ERzx6TdOLINSCzNkiKfs5rHEW0Hg=; b=hHo6gPFctRq0VLxBVHFP5mCCdRoCnB62w6k/fJANljOPYeLmYa3UKtO8nbCXxqdyDFvtubyRAZTiA13kXLgUQZz4pdyXZrkB4tBkIMrwYsZ8ra7vv4yoGAEv2MXugA7Bk2HfEzZOQTPV5gWjkmk4Pg6hXU8yRERQrkhccwUri6hFS+o4uYEBfrusi4Hpcz8ya0FcQgLUAwGxPyx/bPLLz/nSxOeyjGVXLwtdFLCiByGtvzE2RKngIXAhwiVWgYyPzpcEgMp5vzI426JcQsNJRWmx2KOasO/VLCdzpvwpPRkyevjtkvXdXj8/5HjQ06PqJjPSLkKQdff/Q96wovM92g== Received: from MW4PR03CA0081.namprd03.prod.outlook.com (2603:10b6:303:b6::26) by IA0PR12MB9010.namprd12.prod.outlook.com (2603:10b6:208:48e::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.33; Mon, 12 Jun 2023 20:06:31 +0000 Received: from MWH0EPF000989E6.namprd02.prod.outlook.com (2603:10b6:303:b6:cafe::ee) by MW4PR03CA0081.outlook.office365.com (2603:10b6:303:b6::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6477.34 via Frontend Transport; Mon, 12 Jun 2023 20:06: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 MWH0EPF000989E6.mail.protection.outlook.com (10.167.241.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6500.22 via Frontend Transport; Mon, 12 Jun 2023 20:06: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.986.5; Mon, 12 Jun 2023 13:06:17 -0700 Received: from pegasus01.mtr.labs.mlnx (10.126.230.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.986.37; Mon, 12 Jun 2023 13:06:15 -0700 From: Alexander Kozyrev To: CC: , , , , Subject: [PATCH 3/4] net/mlx5/hws: support rule update after its creation Date: Mon, 12 Jun 2023 23:05:51 +0300 Message-ID: <20230612200552.3450964-4-akozyrev@nvidia.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20230612200552.3450964-1-akozyrev@nvidia.com> References: <20230612200552.3450964-1-akozyrev@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.230.35] X-ClientProxiedBy: rnnvmail201.nvidia.com (10.129.68.8) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWH0EPF000989E6:EE_|IA0PR12MB9010:EE_ X-MS-Office365-Filtering-Correlation-Id: 2f2e43ff-ed57-4b33-f17a-08db6b8083d7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: VCJ4Lr5wwKhXrF11dETPG7KxM69A9+3xbHagDDNTtikCuPgYL4VE06oe0GeDF6hrSAoIP8bMp1GhZt/8B/uE3eUEK5dPXtZlzyddt7zvZ4pMItzj7IBgC+TNxWzzp5Sf1WmIIVun6Oq6lluR3NpyxfImq4WlbLQ4/ET3tZBNVcHZhy9Fxi8JypEWBbAl260jtNpTUsOeCd0OFgF95718deszTidqSjKaNHfifJ/453ZjPBsWkNy6Cj/0mpTiBrRkeNWHazjokIDXUKnrbFiNj+p4ffWbpggJLrWRdD3ffwJGMb16EGYU/4xKjlPYBR3ycVdP+otmmbf0UonD6GMZWx1XYHIS/HpOnRVflosKq93Zy90Ut1wJKJWQtKQX/lP3/so6cVWLLFtAkWmdZvKIzrxfw2na3zq8id1RK/anX37/nBnVVFT67s5zSQHbX3/n/M3lG6pxAC8n9DwvuXzjk7DEQ25uZbGGocERS6fIgzyA6r9Tg5C63FLo746ITzkrED2hwZjn4pwAiUhSVPTXQNR7lkf4lsgB05qdHDLxyE+sC7Gpg5LvM2ILFDdoz+vNQBrWKDarjGpXbnOsrD/571jKq1ecNgganS5yHYGDQvdBtg1wls1AQ7KsGRHJPS5VaWoUnx/4TGLWG4rxnvogv3ft7KwtcvPB6RoO4F0zyx5bmL9eyxoNJGuaT9Gr46KIo1L1NZY9nVw3ym+fc0BkbpVwvt0r/fyt1I7LzfrBhxRG0EzazZVk2DmXZcQEiGpr 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:(13230028)(4636009)(376002)(396003)(346002)(136003)(39860400002)(451199021)(46966006)(40470700004)(36840700001)(5660300002)(8936002)(15650500001)(8676002)(2906002)(70206006)(70586007)(54906003)(6666004)(4326008)(107886003)(1076003)(26005)(316002)(6916009)(41300700001)(186003)(16526019)(36860700001)(7636003)(356005)(82740400003)(426003)(336012)(47076005)(83380400001)(2616005)(40460700003)(478600001)(40480700001)(36756003)(86362001)(82310400005); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Jun 2023 20:06:31.4072 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2f2e43ff-ed57-4b33-f17a-08db6b8083d7 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: MWH0EPF000989E6.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB9010 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: Erez Shitrit Add the ability to change rule's actions after the rule already created. The new actions should be one of the action template list. That support is only for matcher that uses the optimization of using rule insertion by index (optimize_using_rule_idx) Signed-off-by: Erez Shitrit Reviewed-by: Alex Vesker Acked-by: Ori Kam --- drivers/net/mlx5/hws/mlx5dr.h | 17 ++++++ drivers/net/mlx5/hws/mlx5dr_rule.c | 85 ++++++++++++++++++++++++++---- 2 files changed, 93 insertions(+), 9 deletions(-) diff --git a/drivers/net/mlx5/hws/mlx5dr.h b/drivers/net/mlx5/hws/mlx5dr.h index c14fef7a6b..f881d7c961 100644 --- a/drivers/net/mlx5/hws/mlx5dr.h +++ b/drivers/net/mlx5/hws/mlx5dr.h @@ -365,6 +365,23 @@ int mlx5dr_rule_create(struct mlx5dr_matcher *matcher, int mlx5dr_rule_destroy(struct mlx5dr_rule *rule, struct mlx5dr_rule_attr *attr); +/* Enqueue update actions on an existing rule. + * + * @param[in, out] rule_handle + * A valid rule handle to update. + * @param[in] at_idx + * Action template index to update the actions with. + * @param[in] rule_actions + * Rule action to be executed on match. + * @param[in] attr + * Rule update attributes. + * @return zero on successful enqueue non zero otherwise. + */ +int mlx5dr_rule_action_update(struct mlx5dr_rule *rule_handle, + uint8_t at_idx, + struct mlx5dr_rule_action rule_actions[], + struct mlx5dr_rule_attr *attr); + /* Create direct rule drop action. * * @param[in] ctx diff --git a/drivers/net/mlx5/hws/mlx5dr_rule.c b/drivers/net/mlx5/hws/mlx5dr_rule.c index e0c4a6a91a..071e1ad769 100644 --- a/drivers/net/mlx5/hws/mlx5dr_rule.c +++ b/drivers/net/mlx5/hws/mlx5dr_rule.c @@ -40,6 +40,17 @@ static void mlx5dr_rule_skip(struct mlx5dr_matcher *matcher, } } +static void +mlx5dr_rule_update_copy_tag(struct mlx5dr_rule *rule, + struct mlx5dr_wqe_gta_data_seg_ste *wqe_data, + bool is_jumbo) +{ + if (is_jumbo) + memcpy(wqe_data->jumbo, rule->tag.jumbo, MLX5DR_JUMBO_TAG_SZ); + else + memcpy(wqe_data->tag, rule->tag.match, MLX5DR_MATCH_TAG_SZ); +} + static void mlx5dr_rule_init_dep_wqe(struct mlx5dr_send_ring_dep_wqe *dep_wqe, struct mlx5dr_rule *rule, const struct rte_flow_item *items, @@ -53,6 +64,14 @@ static void mlx5dr_rule_init_dep_wqe(struct mlx5dr_send_ring_dep_wqe *dep_wqe, dep_wqe->rule = rule; dep_wqe->user_data = user_data; + if (!items) { /* rule update */ + dep_wqe->rtc_0 = rule->rtc_0; + dep_wqe->rtc_1 = rule->rtc_1; + dep_wqe->retry_rtc_1 = 0; + dep_wqe->retry_rtc_0 = 0; + return; + } + switch (tbl->type) { case MLX5DR_TABLE_TYPE_NIC_RX: case MLX5DR_TABLE_TYPE_NIC_TX: @@ -213,15 +232,20 @@ void mlx5dr_rule_free_action_ste_idx(struct mlx5dr_rule *rule) static void mlx5dr_rule_create_init(struct mlx5dr_rule *rule, struct mlx5dr_send_ste_attr *ste_attr, - struct mlx5dr_actions_apply_data *apply) + struct mlx5dr_actions_apply_data *apply, + bool is_update) { struct mlx5dr_matcher *matcher = rule->matcher; struct mlx5dr_table *tbl = matcher->tbl; struct mlx5dr_context *ctx = tbl->ctx; /* Init rule before reuse */ - rule->rtc_0 = 0; - rule->rtc_1 = 0; + if (!is_update) { + /* In update we use these rtc's */ + rule->rtc_0 = 0; + rule->rtc_1 = 0; + } + rule->pending_wqes = 0; rule->action_ste_idx = -1; rule->status = MLX5DR_RULE_STATUS_CREATING; @@ -264,7 +288,7 @@ static int mlx5dr_rule_create_hws_fw_wqe(struct mlx5dr_rule *rule, return rte_errno; } - mlx5dr_rule_create_init(rule, &ste_attr, &apply); + mlx5dr_rule_create_init(rule, &ste_attr, &apply, false); mlx5dr_rule_init_dep_wqe(&match_wqe, rule, items, mt, attr->user_data); mlx5dr_rule_init_dep_wqe(&range_wqe, rule, items, mt, attr->user_data); @@ -348,10 +372,13 @@ static int mlx5dr_rule_create_hws(struct mlx5dr_rule *rule, struct mlx5dr_actions_apply_data apply; struct mlx5dr_send_engine *queue; uint8_t total_stes, action_stes; + bool is_update; int i, ret; + is_update = (items == NULL); + /* Insert rule using FW WQE if cannot use GTA WQE */ - if (unlikely(mlx5dr_matcher_req_fw_wqe(matcher))) + if (unlikely(mlx5dr_matcher_req_fw_wqe(matcher) && !is_update)) return mlx5dr_rule_create_hws_fw_wqe(rule, attr, mt_idx, items, at_idx, rule_actions); @@ -361,7 +388,7 @@ static int mlx5dr_rule_create_hws(struct mlx5dr_rule *rule, return rte_errno; } - mlx5dr_rule_create_init(rule, &ste_attr, &apply); + mlx5dr_rule_create_init(rule, &ste_attr, &apply, is_update); /* Allocate dependent match WQE since rule might have dependent writes. * The queued dependent WQE can be later aborted or kept as a dependency. @@ -408,9 +435,11 @@ static int mlx5dr_rule_create_hws(struct mlx5dr_rule *rule, * will always match and perform the specified actions, which * makes the tag irrelevant. */ - if (likely(!mlx5dr_matcher_is_insert_by_idx(matcher))) + if (likely(!mlx5dr_matcher_is_insert_by_idx(matcher) && !is_update)) mlx5dr_definer_create_tag(items, mt->fc, mt->fc_sz, (uint8_t *)dep_wqe->wqe_data.action); + else if (unlikely(is_update)) + mlx5dr_rule_update_copy_tag(rule, &dep_wqe->wqe_data, is_jumbo); /* Rule has dependent WQEs, match dep_wqe is queued */ if (action_stes || apply.require_dep) @@ -437,8 +466,10 @@ static int mlx5dr_rule_create_hws(struct mlx5dr_rule *rule, mlx5dr_send_ste(queue, &ste_attr); } - /* Backup TAG on the rule for deletion */ - mlx5dr_rule_save_delete_info(rule, &ste_attr); + /* Backup TAG on the rule for deletion, only after insertion */ + if (!is_update) + mlx5dr_rule_save_delete_info(rule, &ste_attr); + mlx5dr_send_engine_inc_rule(queue); /* Send dependent WQEs */ @@ -666,6 +697,7 @@ int mlx5dr_rule_create(struct mlx5dr_matcher *matcher, assert(matcher->num_of_mt >= mt_idx); assert(matcher->num_of_at >= at_idx); + assert(items); if (unlikely(mlx5dr_table_is_root(matcher->tbl))) ret = mlx5dr_rule_create_root(rule_handle, @@ -699,6 +731,41 @@ int mlx5dr_rule_destroy(struct mlx5dr_rule *rule, return -ret; } +int mlx5dr_rule_action_update(struct mlx5dr_rule *rule_handle, + uint8_t at_idx, + struct mlx5dr_rule_action rule_actions[], + struct mlx5dr_rule_attr *attr) +{ + struct mlx5dr_matcher *matcher = rule_handle->matcher; + int ret; + + if (unlikely(mlx5dr_table_is_root(matcher->tbl) || + unlikely(mlx5dr_matcher_req_fw_wqe(matcher)))) { + DR_LOG(ERR, "Rule update not supported on cureent matcher"); + rte_errno = ENOTSUP; + return -rte_errno; + } + + if (!matcher->attr.optimize_using_rule_idx && + !mlx5dr_matcher_is_insert_by_idx(matcher)) { + DR_LOG(ERR, "Rule update requires optimize by idx matcher"); + rte_errno = ENOTSUP; + return -rte_errno; + } + + if (mlx5dr_rule_enqueue_precheck(matcher->tbl->ctx, attr)) + return -rte_errno; + + ret = mlx5dr_rule_create_hws(rule_handle, + attr, + 0, + NULL, + at_idx, + rule_actions); + + return -ret; +} + size_t mlx5dr_rule_get_handle_size(void) { return sizeof(struct mlx5dr_rule);