]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
batman-adv: tp_meter: directly shut down timer on cleanup
authorSven Eckelmann <sven@narfation.org>
Wed, 13 May 2026 08:43:54 +0000 (10:43 +0200)
committerSven Eckelmann <sven@narfation.org>
Fri, 15 May 2026 08:41:55 +0000 (10:41 +0200)
batadv_tp_sender_cleanup() was calling timer_delete_sync() followed by
timer_delete() to guard against the timer handler re-arming itself between
the two calls. This double-deletion hack relied on the sending status being
set to 0 to suppress re-arming.

Replace both calls with a single timer_shutdown_sync(). This function both
waits for any running timer callback to complete (like timer_delete_sync())
and permanently disarms the timer so it cannot be re-armed afterwards,
making re-arming prevention unconditional and self-documenting.

The re-arming property is also required because otherwise:

1. context 0 (batadv_tp_recv_ack()) checks in
   batadv_tp_reset_sender_timer() if sending is still 1 -> it is
2. context 1 changes in batadv_tp_sender_shutdown() sending to 0 and in
   this process forces the kthread to stop timer in
   batadv_tp_sender_cleanup()
3. context 0 continues in batadv_tp_reset_sender_timer() and rearms the
   timer -> but the reference for it is already gone

Cc: stable@kernel.org
Fixes: 33a3bb4a3345 ("batman-adv: throughput meter implementation")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
net/batman-adv/tp_meter.c

index a3593d104caa590a687540a84932884273dd7204..1fd1526059d8ab0710dfa046e86d8ee9413c5b3e 100644 (file)
@@ -401,13 +401,7 @@ static void batadv_tp_sender_cleanup(struct batadv_tp_vars *tp_vars)
        batadv_tp_list_detach(tp_vars);
 
        /* kill the timer and remove its reference */
-       timer_delete_sync(&tp_vars->timer);
-       /* the worker might have rearmed itself therefore we kill it again. Note
-        * that if the worker should run again before invoking the following
-        * timer_delete(), it would not re-arm itself once again because the status
-        * is OFF now
-        */
-       timer_delete(&tp_vars->timer);
+       timer_shutdown_sync(&tp_vars->timer);
        batadv_tp_vars_put(tp_vars);
 }