Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 105651
b: refs/heads/master
c: e4044cf
h: refs/heads/master
i:
  105649: ac8b45b
  105647: c451939
v: v3
  • Loading branch information
Roland Dreier committed Jul 22, 2008
1 parent dfe4013 commit b7f5c50
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 899698dad72340b562478b8b770317f2f0fe0c09
refs/heads/master: e4044cfc493338cd09870bd45dc646336bb66e9f
1 change: 1 addition & 0 deletions trunk/drivers/net/mlx4/mlx4.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ struct mlx4_bitmap {

struct mlx4_buddy {
unsigned long **bits;
unsigned int *num_free;
int max_order;
spinlock_t lock;
};
Expand Down
26 changes: 18 additions & 8 deletions trunk/drivers/net/mlx4/mr.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,23 +79,26 @@ static u32 mlx4_buddy_alloc(struct mlx4_buddy *buddy, int order)

spin_lock(&buddy->lock);

for (o = order; o <= buddy->max_order; ++o) {
m = 1 << (buddy->max_order - o);
seg = find_first_bit(buddy->bits[o], m);
if (seg < m)
goto found;
}
for (o = order; o <= buddy->max_order; ++o)
if (buddy->num_free[o]) {
m = 1 << (buddy->max_order - o);
seg = find_first_bit(buddy->bits[o], m);
if (seg < m)
goto found;
}

spin_unlock(&buddy->lock);
return -1;

found:
clear_bit(seg, buddy->bits[o]);
--buddy->num_free[o];

while (o > order) {
--o;
seg <<= 1;
set_bit(seg ^ 1, buddy->bits[o]);
++buddy->num_free[o];
}

spin_unlock(&buddy->lock);
Expand All @@ -113,11 +116,13 @@ static void mlx4_buddy_free(struct mlx4_buddy *buddy, u32 seg, int order)

while (test_bit(seg ^ 1, buddy->bits[order])) {
clear_bit(seg ^ 1, buddy->bits[order]);
--buddy->num_free[order];
seg >>= 1;
++order;
}

set_bit(seg, buddy->bits[order]);
++buddy->num_free[order];

spin_unlock(&buddy->lock);
}
Expand All @@ -131,7 +136,9 @@ static int mlx4_buddy_init(struct mlx4_buddy *buddy, int max_order)

buddy->bits = kzalloc((buddy->max_order + 1) * sizeof (long *),
GFP_KERNEL);
if (!buddy->bits)
buddy->num_free = kzalloc((buddy->max_order + 1) * sizeof (int *),
GFP_KERNEL);
if (!buddy->bits || !buddy->num_free)
goto err_out;

for (i = 0; i <= buddy->max_order; ++i) {
Expand All @@ -143,16 +150,18 @@ static int mlx4_buddy_init(struct mlx4_buddy *buddy, int max_order)
}

set_bit(0, buddy->bits[buddy->max_order]);
buddy->num_free[buddy->max_order] = 1;

return 0;

err_out_free:
for (i = 0; i <= buddy->max_order; ++i)
kfree(buddy->bits[i]);

err_out:
kfree(buddy->bits);
kfree(buddy->num_free);

err_out:
return -ENOMEM;
}

Expand All @@ -164,6 +173,7 @@ static void mlx4_buddy_cleanup(struct mlx4_buddy *buddy)
kfree(buddy->bits[i]);

kfree(buddy->bits);
kfree(buddy->num_free);
}

static u32 mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order)
Expand Down

0 comments on commit b7f5c50

Please sign in to comment.