2727 if (unlikely(!peer)) \
2828 return;
2929
30- static inline bool timers_active (struct wireguard_peer * peer )
30+ static inline void mod_peer_timer (struct wireguard_peer * peer , struct timer_list * timer , unsigned long expires )
3131{
32- return netif_running (peer -> device -> dev ) && !list_empty (& peer -> peer_list );
32+ if (unlikely (!netif_running (peer -> device -> dev ) || !atomic_inc_not_zero (& peer -> dead_count )))
33+ return ;
34+ mod_timer (timer , expires );
35+ atomic_dec (& peer -> dead_count );
36+ }
37+
38+ static inline void del_peer_timer (struct wireguard_peer * peer , struct timer_list * timer )
39+ {
40+ if (unlikely (!netif_running (peer -> device -> dev ) || !atomic_inc_not_zero (& peer -> dead_count )))
41+ return ;
42+ del_timer (timer );
43+ atomic_dec (& peer -> dead_count );
3344}
3445
3546static void expired_retransmit_handshake (struct timer_list * timer )
@@ -39,8 +50,7 @@ static void expired_retransmit_handshake(struct timer_list *timer)
3950 if (peer -> timer_handshake_attempts > MAX_TIMER_HANDSHAKES ) {
4051 pr_debug ("%s: Handshake for peer %llu (%pISpfsc) did not complete after %d attempts, giving up\n" , peer -> device -> dev -> name , peer -> internal_id , & peer -> endpoint .addr , MAX_TIMER_HANDSHAKES + 2 );
4152
42- if (likely (timers_active (peer )))
43- del_timer (& peer -> timer_send_keepalive );
53+ del_peer_timer (peer , & peer -> timer_send_keepalive );
4454 /* We drop all packets without a keypair and don't try again,
4555 * if we try unsuccessfully for too long to make a handshake.
4656 */
@@ -49,8 +59,8 @@ static void expired_retransmit_handshake(struct timer_list *timer)
4959 /* We set a timer for destroying any residue that might be left
5060 * of a partial exchange.
5161 */
52- if (likely ( timers_active ( peer )) && !timer_pending (& peer -> timer_zero_key_material ))
53- mod_timer ( & peer -> timer_zero_key_material , jiffies + REJECT_AFTER_TIME * 3 * HZ );
62+ if (!timer_pending (& peer -> timer_zero_key_material ))
63+ mod_peer_timer ( peer , & peer -> timer_zero_key_material , jiffies + REJECT_AFTER_TIME * 3 * HZ );
5464 } else {
5565 ++ peer -> timer_handshake_attempts ;
5666 pr_debug ("%s: Handshake for peer %llu (%pISpfsc) did not complete after %d seconds, retrying (try %d)\n" , peer -> device -> dev -> name , peer -> internal_id , & peer -> endpoint .addr , REKEY_TIMEOUT , peer -> timer_handshake_attempts + 1 );
@@ -70,8 +80,7 @@ static void expired_send_keepalive(struct timer_list *timer)
7080 packet_send_keepalive (peer );
7181 if (peer -> timer_need_another_keepalive ) {
7282 peer -> timer_need_another_keepalive = false;
73- if (likely (timers_active (peer )))
74- mod_timer (& peer -> timer_send_keepalive , jiffies + KEEPALIVE_TIMEOUT * HZ );
83+ mod_peer_timer (peer , & peer -> timer_send_keepalive , jiffies + KEEPALIVE_TIMEOUT * HZ );
7584 }
7685 peer_put (peer );
7786}
@@ -91,8 +100,14 @@ static void expired_zero_key_material(struct timer_list *timer)
91100{
92101 peer_get_from_timer (timer_zero_key_material );
93102
94- if (!queue_work (peer -> device -> handshake_send_wq , & peer -> clear_peer_work )) /* Takes our reference. */
103+ if (unlikely (!atomic_inc_not_zero (& peer -> dead_count )))
104+ goto out ;
105+ peer_get (peer );
106+ if (!queue_work (peer -> device -> handshake_send_wq , & peer -> clear_peer_work ))
95107 peer_put (peer ); /* If the work was already on the queue, we want to drop the extra reference */
108+ atomic_dec (& peer -> dead_count );
109+ out :
110+ peer_put (peer );
96111}
97112static void queued_expired_zero_key_material (struct work_struct * work )
98113{
@@ -116,16 +131,16 @@ static void expired_send_persistent_keepalive(struct timer_list *timer)
116131/* Should be called after an authenticated data packet is sent. */
117132void timers_data_sent (struct wireguard_peer * peer )
118133{
119- if (likely ( timers_active ( peer )) && !timer_pending (& peer -> timer_new_handshake ))
120- mod_timer ( & peer -> timer_new_handshake , jiffies + (KEEPALIVE_TIMEOUT + REKEY_TIMEOUT ) * HZ );
134+ if (!timer_pending (& peer -> timer_new_handshake ))
135+ mod_peer_timer ( peer , & peer -> timer_new_handshake , jiffies + (KEEPALIVE_TIMEOUT + REKEY_TIMEOUT ) * HZ );
121136}
122137
123138/* Should be called after an authenticated data packet is received. */
124139void timers_data_received (struct wireguard_peer * peer )
125140{
126- if (likely (timers_active (peer ))) {
141+ if (likely (netif_running (peer -> device -> dev ))) {
127142 if (!timer_pending (& peer -> timer_send_keepalive ))
128- mod_timer ( & peer -> timer_send_keepalive , jiffies + KEEPALIVE_TIMEOUT * HZ );
143+ mod_peer_timer ( peer , & peer -> timer_send_keepalive , jiffies + KEEPALIVE_TIMEOUT * HZ );
129144 else
130145 peer -> timer_need_another_keepalive = true;
131146 }
@@ -134,29 +149,25 @@ void timers_data_received(struct wireguard_peer *peer)
134149/* Should be called after any type of authenticated packet is sent -- keepalive, data, or handshake. */
135150void timers_any_authenticated_packet_sent (struct wireguard_peer * peer )
136151{
137- if (likely (timers_active (peer )))
138- del_timer (& peer -> timer_send_keepalive );
152+ del_peer_timer (peer , & peer -> timer_send_keepalive );
139153}
140154
141155/* Should be called after any type of authenticated packet is received -- keepalive, data, or handshake. */
142156void timers_any_authenticated_packet_received (struct wireguard_peer * peer )
143157{
144- if (likely (timers_active (peer )))
145- del_timer (& peer -> timer_new_handshake );
158+ del_peer_timer (peer , & peer -> timer_new_handshake );
146159}
147160
148161/* Should be called after a handshake initiation message is sent. */
149162void timers_handshake_initiated (struct wireguard_peer * peer )
150163{
151- if (likely (timers_active (peer )))
152- mod_timer (& peer -> timer_retransmit_handshake , jiffies + REKEY_TIMEOUT * HZ + prandom_u32_max (REKEY_TIMEOUT_JITTER_MAX_JIFFIES ));
164+ mod_peer_timer (peer , & peer -> timer_retransmit_handshake , jiffies + REKEY_TIMEOUT * HZ + prandom_u32_max (REKEY_TIMEOUT_JITTER_MAX_JIFFIES ));
153165}
154166
155167/* Should be called after a handshake response message is received and processed or when getting key confirmation via the first data message. */
156168void timers_handshake_complete (struct wireguard_peer * peer )
157169{
158- if (likely (timers_active (peer )))
159- del_timer (& peer -> timer_retransmit_handshake );
170+ del_peer_timer (peer , & peer -> timer_retransmit_handshake );
160171 peer -> timer_handshake_attempts = 0 ;
161172 peer -> sent_lastminute_handshake = false;
162173 getnstimeofday (& peer -> walltime_last_handshake );
@@ -165,15 +176,14 @@ void timers_handshake_complete(struct wireguard_peer *peer)
165176/* Should be called after an ephemeral key is created, which is before sending a handshake response or after receiving a handshake response. */
166177void timers_session_derived (struct wireguard_peer * peer )
167178{
168- if (likely (timers_active (peer )))
169- mod_timer (& peer -> timer_zero_key_material , jiffies + REJECT_AFTER_TIME * 3 * HZ );
179+ mod_peer_timer (peer , & peer -> timer_zero_key_material , jiffies + REJECT_AFTER_TIME * 3 * HZ );
170180}
171181
172182/* Should be called before a packet with authentication -- keepalive, data, or handshake -- is sent, or after one is received. */
173183void timers_any_authenticated_packet_traversal (struct wireguard_peer * peer )
174184{
175- if (peer -> persistent_keepalive_interval && likely ( timers_active ( peer )) )
176- mod_timer ( & peer -> timer_persistent_keepalive , jiffies + peer -> persistent_keepalive_interval * HZ );
185+ if (peer -> persistent_keepalive_interval )
186+ mod_peer_timer ( peer , & peer -> timer_persistent_keepalive , jiffies + peer -> persistent_keepalive_interval * HZ );
177187}
178188
179189void timers_init (struct wireguard_peer * peer )
0 commit comments