| From 5ce2a71bc95607c68de384418f11ddbc86c6ff78 Mon Sep 17 00:00:00 2001 |
| From: Vladyslav Tarasiuk <vladyslavt@mellanox.com> |
| Date: Thu, 26 Dec 2019 10:41:56 +0200 |
| Subject: [PATCH] net/mlxfw: Fix out-of-memory error in mfa2 flash burning |
| |
| commit a5bcd72e054aabb93ddc51ed8cde36a5bfc50271 upstream. |
| |
| The burning process requires to perform internal allocations of large |
| chunks of memory. This memory doesn't need to be contiguous and can be |
| safely allocated by vzalloc() instead of kzalloc(). This patch changes |
| such allocation to avoid possible out-of-memory failure. |
| |
| Fixes: 410ed13cae39 ("Add the mlxfw module for Mellanox firmware flash process") |
| Signed-off-by: Vladyslav Tarasiuk <vladyslavt@mellanox.com> |
| Reviewed-by: Aya Levin <ayal@mellanox.com> |
| Signed-off-by: Leon Romanovsky <leonro@mellanox.com> |
| Tested-by: Ido Schimmel <idosch@mellanox.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2.c b/drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2.c |
| index 544344ac4894..79057af4fe99 100644 |
| --- a/drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2.c |
| +++ b/drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2.c |
| @@ -6,6 +6,7 @@ |
| #include <linux/kernel.h> |
| #include <linux/module.h> |
| #include <linux/netlink.h> |
| +#include <linux/vmalloc.h> |
| #include <linux/xz.h> |
| #include "mlxfw_mfa2.h" |
| #include "mlxfw_mfa2_file.h" |
| @@ -548,7 +549,7 @@ mlxfw_mfa2_file_component_get(const struct mlxfw_mfa2_file *mfa2_file, |
| comp_size = be32_to_cpu(comp->size); |
| comp_buf_size = comp_size + mlxfw_mfa2_comp_magic_len; |
| |
| - comp_data = kmalloc(sizeof(*comp_data) + comp_buf_size, GFP_KERNEL); |
| + comp_data = vzalloc(sizeof(*comp_data) + comp_buf_size); |
| if (!comp_data) |
| return ERR_PTR(-ENOMEM); |
| comp_data->comp.data_size = comp_size; |
| @@ -570,7 +571,7 @@ mlxfw_mfa2_file_component_get(const struct mlxfw_mfa2_file *mfa2_file, |
| comp_data->comp.data = comp_data->buff + mlxfw_mfa2_comp_magic_len; |
| return &comp_data->comp; |
| err_out: |
| - kfree(comp_data); |
| + vfree(comp_data); |
| return ERR_PTR(err); |
| } |
| |
| @@ -579,7 +580,7 @@ void mlxfw_mfa2_file_component_put(struct mlxfw_mfa2_component *comp) |
| const struct mlxfw_mfa2_comp_data *comp_data; |
| |
| comp_data = container_of(comp, struct mlxfw_mfa2_comp_data, comp); |
| - kfree(comp_data); |
| + vfree(comp_data); |
| } |
| |
| void mlxfw_mfa2_file_fini(struct mlxfw_mfa2_file *mfa2_file) |
| -- |
| 2.7.4 |
| |