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

Fixes: 98d7a766b645 ("batman-adv: throughput meter implementation")
Signed-off-by: Sven Eckelmann <[email protected]>
---
Changes in v2:
- modified commit message to make clear it is a fix
- Link to v1: 
https://patch.msgid.link/[email protected]
---
 net/batman-adv/tp_meter.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c
index ca6c3f63..345e5b35 100644
--- a/net/batman-adv/tp_meter.c
+++ b/net/batman-adv/tp_meter.c
@@ -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);
 }
 

---
base-commit: 57c6af492c1948145db835bb3ea2980472558298
change-id: 20260513-tp-shutdown-98ab52371c76

Best regards,
--  
Sven Eckelmann <[email protected]>

Reply via email to