diff options
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mr.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/mr.c b/drivers/net/ethernet/mellanox/mlx4/mr.c index af55b7ce5341..d6a3a392a377 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mr.c +++ b/drivers/net/ethernet/mellanox/mlx4/mr.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <linux/export.h> | 37 | #include <linux/export.h> |
| 38 | #include <linux/slab.h> | 38 | #include <linux/slab.h> |
| 39 | #include <linux/kernel.h> | 39 | #include <linux/kernel.h> |
| 40 | #include <linux/vmalloc.h> | ||
| 40 | 41 | ||
| 41 | #include <linux/mlx4/cmd.h> | 42 | #include <linux/mlx4/cmd.h> |
| 42 | 43 | ||
| @@ -130,8 +131,11 @@ static int mlx4_buddy_init(struct mlx4_buddy *buddy, int max_order) | |||
| 130 | for (i = 0; i <= buddy->max_order; ++i) { | 131 | for (i = 0; i <= buddy->max_order; ++i) { |
| 131 | s = BITS_TO_LONGS(1 << (buddy->max_order - i)); | 132 | s = BITS_TO_LONGS(1 << (buddy->max_order - i)); |
| 132 | buddy->bits[i] = kmalloc(s * sizeof (long), GFP_KERNEL); | 133 | buddy->bits[i] = kmalloc(s * sizeof (long), GFP_KERNEL); |
| 133 | if (!buddy->bits[i]) | 134 | if (!buddy->bits[i]) { |
| 134 | goto err_out_free; | 135 | buddy->bits[i] = vmalloc(s * sizeof(long)); |
| 136 | if (!buddy->bits[i]) | ||
| 137 | goto err_out_free; | ||
| 138 | } | ||
| 135 | bitmap_zero(buddy->bits[i], 1 << (buddy->max_order - i)); | 139 | bitmap_zero(buddy->bits[i], 1 << (buddy->max_order - i)); |
| 136 | } | 140 | } |
| 137 | 141 | ||
| @@ -142,7 +146,10 @@ static int mlx4_buddy_init(struct mlx4_buddy *buddy, int max_order) | |||
| 142 | 146 | ||
| 143 | err_out_free: | 147 | err_out_free: |
| 144 | for (i = 0; i <= buddy->max_order; ++i) | 148 | for (i = 0; i <= buddy->max_order; ++i) |
| 145 | kfree(buddy->bits[i]); | 149 | if (buddy->bits[i] && is_vmalloc_addr(buddy->bits[i])) |
| 150 | vfree(buddy->bits[i]); | ||
| 151 | else | ||
| 152 | kfree(buddy->bits[i]); | ||
| 146 | 153 | ||
| 147 | err_out: | 154 | err_out: |
| 148 | kfree(buddy->bits); | 155 | kfree(buddy->bits); |
| @@ -156,7 +163,10 @@ static void mlx4_buddy_cleanup(struct mlx4_buddy *buddy) | |||
| 156 | int i; | 163 | int i; |
| 157 | 164 | ||
| 158 | for (i = 0; i <= buddy->max_order; ++i) | 165 | for (i = 0; i <= buddy->max_order; ++i) |
| 159 | kfree(buddy->bits[i]); | 166 | if (is_vmalloc_addr(buddy->bits[i])) |
| 167 | vfree(buddy->bits[i]); | ||
| 168 | else | ||
| 169 | kfree(buddy->bits[i]); | ||
| 160 | 170 | ||
| 161 | kfree(buddy->bits); | 171 | kfree(buddy->bits); |
| 162 | kfree(buddy->num_free); | 172 | kfree(buddy->num_free); |
