From patchwork Wed Feb 1 07:28:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Vesker X-Patchwork-Id: 122794 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 878B541B9B; Wed, 1 Feb 2023 08:30:56 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4471642DA4; Wed, 1 Feb 2023 08:29:37 +0100 (CET) Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2058.outbound.protection.outlook.com [40.107.237.58]) by mails.dpdk.org (Postfix) with ESMTP id DF89B40A7A for ; Wed, 1 Feb 2023 08:29:35 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VivJZExNyPcIjI7kfrkn0haboMdCb9gr0Gl05xndJ56Ys2TlFYGEuNwUnaxPtDO63cuHzUSwmQLZPsSJCP3pErI82efzLwnLegQNGkuri6LugZcZWu/b9jPyzf18V7MyuhFWd7KCxtbEuXkJlo8OTN7+VBnZPdLHALPK40I3suBnjVINMW9JpG1EQWzEYp3oPwnPyPS6GzqhUszmtZ3ABJ5RaW88hBCTLX0Yu80Z9ylQYcxzTdjzDGtGh/pQucjDL+HVDY9GzTH/w/53bFxr0PyHyWFMCEPmK64w3mGh7aUlQuX7jnFRDZJWfat0H8mut5Jg1yzKoWKNkksoQo9KcA== 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=c5QNsE14SEWnRJh1eICL2iwtYzOTEOQJMd4d1FwW1yg=; b=GWtjOTMYE/Mmxfy0DP+patXPapUFp8MnkAKBMlZ1oj3Nz4bO98CRdzM/RX9PBZEYOFrGlAvQ/d+0nuBZhgMM2+roKfqXxFliciPq4202rc7bNvtA22hcbFjAA85EXsHylHvpvA4aPs7eixvtqEu/L2AAijWg3NJdvMW6j8sWZFh4uIIA+XwFVzoQbu37AFtWcY7LbhVsMwqs1RAcZEX6Yx1n8dZTc35R67k/InSoutgETzRSgWOT2YcWeqUuA3zvASUUvjg3gOQ5s6awHu8Ewsosb93qxFGmlKu/Y4pUi8DA7ydp3uua0jk5Z4GbcoSzGiqo2tOhD8noD47Dt2AA0w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) 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=c5QNsE14SEWnRJh1eICL2iwtYzOTEOQJMd4d1FwW1yg=; b=cJTyF9Dlz5A2IpWIRWDmw74Uu2rsm6XcMlGvVaWIhx0kXxs/z6M8ynkcJHwHG+/XZ0lCxyhGhrhiXo/1o9M2T3nLuhaboof83MfyVaN5P3OjYGCV5phyeD8rvRl2EEhT7H/cFnJzJkw1+9bNybaAsEL8McVjyoO0VIJwaCoWuLUIHECgiR8vRBxbQoZYm4zIL0nd9MwK8JMSard9S/MzZzM2VmJ5AQU0BAR5LhCHznsxN7zpTZ9FC1Dnxq0j8dGiV9eg0KEnwNcdi7xXbFq5xbL4UylHYozCyBamjE+HkIwAszNNfGtJeml7YI5ZNE8lBLyQIwB7y1lx3l2Tu+Prnw== Received: from BN9PR03CA0260.namprd03.prod.outlook.com (2603:10b6:408:ff::25) by LV2PR12MB5752.namprd12.prod.outlook.com (2603:10b6:408:14d::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6064.24; Wed, 1 Feb 2023 07:29:34 +0000 Received: from BN8NAM11FT057.eop-nam11.prod.protection.outlook.com (2603:10b6:408:ff:cafe::3b) by BN9PR03CA0260.outlook.office365.com (2603:10b6:408:ff::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6043.38 via Frontend Transport; Wed, 1 Feb 2023 07:29:34 +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 BN8NAM11FT057.mail.protection.outlook.com (10.13.177.49) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6064.22 via Frontend Transport; Wed, 1 Feb 2023 07:29:33 +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.36; Tue, 31 Jan 2023 23:29:17 -0800 Received: from nvidia.com (10.126.230.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 23:29:14 -0800 From: Alex Vesker To: , , , "Matan Azrad" CC: , Subject: [v2 16/16] net/mlx5/hws: cache definer for reuse Date: Wed, 1 Feb 2023 09:28:15 +0200 Message-ID: <20230201072815.1329101-17-valex@nvidia.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20230201072815.1329101-1-valex@nvidia.com> References: <20230131093346.1261066-1-valex@nvidia.com> <20230201072815.1329101-1-valex@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.230.37] 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: BN8NAM11FT057:EE_|LV2PR12MB5752:EE_ X-MS-Office365-Filtering-Correlation-Id: 78507c83-b630-4aa7-efd7-08db042610c2 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: V1hyg0hgF1NfJ/5VZk3Bzk1SG8iASOOzA8uUQLHsQl2hOBhssqhJNLY098FOHWkRqhsHdKJiDL1gtX8Lu7WhmyO59Cr6uGcJHrtefCUugeWZVOJDqfNnrNJmf3GATMwpWtPDVbZiQJweH8vuxss2J69FCH2fFTW8XREo2SVSa5779JQd1Y4JDzD15UGmJndjGk9E6rL65JkgvIIjPPWVEGxamGrpcWGKGkeVh1GAHKi4H5Csp32cs+4faLj9yK+MA4zpUUfRNVZi5NEGQOyV5RUL8fqPmftaRIPY+LsTtyZDKgd+y6elsIx10y58Bq+Ai40n07SCGSCIgUrkTqUPosRfB4UU9YpK3ObghhVYYF0AjcdgKp57ORpmbos7mzZbT2ZvlxwnX2QXmT3b37FOYPORHRd2pFT7FwgwbUAPOFdAg6fdz7iCnnTlG7lonJsRIaMkmszRY0j7SvkxogdCNi0djpWXlEZSJ6mfmA8+xuduB9BOBqLPDvulemXLviPliLUE/8E6mlWd/ncrjMo1gGD6Q2+S3709njSa0t4yZPBxx2NQurjS3IQtDXG6nxo1/3kZiZWMp28U+LOxTr+POI1L6y2k05rt7YUT8rtGeuYLS4v/2V34tdTfLg0MjErnHd6CJAuzyGqO4ru5WsjIVjjARd3zmzMtdFoemUlsUVn9Y2PgVs1gOVakW3zebQ6FbN9CFkS16u9EOz0K5pnoXg== 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:(13230025)(4636009)(39860400002)(396003)(346002)(376002)(136003)(451199018)(36840700001)(40470700004)(46966006)(2906002)(478600001)(426003)(6636002)(47076005)(54906003)(5660300002)(110136005)(8936002)(316002)(36756003)(55016003)(40480700001)(336012)(70586007)(41300700001)(4326008)(8676002)(70206006)(83380400001)(82310400005)(86362001)(356005)(40460700003)(7696005)(36860700001)(1076003)(2616005)(7636003)(26005)(16526019)(186003)(6286002)(82740400003)(107886003); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Feb 2023 07:29:33.7505 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 78507c83-b630-4aa7-efd7-08db042610c2 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: BN8NAM11FT057.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV2PR12MB5752 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 ed91a0998c..fc6b59dd6b 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