RE: [PATCH net-next 06/10] net/mlx4_core: Dynamically allocate structs at mlx4_slave_cap
From: David Laight <hidden>
Date: 2016-11-28 15:28:35
From: Tariq Toukan
quoted hunk ↗ jump to hunk
Sent: 27 November 2016 15:51 From: Eran Ben Elisha <redacted> In order to avoid temporary large structs on the stack, allocate them dynamically. Signed-off-by: Eran Ben Elisha <redacted> Signed-off-by: Tal Alon <redacted> Signed-off-by: Tariq Toukan <redacted> --- drivers/net/ethernet/mellanox/mlx4/main.c | 244 +++++++++++++++++------------- 1 file changed, 142 insertions(+), 102 deletions(-)diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 4a9497e9778d..65502df9fd96 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c@@ -799,40 +799,117 @@ static void slave_adjust_steering_mode(struct mlx4_dev *dev,
...
+static int mlx4_slave_special_qp_cap(struct mlx4_dev *dev)
+{
+ struct mlx4_func_cap *func_cap = NULL;
+ int i, err = 0;
+
+ func_cap = kzalloc(sizeof(*func_cap), GFP_KERNEL);
+ dev->caps.qp0_qkey = kcalloc(dev->caps.num_ports,
+ sizeof(u32), GFP_KERNEL);
+ dev->caps.qp0_tunnel = kcalloc(dev->caps.num_ports,
+ sizeof(u32), GFP_KERNEL);
+ dev->caps.qp0_proxy = kcalloc(dev->caps.num_ports,
+ sizeof(u32), GFP_KERNEL);
+ dev->caps.qp1_tunnel = kcalloc(dev->caps.num_ports,
+ sizeof(u32), GFP_KERNEL);
+ dev->caps.qp1_proxy = kcalloc(dev->caps.num_ports,
+ sizeof(u32), GFP_KERNEL);...
It has to be better to allocate a single piece of memory.
Potentially using a structure something like:
struct fubar {
struct mlx4_func_cap func_cap;
struct {
u32 qp0_qkey;
u32 qp0_tunnel;
u32 qp0_proxy;
u32 qp1_tunnel;
u32 qp1_proxy;
} port_info[];
};
David