Skip to content

Commit 58bf4db

Browse files
vladimirolteankuba-moo
authored andcommitted
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: 7d4b564 ("net: dsa: felix: support psfp filter on vsc9959") Signed-off-by: Vladimir Oltean <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 839b92f commit 58bf4db

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

drivers/net/dsa/ocelot/felix_vsc9959.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1886,6 +1886,8 @@ static void vsc9959_psfp_sgi_table_del(struct ocelot *ocelot,
18861886
static void vsc9959_psfp_counters_get(struct ocelot *ocelot, u32 index,
18871887
struct felix_stream_filter_counters *counters)
18881888
{
1889+
mutex_lock(&ocelot->stats_lock);
1890+
18891891
ocelot_rmw(ocelot, SYS_STAT_CFG_STAT_VIEW(index),
18901892
SYS_STAT_CFG_STAT_VIEW_M,
18911893
SYS_STAT_CFG);
@@ -1900,6 +1902,8 @@ static void vsc9959_psfp_counters_get(struct ocelot *ocelot, u32 index,
19001902
SYS_STAT_CFG_STAT_VIEW(index) |
19011903
SYS_STAT_CFG_STAT_CLEAR_SHOT(0x10),
19021904
SYS_STAT_CFG);
1905+
1906+
mutex_unlock(&ocelot->stats_lock);
19031907
}
19041908

19051909
static int vsc9959_psfp_filter_add(struct ocelot *ocelot, int port,

0 commit comments

Comments
 (0)