|
@@ -72,35 +72,6 @@ void mlx4_bitmap_free(struct mlx4_bitmap *bitmap, u32 obj)
|
|
|
mlx4_bitmap_free_range(bitmap, obj, 1);
|
|
|
}
|
|
|
|
|
|
-static unsigned long find_aligned_range(unsigned long *bitmap,
|
|
|
- u32 start, u32 nbits,
|
|
|
- int len, int align)
|
|
|
-{
|
|
|
- unsigned long end, i;
|
|
|
-
|
|
|
-again:
|
|
|
- start = ALIGN(start, align);
|
|
|
-
|
|
|
- while ((start < nbits) && test_bit(start, bitmap))
|
|
|
- start += align;
|
|
|
-
|
|
|
- if (start >= nbits)
|
|
|
- return -1;
|
|
|
-
|
|
|
- end = start+len;
|
|
|
- if (end > nbits)
|
|
|
- return -1;
|
|
|
-
|
|
|
- for (i = start + 1; i < end; i++) {
|
|
|
- if (test_bit(i, bitmap)) {
|
|
|
- start = i + 1;
|
|
|
- goto again;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return start;
|
|
|
-}
|
|
|
-
|
|
|
u32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt, int align)
|
|
|
{
|
|
|
u32 obj, i;
|
|
@@ -110,13 +81,13 @@ u32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt, int align)
|
|
|
|
|
|
spin_lock(&bitmap->lock);
|
|
|
|
|
|
- obj = find_aligned_range(bitmap->table, bitmap->last,
|
|
|
- bitmap->max, cnt, align);
|
|
|
+ obj = bitmap_find_next_zero_area(bitmap->table, bitmap->max,
|
|
|
+ bitmap->last, cnt, align - 1);
|
|
|
if (obj >= bitmap->max) {
|
|
|
bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
|
|
|
& bitmap->mask;
|
|
|
- obj = find_aligned_range(bitmap->table, 0, bitmap->max,
|
|
|
- cnt, align);
|
|
|
+ obj = bitmap_find_next_zero_area(bitmap->table, bitmap->max,
|
|
|
+ 0, cnt, align - 1);
|
|
|
}
|
|
|
|
|
|
if (obj < bitmap->max) {
|