• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-13-stable/sys/dev/mlx4/mlx4_core/

Lines Matching refs:buddy

49 static u32 mlx4_buddy_alloc(struct mlx4_buddy *buddy, int order)
55 spin_lock(&buddy->lock);
57 for (o = order; o <= buddy->max_order; ++o)
58 if (buddy->num_free[o]) {
59 m = 1 << (buddy->max_order - o);
60 seg = find_first_bit(buddy->bits[o], m);
65 spin_unlock(&buddy->lock);
69 clear_bit(seg, buddy->bits[o]);
70 --buddy->num_free[o];
75 set_bit(seg ^ 1, buddy->bits[o]);
76 ++buddy->num_free[o];
79 spin_unlock(&buddy->lock);
86 static void mlx4_buddy_free(struct mlx4_buddy *buddy, u32 seg, int order)
90 spin_lock(&buddy->lock);
92 while (test_bit(seg ^ 1, buddy->bits[order])) {
93 clear_bit(seg ^ 1, buddy->bits[order]);
94 --buddy->num_free[order];
99 set_bit(seg, buddy->bits[order]);
100 ++buddy->num_free[order];
102 spin_unlock(&buddy->lock);
105 static int mlx4_buddy_init(struct mlx4_buddy *buddy, int max_order)
109 buddy->max_order = max_order;
110 spin_lock_init(&buddy->lock);
112 buddy->bits = kcalloc(buddy->max_order + 1, sizeof (long *),
114 buddy->num_free = kcalloc((buddy->max_order + 1), sizeof *buddy->num_free,
116 if (!buddy->bits || !buddy->num_free)
119 for (i = 0; i <= buddy->max_order; ++i) {
120 s = BITS_TO_LONGS(1 << (buddy->max_order - i));
121 buddy->bits[i] = kcalloc(s, sizeof (long), GFP_KERNEL | __GFP_NOWARN);
122 if (!buddy->bits[i]) {
123 buddy->bits[i] = vzalloc(s * sizeof(long));
124 if (!buddy->bits[i])
129 set_bit(0, buddy->bits[buddy->max_order]);
130 buddy->num_free[buddy->max_order] = 1;
135 for (i = 0; i <= buddy->max_order; ++i)
136 kvfree(buddy->bits[i]);
139 kfree(buddy->bits);
140 kfree(buddy->num_free);
145 static void mlx4_buddy_cleanup(struct mlx4_buddy *buddy)
149 for (i = 0; i <= buddy->max_order; ++i)
150 kvfree(buddy->bits[i]);
152 kfree(buddy->bits);
153 kfree(buddy->num_free);