Lines Matching refs:buddy

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