92 lines
2.7 KiB
Diff
92 lines
2.7 KiB
Diff
From 169d050bc82a519fdc28f83bb685d86804383f0b Mon Sep 17 00:00:00 2001
|
|
From: Greg Inozemtsev <greg@purestorage.com>
|
|
Date: Tue, 27 Oct 2020 11:24:30 -0700
|
|
Subject: [PATCH] Fix cmd_fd leak in mlx5_alloc_context
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
The alloc_context function is supposed to take ownership of cmd_fd
|
|
and close it if it fails and returns NULL. This was not done in
|
|
early exit error paths from mlx5_init_context (called from mlx5_alloc_context).
|
|
|
|
Fixes: cb3be404fadc (“mlx5: Refactor mlx5_alloc_context()”)
|
|
Signed-off-by: Greg Inozemtsev <greg@purestorage.com>
|
|
---
|
|
providers/mlx5/mlx5.c | 28 ++++++++++++++--------------
|
|
1 file changed, 14 insertions(+), 14 deletions(-)
|
|
|
|
diff --git a/providers/mlx5/mlx5.c b/providers/mlx5/mlx5.c
|
|
index 0a091f5b6b49..551560d561fe 100644
|
|
--- a/providers/mlx5/mlx5.c
|
|
+++ b/providers/mlx5/mlx5.c
|
|
@@ -1334,25 +1334,14 @@ static void mlx5_uninit_context(struct mlx5_context *context)
|
|
}
|
|
|
|
static struct mlx5_context *mlx5_init_context(struct ibv_device *ibdev,
|
|
- int cmd_fd,
|
|
- void *private_data)
|
|
+ int cmd_fd)
|
|
{
|
|
- struct mlx5dv_context_attr *ctx_attr = private_data;
|
|
struct mlx5_device *mdev = to_mdev(ibdev);
|
|
struct mlx5_context *context;
|
|
int low_lat_uuars;
|
|
int tot_uuars;
|
|
int ret;
|
|
|
|
- if (ctx_attr && ctx_attr->comp_mask) {
|
|
- errno = EINVAL;
|
|
- return NULL;
|
|
- }
|
|
-
|
|
- ret = get_uar_info(mdev, &tot_uuars, &low_lat_uuars);
|
|
- if (ret)
|
|
- return NULL;
|
|
-
|
|
context = verbs_init_and_alloc_context(ibdev, cmd_fd, context, ibv_ctx,
|
|
RDMA_DRIVER_MLX5);
|
|
if (!context)
|
|
@@ -1365,6 +1354,12 @@ static struct mlx5_context *mlx5_init_context(struct ibv_device *ibdev,
|
|
strcpy(context->hostname, "host_unknown");
|
|
|
|
mlx5_single_threaded = single_threaded_app();
|
|
+
|
|
+ ret = get_uar_info(mdev, &tot_uuars, &low_lat_uuars);
|
|
+ if (ret) {
|
|
+ mlx5_uninit_context(context);
|
|
+ return NULL;
|
|
+ }
|
|
context->tot_uuars = tot_uuars;
|
|
context->low_lat_uuars = low_lat_uuars;
|
|
|
|
@@ -1569,10 +1564,15 @@ static struct verbs_context *mlx5_alloc_context(struct ibv_device *ibdev,
|
|
bool always_devx = false;
|
|
int ret;
|
|
|
|
- context = mlx5_init_context(ibdev, cmd_fd, NULL);
|
|
+ context = mlx5_init_context(ibdev, cmd_fd);
|
|
if (!context)
|
|
return NULL;
|
|
|
|
+ if (ctx_attr && ctx_attr->comp_mask) {
|
|
+ errno = EINVAL;
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
req.total_num_bfregs = context->tot_uuars;
|
|
req.num_low_latency_bfregs = context->low_lat_uuars;
|
|
req.max_cqe_version = MLX5_CQE_VERSION_V1;
|
|
@@ -1627,7 +1627,7 @@ static struct verbs_context *mlx5_import_context(struct ibv_device *ibdev,
|
|
struct mlx5_context *mctx;
|
|
int ret;
|
|
|
|
- mctx = mlx5_init_context(ibdev, cmd_fd, NULL);
|
|
+ mctx = mlx5_init_context(ibdev, cmd_fd);
|
|
if (!mctx)
|
|
return NULL;
|
|
|
|
--
|
|
2.25.4
|
|
|