From: Sven Eckelmann <[email protected]>

The last_recv_time field for batadv_tp_receiver tracks the jiffies value of
the most recent activity and is used to detect timeouts. These accesses are
not consistently protected by a lock, so READ_ONCE/WRITE_ONCE must be used
to prevent data races caused by compiler optimizations.

Cc: [email protected]
Fixes: 33a3bb4a3345 ("batman-adv: throughput meter implementation")
Signed-off-by: Sven Eckelmann <[email protected]>
Signed-off-by: Simon Wunderlich <[email protected]>
---
 net/batman-adv/tp_meter.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c
index 259ac8c307359..fb87fa141e32a 100644
--- a/net/batman-adv/tp_meter.c
+++ b/net/batman-adv/tp_meter.c
@@ -1290,7 +1290,7 @@ static void batadv_tp_receiver_shutdown(struct timer_list 
*t)
        bat_priv = tp_vars->common.bat_priv;
 
        /* if there is recent activity rearm the timer */
-       if (!batadv_has_timed_out(tp_vars->last_recv_time,
+       if (!batadv_has_timed_out(READ_ONCE(tp_vars->last_recv_time),
                                  BATADV_TP_RECV_TIMEOUT)) {
                /* reset the receiver shutdown timer */
                batadv_tp_reset_receiver_timer(tp_vars);
@@ -1532,7 +1532,7 @@ batadv_tp_init_recv(struct batadv_priv *bat_priv,
        tp_vars = batadv_tp_list_find_receiver_session(bat_priv, icmp->orig,
                                                       icmp->session);
        if (tp_vars) {
-               tp_vars->last_recv_time = jiffies;
+               WRITE_ONCE(tp_vars->last_recv_time, jiffies);
                goto out_unlock;
        }
 
@@ -1562,7 +1562,7 @@ batadv_tp_init_recv(struct batadv_priv *bat_priv,
        kref_get(&tp_vars->common.refcount);
        timer_setup(&tp_vars->common.timer, batadv_tp_receiver_shutdown, 0);
 
-       tp_vars->last_recv_time = jiffies;
+       WRITE_ONCE(tp_vars->last_recv_time, jiffies);
 
        kref_get(&tp_vars->common.refcount);
        hlist_add_head_rcu(&tp_vars->common.list, &bat_priv->tp_receiver_list);
@@ -1613,7 +1613,7 @@ static void batadv_tp_recv_msg(struct batadv_priv 
*bat_priv,
                        goto out;
                }
 
-               tp_vars->last_recv_time = jiffies;
+               WRITE_ONCE(tp_vars->last_recv_time, jiffies);
        }
 
        /* if the packet is a duplicate, it may be the case that an ACK has been
-- 
2.47.3

Reply via email to