diff options
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c index 7b12acf210f8..a0d0da35578c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c | |||
@@ -181,6 +181,7 @@ static int give_pages(struct mlx5_core_dev *dev, u16 func_id, int npages, | |||
181 | { | 181 | { |
182 | struct mlx5_manage_pages_inbox *in; | 182 | struct mlx5_manage_pages_inbox *in; |
183 | struct mlx5_manage_pages_outbox out; | 183 | struct mlx5_manage_pages_outbox out; |
184 | struct mlx5_manage_pages_inbox *nin; | ||
184 | struct page *page; | 185 | struct page *page; |
185 | int inlen; | 186 | int inlen; |
186 | u64 addr; | 187 | u64 addr; |
@@ -247,13 +248,20 @@ static int give_pages(struct mlx5_core_dev *dev, u16 func_id, int npages, | |||
247 | 248 | ||
248 | out_alloc: | 249 | out_alloc: |
249 | if (notify_fail) { | 250 | if (notify_fail) { |
250 | memset(in, 0, inlen); | 251 | nin = kzalloc(sizeof(*nin), GFP_KERNEL); |
252 | if (!nin) { | ||
253 | mlx5_core_warn(dev, "allocation failed\n"); | ||
254 | goto unmap; | ||
255 | } | ||
251 | memset(&out, 0, sizeof(out)); | 256 | memset(&out, 0, sizeof(out)); |
252 | in->hdr.opcode = cpu_to_be16(MLX5_CMD_OP_MANAGE_PAGES); | 257 | nin->hdr.opcode = cpu_to_be16(MLX5_CMD_OP_MANAGE_PAGES); |
253 | in->hdr.opmod = cpu_to_be16(MLX5_PAGES_CANT_GIVE); | 258 | nin->hdr.opmod = cpu_to_be16(MLX5_PAGES_CANT_GIVE); |
254 | if (mlx5_cmd_exec(dev, in, sizeof(*in), &out, sizeof(out))) | 259 | if (mlx5_cmd_exec(dev, nin, sizeof(*nin), &out, sizeof(out))) |
255 | mlx5_core_warn(dev, "\n"); | 260 | mlx5_core_warn(dev, "page notify failed\n"); |
261 | kfree(nin); | ||
256 | } | 262 | } |
263 | |||
264 | unmap: | ||
257 | for (i--; i >= 0; i--) { | 265 | for (i--; i >= 0; i--) { |
258 | addr = be64_to_cpu(in->pas[i]); | 266 | addr = be64_to_cpu(in->pas[i]); |
259 | page = remove_page(dev, addr); | 267 | page = remove_page(dev, addr); |