net_sched: act: annotate data-races in tcf_lastuse_update() and tcf_tm_dump()

tcf_tm_dump() reads fields that can be changed concurrently,
and tcf_lastuse_update() might race against itself.

Add READ_ONCE() and WRITE_ONCE() annotations.

Fetch jiffies once in tcf_tm_dump().

Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250709090204.797558-2-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Eric Dumazet
2025-07-09 09:01:53 +00:00
committed by Jakub Kicinski
parent 0346000aaa
commit 30dbb2d0e1

View File

@@ -76,19 +76,24 @@ static inline void tcf_lastuse_update(struct tcf_t *tm)
{
unsigned long now = jiffies;
if (tm->lastuse != now)
tm->lastuse = now;
if (unlikely(!tm->firstuse))
tm->firstuse = now;
if (READ_ONCE(tm->lastuse) != now)
WRITE_ONCE(tm->lastuse, now);
if (unlikely(!READ_ONCE(tm->firstuse)))
WRITE_ONCE(tm->firstuse, now);
}
static inline void tcf_tm_dump(struct tcf_t *dtm, const struct tcf_t *stm)
{
dtm->install = jiffies_to_clock_t(jiffies - stm->install);
dtm->lastuse = jiffies_to_clock_t(jiffies - stm->lastuse);
dtm->firstuse = stm->firstuse ?
jiffies_to_clock_t(jiffies - stm->firstuse) : 0;
dtm->expires = jiffies_to_clock_t(stm->expires);
unsigned long firstuse, now = jiffies;
dtm->install = jiffies_to_clock_t(now - READ_ONCE(stm->install));
dtm->lastuse = jiffies_to_clock_t(now - READ_ONCE(stm->lastuse));
firstuse = READ_ONCE(stm->firstuse);
dtm->firstuse = firstuse ?
jiffies_to_clock_t(now - firstuse) : 0;
dtm->expires = jiffies_to_clock_t(READ_ONCE(stm->expires));
}
static inline enum flow_action_hw_stats tc_act_hw_stats(u8 hw_stats)