Lines Matching refs:buddy

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