Lines Matching refs:buddy
42 struct mthca_buddy *buddy;
84 static u32 mthca_buddy_alloc(struct mthca_buddy *buddy, int order)
90 spin_lock(&buddy->lock);
92 for (o = order; o <= buddy->max_order; ++o)
93 if (buddy->num_free[o]) {
94 m = 1 << (buddy->max_order - o);
95 seg = find_first_bit(buddy->bits[o], m);
100 spin_unlock(&buddy->lock);
104 clear_bit(seg, buddy->bits[o]);
105 --buddy->num_free[o];
110 set_bit(seg ^ 1, buddy->bits[o]);
111 ++buddy->num_free[o];
114 spin_unlock(&buddy->lock);
121 static void mthca_buddy_free(struct mthca_buddy *buddy, u32 seg, int order)
125 spin_lock(&buddy->lock);
127 while (test_bit(seg ^ 1, buddy->bits[order])) {
128 clear_bit(seg ^ 1, buddy->bits[order]);
129 --buddy->num_free[order];
134 set_bit(seg, buddy->bits[order]);
135 ++buddy->num_free[order];
137 spin_unlock(&buddy->lock);
140 static int mthca_buddy_init(struct mthca_buddy *buddy, int max_order)
144 buddy->max_order = max_order;
145 spin_lock_init(&buddy->lock);
147 buddy->bits = kcalloc(buddy->max_order + 1, sizeof(long *),
149 buddy->num_free = kcalloc((buddy->max_order + 1), sizeof *buddy->num_free,
151 if (!buddy->bits || !buddy->num_free)
154 for (i = 0; i <= buddy->max_order; ++i) {
155 s = BITS_TO_LONGS(1 << (buddy->max_order - i));
156 buddy->bits[i] = kmalloc_array(s, sizeof(long), GFP_KERNEL);
157 if (!buddy->bits[i])
159 bitmap_zero(buddy->bits[i],
160 1 << (buddy->max_order - i));
163 set_bit(0, buddy->bits[buddy->max_order]);
164 buddy->num_free[buddy->max_order] = 1;
169 for (i = 0; i <= buddy->max_order; ++i)
170 kfree(buddy->bits[i]);
173 kfree(buddy->bits);
174 kfree(buddy->num_free);
179 static void mthca_buddy_cleanup(struct mthca_buddy *buddy)
183 for (i = 0; i <= buddy->max_order; ++i)
184 kfree(buddy->bits[i]);
186 kfree(buddy->bits);
187 kfree(buddy->num_free);
191 struct mthca_buddy *buddy)
193 u32 seg = mthca_buddy_alloc(buddy, order);
201 mthca_buddy_free(buddy, seg, order);
209 struct mthca_buddy *buddy)
221 mtt->buddy = buddy;
226 mtt->first_seg = mthca_alloc_mtt_range(dev, mtt->order, buddy);
245 mthca_buddy_free(mtt->buddy, mtt->first_seg, mtt->order);