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 buddy->bits[i] = bitmap_zalloc(1 << (buddy->max_order - i),
157 if (!buddy->bits[i])
161 __set_bit(0, buddy->bits[buddy->max_order]);
162 buddy->num_free[buddy->max_order] = 1;
167 for (i = 0; i <= buddy->max_order; ++i)
168 bitmap_free(buddy->bits[i]);
171 kfree(buddy->bits);
172 kfree(buddy->num_free);
177 static void mthca_buddy_cleanup(struct mthca_buddy *buddy)
181 for (i = 0; i <= buddy->max_order; ++i)
182 bitmap_free(buddy->bits[i]);
184 kfree(buddy->bits);
185 kfree(buddy->num_free);
189 struct mthca_buddy *buddy)
191 u32 seg = mthca_buddy_alloc(buddy, order);
199 mthca_buddy_free(buddy, seg, order);
207 struct mthca_buddy *buddy)
219 mtt->buddy = buddy;
224 mtt->first_seg = mthca_alloc_mtt_range(dev, mtt->order, buddy);
243 mthca_buddy_free(mtt->buddy, mtt->first_seg, mtt->order);