]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net_sched: act: annotate data-races in tcf_lastuse_update() and tcf_tm_dump()
authorEric Dumazet <edumazet@google.com>
Wed, 9 Jul 2025 09:01:53 +0000 (09:01 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 11 Jul 2025 23:01:15 +0000 (16:01 -0700)
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>
include/net/act_api.h

index 04781c92b43d6ab9cc6c81a88d5c6fe8c282c590..2894cfff2da3fba2b6e197dea35134e2aad5af80 100644 (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)