mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 16:12:59 +02:00
batman-adv: tp_meter: directly shut down timer on cleanup
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: 33a3bb4a33 ("batman-adv: throughput meter implementation")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
This commit is contained in:
parent
bc62216dc8
commit
d5487249a8
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user