Lines Matching defs:buddy

46 static u32 mlx4_buddy_alloc(struct mlx4_buddy *buddy, int order)
52 spin_lock(&buddy->lock);
54 for (o = order; o <= buddy->max_order; ++o)
55 if (buddy->num_free[o]) {
56 m = 1 << (buddy->max_order - o);
57 seg = find_first_bit(buddy->bits[o], m);
62 spin_unlock(&buddy->lock);
66 clear_bit(seg, buddy->bits[o]);
67 --buddy->num_free[o];
72 set_bit(seg ^ 1, buddy->bits[o]);
73 ++buddy->num_free[o];
76 spin_unlock(&buddy->lock);
83 static void mlx4_buddy_free(struct mlx4_buddy *buddy, u32 seg, int order)
87 spin_lock(&buddy->lock);
89 while (test_bit(seg ^ 1, buddy->bits[order])) {
90 clear_bit(seg ^ 1, buddy->bits[order]);
91 --buddy->num_free[order];
96 set_bit(seg, buddy->bits[order]);
97 ++buddy->num_free[order];
99 spin_unlock(&buddy->lock);
102 static int mlx4_buddy_init(struct mlx4_buddy *buddy, int max_order)
106 buddy->max_order = max_order;
107 spin_lock_init(&buddy->lock);
109 buddy->bits = kcalloc(buddy->max_order + 1, sizeof(long *),
111 buddy->num_free = kcalloc(buddy->max_order + 1, sizeof(*buddy->num_free),
113 if (!buddy->bits || !buddy->num_free)
116 for (i = 0; i <= buddy->max_order; ++i) {
117 s = BITS_TO_LONGS(1UL << (buddy->max_order - i));
118 buddy->bits[i] = kvmalloc_array(s, sizeof(long), GFP_KERNEL | __GFP_ZERO);
119 if (!buddy->bits[i])
123 set_bit(0, buddy->bits[buddy->max_order]);
124 buddy->num_free[buddy->max_order] = 1;
129 for (i = 0; i <= buddy->max_order; ++i)
130 kvfree(buddy->bits[i]);
133 kfree(buddy->bits);
134 kfree(buddy->num_free);
139 static void mlx4_buddy_cleanup(struct mlx4_buddy *buddy)
143 for (i = 0; i <= buddy->max_order; ++i)
144 kvfree(buddy->bits[i]);
146 kfree(buddy->bits);
147 kfree(buddy->num_free);