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:
committed by
Jakub Kicinski
parent
0346000aaa
commit
30dbb2d0e1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user