File tree Expand file tree Collapse file tree 3 files changed +18
-10
lines changed Expand file tree Collapse file tree 3 files changed +18
-10
lines changed Original file line number Diff line number Diff line change @@ -417,10 +417,12 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info)
417
417
418
418
if (code == ICMP_FRAG_NEEDED ) { /* PMTU discovery (RFC1191) */
419
419
tp -> mtu_info = info ;
420
- if (!sock_owned_by_user (sk ))
420
+ if (!sock_owned_by_user (sk )) {
421
421
tcp_v4_mtu_reduced (sk );
422
- else
423
- set_bit (TCP_MTU_REDUCED_DEFERRED , & tp -> tsq_flags );
422
+ } else {
423
+ if (!test_and_set_bit (TCP_MTU_REDUCED_DEFERRED , & tp -> tsq_flags ))
424
+ sock_hold (sk );
425
+ }
424
426
goto out ;
425
427
}
426
428
Original file line number Diff line number Diff line change @@ -910,14 +910,18 @@ void tcp_release_cb(struct sock *sk)
910
910
if (flags & (1UL << TCP_TSQ_DEFERRED ))
911
911
tcp_tsq_handler (sk );
912
912
913
- if (flags & (1UL << TCP_WRITE_TIMER_DEFERRED ))
913
+ if (flags & (1UL << TCP_WRITE_TIMER_DEFERRED )) {
914
914
tcp_write_timer_handler (sk );
915
-
916
- if (flags & (1UL << TCP_DELACK_TIMER_DEFERRED ))
915
+ __sock_put (sk );
916
+ }
917
+ if (flags & (1UL << TCP_DELACK_TIMER_DEFERRED )) {
917
918
tcp_delack_timer_handler (sk );
918
-
919
- if (flags & (1UL << TCP_MTU_REDUCED_DEFERRED ))
919
+ __sock_put (sk );
920
+ }
921
+ if (flags & (1UL << TCP_MTU_REDUCED_DEFERRED )) {
920
922
sk -> sk_prot -> mtu_reduced (sk );
923
+ __sock_put (sk );
924
+ }
921
925
}
922
926
EXPORT_SYMBOL (tcp_release_cb );
923
927
Original file line number Diff line number Diff line change @@ -252,7 +252,8 @@ static void tcp_delack_timer(unsigned long data)
252
252
inet_csk (sk )-> icsk_ack .blocked = 1 ;
253
253
NET_INC_STATS_BH (sock_net (sk ), LINUX_MIB_DELAYEDACKLOCKED );
254
254
/* deleguate our work to tcp_release_cb() */
255
- set_bit (TCP_WRITE_TIMER_DEFERRED , & tcp_sk (sk )-> tsq_flags );
255
+ if (!test_and_set_bit (TCP_DELACK_TIMER_DEFERRED , & tcp_sk (sk )-> tsq_flags ))
256
+ sock_hold (sk );
256
257
}
257
258
bh_unlock_sock (sk );
258
259
sock_put (sk );
@@ -481,7 +482,8 @@ static void tcp_write_timer(unsigned long data)
481
482
tcp_write_timer_handler (sk );
482
483
} else {
483
484
/* deleguate our work to tcp_release_cb() */
484
- set_bit (TCP_WRITE_TIMER_DEFERRED , & tcp_sk (sk )-> tsq_flags );
485
+ if (!test_and_set_bit (TCP_WRITE_TIMER_DEFERRED , & tcp_sk (sk )-> tsq_flags ))
486
+ sock_hold (sk );
485
487
}
486
488
bh_unlock_sock (sk );
487
489
sock_put (sk );
You can’t perform that action at this time.
0 commit comments