From patchwork Tue Jan 31 09:33:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Vesker X-Patchwork-Id: 122734 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 A30DF41B8D; Tue, 31 Jan 2023 10:36:16 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5898642D5D; Tue, 31 Jan 2023 10:35:00 +0100 (CET) Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2075.outbound.protection.outlook.com [40.107.243.75]) by mails.dpdk.org (Postfix) with ESMTP id D679142D79 for ; Tue, 31 Jan 2023 10:34:58 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ShoCyjhc40/BoRI/o8FiXYJynrC7qJXFrmlKRevwmCCTGIl11Q0h69vOGREuQ7cZI37aW6uEt3EWsOCx82TJsDL9cBnmlZtEMbinEAo5VFicxnPoF7rSfYalrLJDUjehuzGZTn/kNAATLGXjhBRApRe1XLW22YmquRgfAuYgmZtuaOxwy8zQObJ3q0KaA3jeCg2UgsbhG3D2VFLgdRnsBM9mK2MOAPb8kPkcRtckwVjrJUh1n6phmdkoBGFxijSjED7Pirdo9Kv/L3ZscLdlVV9nyblnuwcPoOSi/j8IlvaZXrqkaypES6o9lHCWHnZLFFjq1h/MQJ0M108/R6TFcA== 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=5Yy7bRajjSEJ1zQr60IYcIE2LC2yH7Cj2mJSbihQsb0=; b=A77sfBGXafvWOaLMUqc2hkRZIE2N5XXPM1oo8Ti+nLZV/dEPoO9LClszyMVwENR8zbSe+1regWE2XZceomd7WpUyYHMnlujYCr1/QuUxjsCCKqIXzr1y6AMujQVDXY2YGsC7tj8dTZI/FAtNZwLkpO3YPNFefCAMIFVSW3Gl57b9IKL7snsiUcpnMKt2gA0eVa4PyPE2MZ9SxuW/uH0q0JJ5cF0CIGW3m+R7PmE3mlP1q/F86/+qkAy8W9xaaxzpc7fbUeDvynmk/F5QuSb5cU7JamjGMPjwgVp+E4Hc3y84brc22MFNrwmRvOUGS9h7tnidSeHV3q88rxnK1b2tGA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=monjalon.net 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=5Yy7bRajjSEJ1zQr60IYcIE2LC2yH7Cj2mJSbihQsb0=; b=MNlutQl/MBP42ytV+Gj+psCk/1k1YJXa10Znb54m41ewd7aZ0JMIuQ/YirQCf5ccoKsUvCimgPGqobSWcpteqOyCNZRyjK3dJf1r+pBk2AAM9e92a2jhzJTruIX22iJRAUEamlC4mEIepOqxV97/qqrKq2frmOchU7Z8oBJgzt1RdNQfsruWUUfFE2r3slOrEW3+jIeJ5DSvfkXw7DIPYG6KC65/LY40h18mhysx5/Sn4hnEf2PUV+KXrg03XsH6rHTah5sDD8laYCc6k5x02NBnJdEWNvvq7kaMxPfF4PxQwdIv+Vqf896U4mTpMlQ+4o8+pbcgEJ37D3jCrVXTdw== Received: from MW4PR03CA0206.namprd03.prod.outlook.com (2603:10b6:303:b8::31) by PH0PR12MB7012.namprd12.prod.outlook.com (2603:10b6:510:21c::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6043.36; Tue, 31 Jan 2023 09:34:57 +0000 Received: from CO1NAM11FT039.eop-nam11.prod.protection.outlook.com (2603:10b6:303:b8:cafe::1) by MW4PR03CA0206.outlook.office365.com (2603:10b6:303:b8::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6043.38 via Frontend Transport; Tue, 31 Jan 2023 09:34:56 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) 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.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by CO1NAM11FT039.mail.protection.outlook.com (10.13.174.110) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6064.22 via Frontend Transport; Tue, 31 Jan 2023 09:34:56 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.36; Tue, 31 Jan 2023 01:34:42 -0800 Received: from nvidia.com (10.126.231.37) 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.36; Tue, 31 Jan 2023 01:34:40 -0800 From: Alex Vesker To: , , , "Matan Azrad" CC: , Subject: [v1 16/16] net/mlx5/hws: cache definer for reuse Date: Tue, 31 Jan 2023 11:33:45 +0200 Message-ID: <20230131093346.1261066-17-valex@nvidia.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20230131093346.1261066-1-valex@nvidia.com> References: <20230131093346.1261066-1-valex@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.231.37] X-ClientProxiedBy: rnnvmail203.nvidia.com (10.129.68.9) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1NAM11FT039:EE_|PH0PR12MB7012:EE_ X-MS-Office365-Filtering-Correlation-Id: 40032da9-1d18-4e96-af9e-08db036e6a69 X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: bDR9fcGw8iusGzhUSMJMJ0AFI8uaBTicbikeAiNF1rSuwL3l0UrrJpNCNFYhOV+yJVr6YXfamx+eTK8OsLrwbo1ta/29s33Zze7YCws3A1CWAqAwBG6kLbvYWHousdKbuDugcn/fmd94CUhOkljfSPpLbKmaI6bRshz/Va6/zu/vO1XsL5Zd7ZaO/qBeYae5Q/Lo7fqm3uSF13ptJl5Y2WgiUs9e1j3AXkYmw0P7mzurkvN9BlPrKQ1aJmNJD2KE1BH1K1uLARoq60Mp4DxOX2NeSmr0GTDJKUwbsFJdVLBhrMagFoghKPdvGH/8AJ3Pr1SXr/xmAqIduTYeWAYMml0Lq6daUzoZbfNy6cS0CyY3xXda0BbMc1kjrR/JyVhvRShyYfnD5gckckissQaGYBYuMvcxKq8VhA9TSLLPdIjR7rE0tVYAxu6FX6ThWB6b7OBv+XOx5TTcJWxarMntQnSOkCIQt9av2/8kj/fxNMN7Q+GoW/QnvsgZoCM2hZ2G6jQEWHkLooMT/60pwHNxYV8dfF3aJDL/KDab6wicvg+09pQhVFLM2vjTnUb9WolKoyNgSUF7lBn6JIwsu3K2RnuKNXWmoIeEGLtElpKIoo3V8UONG6N7sNxqs1G/DAMepl5Kj5fNYO6TeeauOakImCcXof4vgy9cduz/Lh/xYP4oJXwjmFsOzYY3gAiXHRqv4fbaCz/X+hWtlwkq5GXjXA== X-Forefront-Antispam-Report: CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE; SFS:(13230025)(4636009)(346002)(136003)(396003)(376002)(39860400002)(451199018)(36840700001)(46966006)(40470700004)(40460700003)(8936002)(5660300002)(41300700001)(336012)(82740400003)(2616005)(8676002)(356005)(54906003)(478600001)(316002)(7636003)(6636002)(36756003)(4326008)(7696005)(2906002)(110136005)(16526019)(426003)(26005)(6286002)(47076005)(55016003)(186003)(107886003)(1076003)(70206006)(83380400001)(70586007)(36860700001)(86362001)(40480700001)(82310400005); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2023 09:34:56.8560 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 40032da9-1d18-4e96-af9e-08db036e6a69 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.160]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT039.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB7012 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 Definers are a limited resource in the system per GVMI, to avoid failure we try to improve bt checking if it is possible to reuse the definers in some cases. Added a cache on the context for this purpose. Signed-off-by: Alex Vesker --- drivers/net/mlx5/hws/mlx5dr_context.c | 12 ++- drivers/net/mlx5/hws/mlx5dr_context.h | 1 + drivers/net/mlx5/hws/mlx5dr_definer.c | 122 ++++++++++++++++++++++---- drivers/net/mlx5/hws/mlx5dr_definer.h | 14 +++ 4 files changed, 130 insertions(+), 19 deletions(-) diff --git a/drivers/net/mlx5/hws/mlx5dr_context.c b/drivers/net/mlx5/hws/mlx5dr_context.c index 6627337d9e..08a5ee92a5 100644 --- a/drivers/net/mlx5/hws/mlx5dr_context.c +++ b/drivers/net/mlx5/hws/mlx5dr_context.c @@ -13,6 +13,9 @@ static int mlx5dr_context_pools_init(struct mlx5dr_context *ctx) if (mlx5dr_pat_init_pattern_cache(&ctx->pattern_cache)) return rte_errno; + if (mlx5dr_definer_init_cache(&ctx->definer_cache)) + goto uninit_pat_cache; + /* Create an STC pool per FT type */ pool_attr.pool_type = MLX5DR_POOL_TYPE_STC; pool_attr.flags = MLX5DR_POOL_FLAGS_FOR_STC_POOL; @@ -35,8 +38,10 @@ static int mlx5dr_context_pools_init(struct mlx5dr_context *ctx) if (ctx->stc_pool[i]) mlx5dr_pool_destroy(ctx->stc_pool[i]); - mlx5dr_pat_uninit_pattern_cache(ctx->pattern_cache); + mlx5dr_definer_uninit_cache(ctx->definer_cache); +uninit_pat_cache: + mlx5dr_pat_uninit_pattern_cache(ctx->pattern_cache); return rte_errno; } @@ -44,12 +49,13 @@ static void mlx5dr_context_pools_uninit(struct mlx5dr_context *ctx) { int i; - mlx5dr_pat_uninit_pattern_cache(ctx->pattern_cache); - for (i = 0; i < MLX5DR_TABLE_TYPE_MAX; i++) { if (ctx->stc_pool[i]) mlx5dr_pool_destroy(ctx->stc_pool[i]); } + + mlx5dr_definer_uninit_cache(ctx->definer_cache); + mlx5dr_pat_uninit_pattern_cache(ctx->pattern_cache); } static int mlx5dr_context_init_pd(struct mlx5dr_context *ctx, diff --git a/drivers/net/mlx5/hws/mlx5dr_context.h b/drivers/net/mlx5/hws/mlx5dr_context.h index a38d9484b3..0ba8d0c92e 100644 --- a/drivers/net/mlx5/hws/mlx5dr_context.h +++ b/drivers/net/mlx5/hws/mlx5dr_context.h @@ -39,6 +39,7 @@ struct mlx5dr_context { struct mlx5dr_context_common_res common_res[MLX5DR_TABLE_TYPE_MAX]; struct mlx5dr_context_shared_gvmi_res gvmi_res[MLX5DR_TABLE_TYPE_MAX]; struct mlx5dr_pattern_cache *pattern_cache; + struct mlx5dr_definer_cache *definer_cache; pthread_spinlock_t ctrl_lock; enum mlx5dr_context_flags flags; struct mlx5dr_send_engine *send_queue; diff --git a/drivers/net/mlx5/hws/mlx5dr_definer.c b/drivers/net/mlx5/hws/mlx5dr_definer.c index cf84fbea71..b91f98ee8f 100644 --- a/drivers/net/mlx5/hws/mlx5dr_definer.c +++ b/drivers/net/mlx5/hws/mlx5dr_definer.c @@ -2061,6 +2061,7 @@ mlx5dr_definer_compare(struct mlx5dr_definer *definer_a, { int i; + /* Future: Optimize by comparing selectors with valid mask only */ for (i = 0; i < BYTE_SELECTORS; i++) if (definer_a->byte_selector[i] != definer_b->byte_selector[i]) return 1; @@ -2133,15 +2134,106 @@ mlx5dr_definer_calc_layout(struct mlx5dr_matcher *matcher, return rte_errno; } +int mlx5dr_definer_init_cache(struct mlx5dr_definer_cache **cache) +{ + struct mlx5dr_definer_cache *new_cache; + + new_cache = simple_calloc(1, sizeof(*new_cache)); + if (!new_cache) { + rte_errno = ENOMEM; + return rte_errno; + } + LIST_INIT(&new_cache->head); + *cache = new_cache; + + return 0; +} + +void mlx5dr_definer_uninit_cache(struct mlx5dr_definer_cache *cache) +{ + simple_free(cache); +} + +static struct mlx5dr_devx_obj * +mlx5dr_definer_get_obj(struct mlx5dr_context *ctx, + struct mlx5dr_definer *definer) +{ + struct mlx5dr_definer_cache *cache = ctx->definer_cache; + struct mlx5dr_cmd_definer_create_attr def_attr = {0}; + struct mlx5dr_definer_cache_item *cached_definer; + struct mlx5dr_devx_obj *obj; + + /* Search definer cache for requested definer */ + LIST_FOREACH(cached_definer, &cache->head, next) { + if (mlx5dr_definer_compare(&cached_definer->definer, definer)) + continue; + + /* Reuse definer and set LRU (move to be first in the list) */ + LIST_REMOVE(cached_definer, next); + LIST_INSERT_HEAD(&cache->head, cached_definer, next); + cached_definer->refcount++; + return cached_definer->definer.obj; + } + + /* Allocate and create definer based on the bitmask tag */ + def_attr.match_mask = definer->mask.jumbo; + def_attr.dw_selector = definer->dw_selector; + def_attr.byte_selector = definer->byte_selector; + + obj = mlx5dr_cmd_definer_create(ctx->ibv_ctx, &def_attr); + if (!obj) + return NULL; + + cached_definer = simple_calloc(1, sizeof(*cached_definer)); + if (!cached_definer) { + rte_errno = ENOMEM; + goto free_definer_obj; + } + + memcpy(&cached_definer->definer, definer, sizeof(*definer)); + cached_definer->definer.obj = obj; + cached_definer->refcount = 1; + LIST_INSERT_HEAD(&cache->head, cached_definer, next); + + return obj; + +free_definer_obj: + mlx5dr_cmd_destroy_obj(obj); + return NULL; +} + +static void +mlx5dr_definer_put_obj(struct mlx5dr_context *ctx, + struct mlx5dr_devx_obj *obj) +{ + struct mlx5dr_definer_cache_item *cached_definer; + + LIST_FOREACH(cached_definer, &ctx->definer_cache->head, next) { + if (cached_definer->definer.obj != obj) + continue; + + /* Object found */ + if (--cached_definer->refcount) + return; + + LIST_REMOVE(cached_definer, next); + mlx5dr_cmd_destroy_obj(cached_definer->definer.obj); + simple_free(cached_definer); + return; + } + + /* Programming error, object must be part of cache */ + assert(false); +} + static struct mlx5dr_definer * -mlx5dr_definer_alloc(struct ibv_context *ibv_ctx, +mlx5dr_definer_alloc(struct mlx5dr_context *ctx, struct mlx5dr_definer_fc *fc, int fc_sz, struct rte_flow_item *items, struct mlx5dr_definer *layout, bool bind_fc) { - struct mlx5dr_cmd_definer_create_attr def_attr = {0}; struct mlx5dr_definer *definer; int ret; @@ -2166,12 +2258,7 @@ mlx5dr_definer_alloc(struct ibv_context *ibv_ctx, /* Create the tag mask used for definer creation */ mlx5dr_definer_create_tag_mask(items, fc, fc_sz, definer->mask.jumbo); - /* Create definer based on the bitmask tag */ - def_attr.match_mask = definer->mask.jumbo; - def_attr.dw_selector = layout->dw_selector; - def_attr.byte_selector = layout->byte_selector; - - definer->obj = mlx5dr_cmd_definer_create(ibv_ctx, &def_attr); + definer->obj = mlx5dr_definer_get_obj(ctx, definer); if (!definer->obj) goto free_definer; @@ -2183,9 +2270,10 @@ mlx5dr_definer_alloc(struct ibv_context *ibv_ctx, } static void -mlx5dr_definer_free(struct mlx5dr_definer *definer) +mlx5dr_definer_free(struct mlx5dr_context *ctx, + struct mlx5dr_definer *definer) { - mlx5dr_cmd_destroy_obj(definer->obj); + mlx5dr_definer_put_obj(ctx, definer->obj); simple_free(definer); } @@ -2199,7 +2287,7 @@ mlx5dr_definer_matcher_match_init(struct mlx5dr_context *ctx, /* Create mendatory match definer */ for (i = 0; i < matcher->num_of_mt; i++) { - mt[i].definer = mlx5dr_definer_alloc(ctx->ibv_ctx, + mt[i].definer = mlx5dr_definer_alloc(ctx, mt[i].fc, mt[i].fc_sz, mt[i].items, @@ -2214,7 +2302,7 @@ mlx5dr_definer_matcher_match_init(struct mlx5dr_context *ctx, free_definers: while (i--) - mlx5dr_definer_free(mt[i].definer); + mlx5dr_definer_free(ctx, mt[i].definer); return rte_errno; } @@ -2222,10 +2310,11 @@ mlx5dr_definer_matcher_match_init(struct mlx5dr_context *ctx, static void mlx5dr_definer_matcher_match_uninit(struct mlx5dr_matcher *matcher) { + struct mlx5dr_context *ctx = matcher->tbl->ctx; int i; for (i = 0; i < matcher->num_of_mt; i++) - mlx5dr_definer_free(matcher->mt[i].definer); + mlx5dr_definer_free(ctx, matcher->mt[i].definer); } static int @@ -2249,7 +2338,7 @@ mlx5dr_definer_matcher_range_init(struct mlx5dr_context *ctx, matcher->flags |= MLX5DR_MATCHER_FLAGS_RANGE_DEFINER; /* Create definer without fcr binding, already binded */ - mt[i].range_definer = mlx5dr_definer_alloc(ctx->ibv_ctx, + mt[i].range_definer = mlx5dr_definer_alloc(ctx, mt[i].fcr, mt[i].fcr_sz, mt[i].items, @@ -2265,7 +2354,7 @@ mlx5dr_definer_matcher_range_init(struct mlx5dr_context *ctx, free_definers: while (i--) if (mt[i].range_definer) - mlx5dr_definer_free(mt[i].range_definer); + mlx5dr_definer_free(ctx, mt[i].range_definer); return rte_errno; } @@ -2273,11 +2362,12 @@ mlx5dr_definer_matcher_range_init(struct mlx5dr_context *ctx, static void mlx5dr_definer_matcher_range_uninit(struct mlx5dr_matcher *matcher) { + struct mlx5dr_context *ctx = matcher->tbl->ctx; int i; for (i = 0; i < matcher->num_of_mt; i++) if (matcher->mt[i].range_definer) - mlx5dr_definer_free(matcher->mt[i].range_definer); + mlx5dr_definer_free(ctx, matcher->mt[i].range_definer); } static int diff --git a/drivers/net/mlx5/hws/mlx5dr_definer.h b/drivers/net/mlx5/hws/mlx5dr_definer.h index dd9a297007..464872acd6 100644 --- a/drivers/net/mlx5/hws/mlx5dr_definer.h +++ b/drivers/net/mlx5/hws/mlx5dr_definer.h @@ -569,6 +569,16 @@ struct mlx5dr_definer { struct mlx5dr_devx_obj *obj; }; +struct mlx5dr_definer_cache { + LIST_HEAD(definer_head, mlx5dr_definer_cache_item) head; +}; + +struct mlx5dr_definer_cache_item { + struct mlx5dr_definer definer; + uint32_t refcount; + LIST_ENTRY(mlx5dr_definer_cache_item) next; +}; + static inline bool mlx5dr_definer_is_jumbo(struct mlx5dr_definer *definer) { @@ -592,4 +602,8 @@ int mlx5dr_definer_matcher_init(struct mlx5dr_context *ctx, void mlx5dr_definer_matcher_uninit(struct mlx5dr_matcher *matcher); +int mlx5dr_definer_init_cache(struct mlx5dr_definer_cache **cache); + +void mlx5dr_definer_uninit_cache(struct mlx5dr_definer_cache *cache); + #endif