aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox/mlx4/mr.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/mr.c')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mr.c18
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
143err_out_free: 147err_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
147err_out: 154err_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);