mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
net: dsa: sja1105: block FDB accesses that are concurrent with a switch reset
[ Upstream commit86899e9e1e] Currently, when we add the first sja1105 port to a bridge with vlan_filtering 1, then we sometimes see this output: sja1105 spi2.2: port 4 failed to read back entry for be:79:b4:9e:9e:96 vid 3088: -ENOENT sja1105 spi2.2: Reset switch and programmed static config. Reason: VLAN filtering sja1105 spi2.2: port 0 failed to add be:79:b4:9e:9e:96 vid 0 to fdb: -2 It is because sja1105_fdb_add() runs from the dsa_owq which is no longer serialized with switch resets since it dropped the rtnl_lock() in the blamed commit. Either performing the FDB accesses before the reset, or after the reset, is equally fine, because sja1105_static_fdb_change() backs up those changes in the static config, but FDB access during reset isn't ok. Make sja1105_static_config_reload() take the fdb_lock to fix that. Fixes:0faf890fc5("net: dsa: drop rtnl_lock from dsa_slave_switchdev_event_work") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e74bd1b229
commit
44c8ffd482
@@ -2304,6 +2304,7 @@ int sja1105_static_config_reload(struct sja1105_private *priv,
|
|||||||
int rc, i;
|
int rc, i;
|
||||||
s64 now;
|
s64 now;
|
||||||
|
|
||||||
|
mutex_lock(&priv->fdb_lock);
|
||||||
mutex_lock(&priv->mgmt_lock);
|
mutex_lock(&priv->mgmt_lock);
|
||||||
|
|
||||||
mac = priv->static_config.tables[BLK_IDX_MAC_CONFIG].entries;
|
mac = priv->static_config.tables[BLK_IDX_MAC_CONFIG].entries;
|
||||||
@@ -2418,6 +2419,7 @@ int sja1105_static_config_reload(struct sja1105_private *priv,
|
|||||||
goto out;
|
goto out;
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&priv->mgmt_lock);
|
mutex_unlock(&priv->mgmt_lock);
|
||||||
|
mutex_unlock(&priv->fdb_lock);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user