mirror of https://gitee.com/openkylin/linux.git
mlxsw: spectrum: Allocate active VLANs only for port netdevs
When adding support for bridges between VLAN interfaces, we'll introduce a new entity called a vPort, which is a represntation of the VLAN interface in the hardware. The main difference between a vPort and a physical port is that several FIDs can be bound to the latter, whereas only one (called a vFID) can be bound to the first. Therefore, it makes sense to use the same struct to represent the two, but to only allocate the 'active_vlans' bitmap in case of a physical port. Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6ff64f6f92
commit
bd40e9d6d5
|
@ -1245,6 +1245,7 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port)
|
|||
struct mlxsw_sp_port *mlxsw_sp_port;
|
||||
struct net_device *dev;
|
||||
bool usable;
|
||||
size_t bytes;
|
||||
int err;
|
||||
|
||||
dev = alloc_etherdev(sizeof(struct mlxsw_sp_port));
|
||||
|
@ -1258,6 +1259,12 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port)
|
|||
mlxsw_sp_port->learning_sync = 1;
|
||||
mlxsw_sp_port->uc_flood = 1;
|
||||
mlxsw_sp_port->pvid = 1;
|
||||
bytes = DIV_ROUND_UP(VLAN_N_VID, BITS_PER_BYTE);
|
||||
mlxsw_sp_port->active_vlans = kzalloc(bytes, GFP_KERNEL);
|
||||
if (!mlxsw_sp_port->active_vlans) {
|
||||
err = -ENOMEM;
|
||||
goto err_port_active_vlans_alloc;
|
||||
}
|
||||
|
||||
mlxsw_sp_port->pcpu_stats =
|
||||
netdev_alloc_pcpu_stats(struct mlxsw_sp_port_pcpu_stats);
|
||||
|
@ -1359,6 +1366,8 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port)
|
|||
err_dev_addr_init:
|
||||
free_percpu(mlxsw_sp_port->pcpu_stats);
|
||||
err_alloc_stats:
|
||||
kfree(mlxsw_sp_port->active_vlans);
|
||||
err_port_active_vlans_alloc:
|
||||
free_netdev(dev);
|
||||
return err;
|
||||
}
|
||||
|
@ -1381,6 +1390,7 @@ static void mlxsw_sp_port_remove(struct mlxsw_sp *mlxsw_sp, u8 local_port)
|
|||
unregister_netdev(mlxsw_sp_port->dev); /* This calls ndo_stop */
|
||||
mlxsw_sp_port_switchdev_fini(mlxsw_sp_port);
|
||||
free_percpu(mlxsw_sp_port->pcpu_stats);
|
||||
kfree(mlxsw_sp_port->active_vlans);
|
||||
free_netdev(mlxsw_sp_port->dev);
|
||||
}
|
||||
|
||||
|
|
|
@ -103,7 +103,7 @@ struct mlxsw_sp_port {
|
|||
u16 pvid;
|
||||
u16 lag_id;
|
||||
/* 802.1Q bridge VLANs */
|
||||
unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
|
||||
unsigned long *active_vlans;
|
||||
/* VLAN interfaces */
|
||||
unsigned long active_vfids[BITS_TO_LONGS(VLAN_N_VID)];
|
||||
u16 nr_vfids;
|
||||
|
|
Loading…
Reference in New Issue