return n;
}
+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
+ * regular 64 bit doorbells, we do not need a lock for maintaiing
+ * "odd/even" order
+ */
+ NUM_NON_BLUE_FLAME_BFREGS = 1,
+};
+
static int num_med_bfreg(struct mlx5_bfreg_info *bfregi)
{
int n;
n = bfregi->num_uars * MLX5_NON_FP_BFREGS_PER_UAR -
- bfregi->num_low_latency_bfregs - 1;
+ bfregi->num_low_latency_bfregs - NUM_NON_BLUE_FLAME_BFREGS;
return n >= 0 ? n : 0;
}
static int first_hi_bfreg(struct mlx5_bfreg_info *bfregi)
{
int med;
- int i;
- int t;
med = num_med_bfreg(bfregi);
- for (t = 0, i = first_med_bfreg();; i = next_bfreg(i)) {
- t++;
- if (t == med)
- return next_bfreg(i);
- }
-
- return 0;
+ return next_bfreg(med);
}
static int alloc_high_class_bfreg(struct mlx5_bfreg_info *bfregi)
for (i = first_med_bfreg(); i < first_hi_bfreg(bfregi); i = next_bfreg(i)) {
if (bfregi->count[i] < bfregi->count[minidx])
minidx = i;
+ if (!bfregi->count[minidx])
+ break;
}
bfregi->count[minidx]++;
mutex_lock(&bfregi->lock);
switch (lat) {
case MLX5_IB_LATENCY_CLASS_LOW:
+ BUILD_BUG_ON(NUM_NON_BLUE_FLAME_BFREGS != 1);
bfregn = 0;
bfregi->count[bfregn]++;
break;