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 mlxsw_sp_port *mlxsw_sp_port;
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
bool usable;
|
bool usable;
|
||||||
|
size_t bytes;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
dev = alloc_etherdev(sizeof(struct mlxsw_sp_port));
|
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->learning_sync = 1;
|
||||||
mlxsw_sp_port->uc_flood = 1;
|
mlxsw_sp_port->uc_flood = 1;
|
||||||
mlxsw_sp_port->pvid = 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 =
|
mlxsw_sp_port->pcpu_stats =
|
||||||
netdev_alloc_pcpu_stats(struct mlxsw_sp_port_pcpu_stats);
|
netdev_alloc_pcpu_stats(struct mlxsw_sp_port_pcpu_stats);
|
||||||
@ -1359,6 +1366,8 @@ err_port_module_check:
|
|||||||
err_dev_addr_init:
|
err_dev_addr_init:
|
||||||
free_percpu(mlxsw_sp_port->pcpu_stats);
|
free_percpu(mlxsw_sp_port->pcpu_stats);
|
||||||
err_alloc_stats:
|
err_alloc_stats:
|
||||||
|
kfree(mlxsw_sp_port->active_vlans);
|
||||||
|
err_port_active_vlans_alloc:
|
||||||
free_netdev(dev);
|
free_netdev(dev);
|
||||||
return err;
|
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 */
|
unregister_netdev(mlxsw_sp_port->dev); /* This calls ndo_stop */
|
||||||
mlxsw_sp_port_switchdev_fini(mlxsw_sp_port);
|
mlxsw_sp_port_switchdev_fini(mlxsw_sp_port);
|
||||||
free_percpu(mlxsw_sp_port->pcpu_stats);
|
free_percpu(mlxsw_sp_port->pcpu_stats);
|
||||||
|
kfree(mlxsw_sp_port->active_vlans);
|
||||||
free_netdev(mlxsw_sp_port->dev);
|
free_netdev(mlxsw_sp_port->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ struct mlxsw_sp_port {
|
|||||||
u16 pvid;
|
u16 pvid;
|
||||||
u16 lag_id;
|
u16 lag_id;
|
||||||
/* 802.1Q bridge VLANs */
|
/* 802.1Q bridge VLANs */
|
||||||
unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
|
unsigned long *active_vlans;
|
||||||
/* VLAN interfaces */
|
/* VLAN interfaces */
|
||||||
unsigned long active_vfids[BITS_TO_LONGS(VLAN_N_VID)];
|
unsigned long active_vfids[BITS_TO_LONGS(VLAN_N_VID)];
|
||||||
u16 nr_vfids;
|
u16 nr_vfids;
|
||||||
|
Loading…
Reference in New Issue
Block a user