Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18b0362e authored by Yishai Hadas's avatar Yishai Hadas Committed by Doug Ledford
Browse files

RDMA/mlx5: Don't assume that medium blueFlame register exists



User can leave system without medium BlueFlames registers,
however the code assumed that at least one such register exists.

This patch fixes that assumption.

Fixes: c1be5232 ("IB/mlx5: Fix micro UAR allocator")
Reported-by: default avatarRohit Zambre <rzambre@uci.edu>
Signed-off-by: default avatarYishai Hadas <yishaih@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent f9e76ca3
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -484,11 +484,6 @@ static int qp_has_rq(struct ib_qp_init_attr *attr)
	return 1;
}

static int first_med_bfreg(void)
{
	return 1;
}

enum {
	/* this is the first blue flame register in the array of bfregs assigned
	 * to a processes. Since we do not use it for blue flame but rather
@@ -514,6 +509,12 @@ static int num_med_bfreg(struct mlx5_ib_dev *dev,
	return n >= 0 ? n : 0;
}

static int first_med_bfreg(struct mlx5_ib_dev *dev,
			   struct mlx5_bfreg_info *bfregi)
{
	return num_med_bfreg(dev, bfregi) ? 1 : -ENOMEM;
}

static int first_hi_bfreg(struct mlx5_ib_dev *dev,
			  struct mlx5_bfreg_info *bfregi)
{
@@ -541,10 +542,13 @@ static int alloc_high_class_bfreg(struct mlx5_ib_dev *dev,
static int alloc_med_class_bfreg(struct mlx5_ib_dev *dev,
				 struct mlx5_bfreg_info *bfregi)
{
	int minidx = first_med_bfreg();
	int minidx = first_med_bfreg(dev, bfregi);
	int i;

	for (i = first_med_bfreg(); i < first_hi_bfreg(dev, bfregi); i++) {
	if (minidx < 0)
		return minidx;

	for (i = minidx; i < first_hi_bfreg(dev, bfregi); i++) {
		if (bfregi->count[i] < bfregi->count[minidx])
			minidx = i;
		if (!bfregi->count[minidx])