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(1 << (buddy->max_order - i)); in mlx4_buddy_init()
118 buddy->bits[i] = kcalloc(s, sizeof (long), GFP_KERNEL | __GFP_NOWARN); in mlx4_buddy_init()
119 if (!buddy->bits[i]) { in mlx4_buddy_init()
120 buddy->bits[i] = vzalloc(s * sizeof(long)); in mlx4_buddy_init()
121 if (!buddy->bits[i]) in mlx4_buddy_init()
126 set_bit(0, buddy->bits[buddy->max_order]); in mlx4_buddy_init()
127 buddy->num_free[buddy->max_order] = 1; in mlx4_buddy_init()
132 for (i = 0; i <= buddy->max_order; ++i) in mlx4_buddy_init()
133 kvfree(buddy->bits[i]); in mlx4_buddy_init()
136 kfree(buddy->bits); in mlx4_buddy_init()
137 kfree(buddy->num_free); in mlx4_buddy_init()
142 static void mlx4_buddy_cleanup(struct mlx4_buddy *buddy) in mlx4_buddy_cleanup() argument
146 for (i = 0; i <= buddy->max_order; ++i) in mlx4_buddy_cleanup()
147 kvfree(buddy->bits[i]); in mlx4_buddy_cleanup()
149 kfree(buddy->bits); in mlx4_buddy_cleanup()
150 kfree(buddy->num_free); in mlx4_buddy_cleanup()