aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/mlx4/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/mlx4/alloc.c')
-rw-r--r--drivers/net/mlx4/alloc.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/drivers/net/mlx4/alloc.c b/drivers/net/mlx4/alloc.c
index e6c0d5bb5dc..e2bc7ecf162 100644
--- a/drivers/net/mlx4/alloc.c
+++ b/drivers/net/mlx4/alloc.c
@@ -47,13 +47,16 @@ u32 mlx4_bitmap_alloc(struct mlx4_bitmap *bitmap)
47 47
48 obj = find_next_zero_bit(bitmap->table, bitmap->max, bitmap->last); 48 obj = find_next_zero_bit(bitmap->table, bitmap->max, bitmap->last);
49 if (obj >= bitmap->max) { 49 if (obj >= bitmap->max) {
50 bitmap->top = (bitmap->top + bitmap->max) & bitmap->mask; 50 bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
51 & bitmap->mask;
51 obj = find_first_zero_bit(bitmap->table, bitmap->max); 52 obj = find_first_zero_bit(bitmap->table, bitmap->max);
52 } 53 }
53 54
54 if (obj < bitmap->max) { 55 if (obj < bitmap->max) {
55 set_bit(obj, bitmap->table); 56 set_bit(obj, bitmap->table);
56 bitmap->last = (obj + 1) & (bitmap->max - 1); 57 bitmap->last = (obj + 1);
58 if (bitmap->last == bitmap->max)
59 bitmap->last = 0;
57 obj |= bitmap->top; 60 obj |= bitmap->top;
58 } else 61 } else
59 obj = -1; 62 obj = -1;
@@ -109,9 +112,9 @@ u32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt, int align)
109 obj = find_aligned_range(bitmap->table, bitmap->last, 112 obj = find_aligned_range(bitmap->table, bitmap->last,
110 bitmap->max, cnt, align); 113 bitmap->max, cnt, align);
111 if (obj >= bitmap->max) { 114 if (obj >= bitmap->max) {
112 bitmap->top = (bitmap->top + bitmap->max) & bitmap->mask; 115 bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
113 obj = find_aligned_range(bitmap->table, 0, 116 & bitmap->mask;
114 bitmap->max, 117 obj = find_aligned_range(bitmap->table, 0, bitmap->max,
115 cnt, align); 118 cnt, align);
116 } 119 }
117 120
@@ -136,17 +139,19 @@ void mlx4_bitmap_free_range(struct mlx4_bitmap *bitmap, u32 obj, int cnt)
136{ 139{
137 u32 i; 140 u32 i;
138 141
139 obj &= bitmap->max - 1; 142 obj &= bitmap->max + bitmap->reserved_top - 1;
140 143
141 spin_lock(&bitmap->lock); 144 spin_lock(&bitmap->lock);
142 for (i = 0; i < cnt; i++) 145 for (i = 0; i < cnt; i++)
143 clear_bit(obj + i, bitmap->table); 146 clear_bit(obj + i, bitmap->table);
144 bitmap->last = min(bitmap->last, obj); 147 bitmap->last = min(bitmap->last, obj);
145 bitmap->top = (bitmap->top + bitmap->max) & bitmap->mask; 148 bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
149 & bitmap->mask;
146 spin_unlock(&bitmap->lock); 150 spin_unlock(&bitmap->lock);
147} 151}
148 152
149int mlx4_bitmap_init(struct mlx4_bitmap *bitmap, u32 num, u32 mask, u32 reserved) 153int mlx4_bitmap_init(struct mlx4_bitmap *bitmap, u32 num, u32 mask,
154 u32 reserved_bot, u32 reserved_top)
150{ 155{
151 int i; 156 int i;
152 157
@@ -156,14 +161,16 @@ int mlx4_bitmap_init(struct mlx4_bitmap *bitmap, u32 num, u32 mask, u32 reserved
156 161
157 bitmap->last = 0; 162 bitmap->last = 0;
158 bitmap->top = 0; 163 bitmap->top = 0;
159 bitmap->max = num; 164 bitmap->max = num - reserved_top;
160 bitmap->mask = mask; 165 bitmap->mask = mask;
166 bitmap->reserved_top = reserved_top;
161 spin_lock_init(&bitmap->lock); 167 spin_lock_init(&bitmap->lock);
162 bitmap->table = kzalloc(BITS_TO_LONGS(num) * sizeof (long), GFP_KERNEL); 168 bitmap->table = kzalloc(BITS_TO_LONGS(bitmap->max) *
169 sizeof (long), GFP_KERNEL);
163 if (!bitmap->table) 170 if (!bitmap->table)
164 return -ENOMEM; 171 return -ENOMEM;
165 172
166 for (i = 0; i < reserved; ++i) 173 for (i = 0; i < reserved_bot; ++i)
167 set_bit(i, bitmap->table); 174 set_bit(i, bitmap->table);
168 175
169 return 0; 176 return 0;