mlxsw: spectrum_span: Use struct_size() to simplify allocation
authorIdo Schimmel <idosch@mellanox.com>
Thu, 20 Feb 2020 07:07:49 +0000 (09:07 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 20 Feb 2020 18:04:33 +0000 (10:04 -0800)
Allocate the main mirroring struct and the individual structs for the
different mirroring agents in a single allocation.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c

index 4b76f01..aeb2848 100644 (file)
@@ -15,8 +15,8 @@
 #include "spectrum_switchdev.h"
 
 struct mlxsw_sp_span {
-       struct mlxsw_sp_span_entry *entries;
        int entries_count;
+       struct mlxsw_sp_span_entry entries[0];
 };
 
 static u64 mlxsw_sp_span_occ_get(void *priv)
@@ -37,26 +37,18 @@ int mlxsw_sp_span_init(struct mlxsw_sp *mlxsw_sp)
 {
        struct devlink *devlink = priv_to_devlink(mlxsw_sp->core);
        struct mlxsw_sp_span *span;
-       int i, err;
+       int i, entries_count;
 
        if (!MLXSW_CORE_RES_VALID(mlxsw_sp->core, MAX_SPAN))
                return -EIO;
 
-       span = kzalloc(sizeof(*span), GFP_KERNEL);
+       entries_count = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_SPAN);
+       span = kzalloc(struct_size(span, entries, entries_count), GFP_KERNEL);
        if (!span)
                return -ENOMEM;
+       span->entries_count = entries_count;
        mlxsw_sp->span = span;
 
-       mlxsw_sp->span->entries_count = MLXSW_CORE_RES_GET(mlxsw_sp->core,
-                                                          MAX_SPAN);
-       mlxsw_sp->span->entries = kcalloc(mlxsw_sp->span->entries_count,
-                                         sizeof(struct mlxsw_sp_span_entry),
-                                         GFP_KERNEL);
-       if (!mlxsw_sp->span->entries) {
-               err = -ENOMEM;
-               goto err_alloc_span_entries;
-       }
-
        for (i = 0; i < mlxsw_sp->span->entries_count; i++) {
                struct mlxsw_sp_span_entry *curr = &mlxsw_sp->span->entries[i];
 
@@ -68,10 +60,6 @@ int mlxsw_sp_span_init(struct mlxsw_sp *mlxsw_sp)
                                          mlxsw_sp_span_occ_get, mlxsw_sp);
 
        return 0;
-
-err_alloc_span_entries:
-       kfree(span);
-       return err;
 }
 
 void mlxsw_sp_span_fini(struct mlxsw_sp *mlxsw_sp)
@@ -86,7 +74,6 @@ void mlxsw_sp_span_fini(struct mlxsw_sp *mlxsw_sp)
 
                WARN_ON_ONCE(!list_empty(&curr->bound_ports_list));
        }
-       kfree(mlxsw_sp->span->entries);
        kfree(mlxsw_sp->span);
 }