mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-14 09:47:20 +00:00
net: dsa: felix: fix race between reading PSFP stats and port stats
Both PSFP stats and the port stats read by ocelot_check_stats_work() are indirectly read through the same mechanism - write to STAT_CFG:STAT_VIEW, read from SYS:STAT:CNT[n]. It's just that for port stats, we write STAT_VIEW with the index of the port, and for PSFP stats, we write STAT_VIEW with the filter index. So if we allow them to run concurrently, ocelot_check_stats_work() may change the view from vsc9959_psfp_counters_get(), and vice versa. Fixes: 7d4b564d6add ("net: dsa: felix: support psfp filter on vsc9959") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Link: https://lore.kernel.org/r/20220629183007.3808130-1-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
839b92fede
commit
58bf4db695
@ -1886,6 +1886,8 @@ static void vsc9959_psfp_sgi_table_del(struct ocelot *ocelot,
|
||||
static void vsc9959_psfp_counters_get(struct ocelot *ocelot, u32 index,
|
||||
struct felix_stream_filter_counters *counters)
|
||||
{
|
||||
mutex_lock(&ocelot->stats_lock);
|
||||
|
||||
ocelot_rmw(ocelot, SYS_STAT_CFG_STAT_VIEW(index),
|
||||
SYS_STAT_CFG_STAT_VIEW_M,
|
||||
SYS_STAT_CFG);
|
||||
@ -1900,6 +1902,8 @@ static void vsc9959_psfp_counters_get(struct ocelot *ocelot, u32 index,
|
||||
SYS_STAT_CFG_STAT_VIEW(index) |
|
||||
SYS_STAT_CFG_STAT_CLEAR_SHOT(0x10),
|
||||
SYS_STAT_CFG);
|
||||
|
||||
mutex_unlock(&ocelot->stats_lock);
|
||||
}
|
||||
|
||||
static int vsc9959_psfp_filter_add(struct ocelot *ocelot, int port,
|
||||
|
Loading…
x
Reference in New Issue
Block a user