Commit ff8ee11e authored by MD Danish Anwar's avatar MD Danish Anwar Committed by David S. Miller

net: ti: icssg-prueth: Fix race condition for VLAN table access

The VLAN table is a shared memory between the two ports/slices
in a ICSSG cluster and this may lead to race condition when the
common code paths for both ports are executed in different CPUs.

Fix the race condition access by locking the shared memory access

Fixes: 487f7323 ("net: ti: icssg-prueth: Add helper functions to configure FDB")
Signed-off-by: default avatarMD Danish Anwar <danishanwar@ti.com>
Reviewed-by: default avatarRoger Quadros <rogerq@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 08c8acc9
...@@ -735,6 +735,7 @@ void icssg_vtbl_modify(struct prueth_emac *emac, u8 vid, u8 port_mask, ...@@ -735,6 +735,7 @@ void icssg_vtbl_modify(struct prueth_emac *emac, u8 vid, u8 port_mask,
u8 fid_c1; u8 fid_c1;
tbl = prueth->vlan_tbl; tbl = prueth->vlan_tbl;
spin_lock(&prueth->vtbl_lock);
fid_c1 = tbl[vid].fid_c1; fid_c1 = tbl[vid].fid_c1;
/* FID_C1: bit0..2 port membership mask, /* FID_C1: bit0..2 port membership mask,
...@@ -750,6 +751,7 @@ void icssg_vtbl_modify(struct prueth_emac *emac, u8 vid, u8 port_mask, ...@@ -750,6 +751,7 @@ void icssg_vtbl_modify(struct prueth_emac *emac, u8 vid, u8 port_mask,
} }
tbl[vid].fid_c1 = fid_c1; tbl[vid].fid_c1 = fid_c1;
spin_unlock(&prueth->vtbl_lock);
} }
EXPORT_SYMBOL_GPL(icssg_vtbl_modify); EXPORT_SYMBOL_GPL(icssg_vtbl_modify);
......
...@@ -1442,6 +1442,7 @@ static int prueth_probe(struct platform_device *pdev) ...@@ -1442,6 +1442,7 @@ static int prueth_probe(struct platform_device *pdev)
icss_iep_init_fw(prueth->iep1); icss_iep_init_fw(prueth->iep1);
} }
spin_lock_init(&prueth->vtbl_lock);
/* setup netdev interfaces */ /* setup netdev interfaces */
if (eth0_node) { if (eth0_node) {
ret = prueth_netdev_init(prueth, eth0_node); ret = prueth_netdev_init(prueth, eth0_node);
......
...@@ -296,6 +296,8 @@ struct prueth { ...@@ -296,6 +296,8 @@ struct prueth {
bool is_switchmode_supported; bool is_switchmode_supported;
unsigned char switch_id[MAX_PHYS_ITEM_ID_LEN]; unsigned char switch_id[MAX_PHYS_ITEM_ID_LEN];
int default_vlan; int default_vlan;
/** @vtbl_lock: Lock for vtbl in shared memory */
spinlock_t vtbl_lock;
}; };
struct emac_tx_ts_response { struct emac_tx_ts_response {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment