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