Skip to content

Commit 9a5e533

Browse files
edumazetkuba-moo
authored andcommitted
tcp: remove icsk->icsk_retransmit_timer
Now sk->sk_timer is no longer used by TCP keepalive, we can use its storage for TCP and MPTCP retransmit timers for better cache locality. Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com> Link: https://patch.msgid.link/20251124175013.1473655-5-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 08dfe37 commit 9a5e533

File tree

8 files changed

+25
-30
lines changed

8 files changed

+25
-30
lines changed

Documentation/networking/net_cachelines/inet_connection_sock.rst

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ struct inet_sock icsk_inet read_mostly r
1212
struct request_sock_queue icsk_accept_queue
1313
struct inet_bind_bucket icsk_bind_hash read_mostly tcp_set_state
1414
struct inet_bind2_bucket icsk_bind2_hash read_mostly tcp_set_state,inet_put_port
15-
struct timer_list icsk_retransmit_timer read_write inet_csk_reset_xmit_timer,tcp_connect
1615
struct timer_list icsk_delack_timer read_mostly inet_csk_reset_xmit_timer,tcp_connect
1716
struct timer_list icsk_keepalive_timer
1817
u32 icsk_rto read_write tcp_cwnd_validate,tcp_schedule_loss_probe,tcp_connect_init,tcp_connect,tcp_write_xmit,tcp_push_one

include/net/inet_connection_sock.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ struct inet_connection_sock_af_ops {
5656
* @icsk_accept_queue: FIFO of established children
5757
* @icsk_bind_hash: Bind node
5858
* @icsk_bind2_hash: Bind node in the bhash2 table
59-
* @icsk_retransmit_timer: Resend (no ack)
6059
* @icsk_delack_timer: Delayed ACK timer
6160
* @icsk_keepalive_timer: Keepalive timer
6261
* @mptcp_tout_timer: mptcp timer
@@ -84,7 +83,6 @@ struct inet_connection_sock {
8483
struct request_sock_queue icsk_accept_queue;
8584
struct inet_bind_bucket *icsk_bind_hash;
8685
struct inet_bind2_bucket *icsk_bind2_hash;
87-
struct timer_list icsk_retransmit_timer;
8886
struct timer_list icsk_delack_timer;
8987
union {
9088
struct timer_list icsk_keepalive_timer;
@@ -193,7 +191,7 @@ static inline void inet_csk_delack_init(struct sock *sk)
193191

194192
static inline unsigned long tcp_timeout_expires(const struct sock *sk)
195193
{
196-
return READ_ONCE(inet_csk(sk)->icsk_retransmit_timer.expires);
194+
return READ_ONCE(sk->tcp_retransmit_timer.expires);
197195
}
198196

199197
static inline unsigned long
@@ -209,7 +207,7 @@ static inline void inet_csk_clear_xmit_timer(struct sock *sk, const int what)
209207
if (what == ICSK_TIME_RETRANS || what == ICSK_TIME_PROBE0) {
210208
smp_store_release(&icsk->icsk_pending, 0);
211209
#ifdef INET_CSK_CLEAR_TIMERS
212-
sk_stop_timer(sk, &icsk->icsk_retransmit_timer);
210+
sk_stop_timer(sk, &sk->tcp_retransmit_timer);
213211
#endif
214212
} else if (what == ICSK_TIME_DACK) {
215213
smp_store_release(&icsk->icsk_ack.pending, 0);
@@ -241,7 +239,7 @@ static inline void inet_csk_reset_xmit_timer(struct sock *sk, const int what,
241239
if (what == ICSK_TIME_RETRANS || what == ICSK_TIME_PROBE0 ||
242240
what == ICSK_TIME_LOSS_PROBE || what == ICSK_TIME_REO_TIMEOUT) {
243241
smp_store_release(&icsk->icsk_pending, what);
244-
sk_reset_timer(sk, &icsk->icsk_retransmit_timer, when);
242+
sk_reset_timer(sk, &sk->tcp_retransmit_timer, when);
245243
} else if (what == ICSK_TIME_DACK) {
246244
smp_store_release(&icsk->icsk_ack.pending,
247245
icsk->icsk_ack.pending | ICSK_ACK_TIMER);

include/net/sock.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,8 @@ struct sk_filter;
305305
* @sk_txrehash: enable TX hash rethink
306306
* @sk_filter: socket filtering instructions
307307
* @sk_timer: sock cleanup timer
308+
* @tcp_retransmit_timer: tcp retransmit timer
309+
* @mptcp_retransmit_timer: mptcp retransmit timer
308310
* @sk_stamp: time stamp of last packet received
309311
* @sk_stamp_seq: lock for accessing sk_stamp on 32 bit architectures only
310312
* @sk_tsflags: SO_TIMESTAMPING flags
@@ -482,8 +484,11 @@ struct sock {
482484
};
483485
struct sk_buff_head sk_write_queue;
484486
struct page_frag sk_frag;
485-
struct timer_list sk_timer;
486-
487+
union {
488+
struct timer_list sk_timer;
489+
struct timer_list tcp_retransmit_timer;
490+
struct timer_list mptcp_retransmit_timer;
491+
};
487492
unsigned long sk_pacing_rate; /* bytes per second */
488493
atomic_t sk_zckey;
489494
atomic_t sk_tskey;

net/ipv4/inet_connection_sock.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,7 @@ void inet_csk_init_xmit_timers(struct sock *sk,
737737
{
738738
struct inet_connection_sock *icsk = inet_csk(sk);
739739

740-
timer_setup(&icsk->icsk_retransmit_timer, retransmit_handler, 0);
740+
timer_setup(&sk->tcp_retransmit_timer, retransmit_handler, 0);
741741
timer_setup(&icsk->icsk_delack_timer, delack_handler, 0);
742742
timer_setup(&icsk->icsk_keepalive_timer, keepalive_handler, 0);
743743
icsk->icsk_pending = icsk->icsk_ack.pending = 0;
@@ -750,7 +750,7 @@ void inet_csk_clear_xmit_timers(struct sock *sk)
750750
smp_store_release(&icsk->icsk_pending, 0);
751751
smp_store_release(&icsk->icsk_ack.pending, 0);
752752

753-
sk_stop_timer(sk, &icsk->icsk_retransmit_timer);
753+
sk_stop_timer(sk, &sk->tcp_retransmit_timer);
754754
sk_stop_timer(sk, &icsk->icsk_delack_timer);
755755
sk_stop_timer(sk, &icsk->icsk_keepalive_timer);
756756
}
@@ -765,7 +765,7 @@ void inet_csk_clear_xmit_timers_sync(struct sock *sk)
765765
smp_store_release(&icsk->icsk_pending, 0);
766766
smp_store_release(&icsk->icsk_ack.pending, 0);
767767

768-
sk_stop_timer_sync(sk, &icsk->icsk_retransmit_timer);
768+
sk_stop_timer_sync(sk, &sk->tcp_retransmit_timer);
769769
sk_stop_timer_sync(sk, &icsk->icsk_delack_timer);
770770
sk_stop_timer_sync(sk, &icsk->icsk_keepalive_timer);
771771
}

net/ipv4/tcp_timer.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,7 @@ void tcp_write_timer_handler(struct sock *sk)
698698
return;
699699

700700
if (time_after(tcp_timeout_expires(sk), jiffies)) {
701-
sk_reset_timer(sk, &icsk->icsk_retransmit_timer,
701+
sk_reset_timer(sk, &sk->tcp_retransmit_timer,
702702
tcp_timeout_expires(sk));
703703
return;
704704
}
@@ -725,12 +725,10 @@ void tcp_write_timer_handler(struct sock *sk)
725725

726726
static void tcp_write_timer(struct timer_list *t)
727727
{
728-
struct inet_connection_sock *icsk =
729-
timer_container_of(icsk, t, icsk_retransmit_timer);
730-
struct sock *sk = &icsk->icsk_inet.sk;
728+
struct sock *sk = timer_container_of(sk, t, tcp_retransmit_timer);
731729

732730
/* Avoid locking the socket when there is no pending event. */
733-
if (!smp_load_acquire(&icsk->icsk_pending))
731+
if (!smp_load_acquire(&inet_csk(sk)->icsk_pending))
734732
goto out;
735733

736734
bh_lock_sock(sk);

net/mptcp/protocol.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -411,9 +411,7 @@ static bool __mptcp_move_skb(struct sock *sk, struct sk_buff *skb)
411411

412412
static void mptcp_stop_rtx_timer(struct sock *sk)
413413
{
414-
struct inet_connection_sock *icsk = inet_csk(sk);
415-
416-
sk_stop_timer(sk, &icsk->icsk_retransmit_timer);
414+
sk_stop_timer(sk, &sk->mptcp_retransmit_timer);
417415
mptcp_sk(sk)->timer_ival = 0;
418416
}
419417

@@ -954,20 +952,19 @@ static void __mptcp_flush_join_list(struct sock *sk, struct list_head *join_list
954952

955953
static bool mptcp_rtx_timer_pending(struct sock *sk)
956954
{
957-
return timer_pending(&inet_csk(sk)->icsk_retransmit_timer);
955+
return timer_pending(&sk->mptcp_retransmit_timer);
958956
}
959957

960958
static void mptcp_reset_rtx_timer(struct sock *sk)
961959
{
962-
struct inet_connection_sock *icsk = inet_csk(sk);
963960
unsigned long tout;
964961

965962
/* prevent rescheduling on close */
966963
if (unlikely(inet_sk_state_load(sk) == TCP_CLOSE))
967964
return;
968965

969966
tout = mptcp_sk(sk)->timer_ival;
970-
sk_reset_timer(sk, &icsk->icsk_retransmit_timer, jiffies + tout);
967+
sk_reset_timer(sk, &sk->mptcp_retransmit_timer, jiffies + tout);
971968
}
972969

973970
bool mptcp_schedule_work(struct sock *sk)
@@ -2354,9 +2351,7 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
23542351

23552352
static void mptcp_retransmit_timer(struct timer_list *t)
23562353
{
2357-
struct inet_connection_sock *icsk = timer_container_of(icsk, t,
2358-
icsk_retransmit_timer);
2359-
struct sock *sk = &icsk->icsk_inet.sk;
2354+
struct sock *sk = timer_container_of(sk, t, mptcp_retransmit_timer);
23602355
struct mptcp_sock *msk = mptcp_sk(sk);
23612356

23622357
bh_lock_sock(sk);
@@ -2975,7 +2970,7 @@ static void __mptcp_init_sock(struct sock *sk)
29752970
spin_lock_init(&msk->fallback_lock);
29762971

29772972
/* re-use the csk retrans timer for MPTCP-level retrans */
2978-
timer_setup(&msk->sk.icsk_retransmit_timer, mptcp_retransmit_timer, 0);
2973+
timer_setup(&sk->mptcp_retransmit_timer, mptcp_retransmit_timer, 0);
29792974
timer_setup(&msk->sk.mptcp_tout_timer, mptcp_tout_timer, 0);
29802975
}
29812976

tools/testing/selftests/bpf/progs/bpf_iter_tcp4.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ static int dump_tcp_sock(struct seq_file *seq, struct tcp_sock *tp,
9999
icsk->icsk_pending == ICSK_TIME_REO_TIMEOUT ||
100100
icsk->icsk_pending == ICSK_TIME_LOSS_PROBE) {
101101
timer_active = 1;
102-
timer_expires = icsk->icsk_retransmit_timer.expires;
102+
timer_expires = sp->tcp_retransmit_timer.expires;
103103
} else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
104104
timer_active = 4;
105-
timer_expires = icsk->icsk_retransmit_timer.expires;
105+
timer_expires = sp->tcp_retransmit_timer.expires;
106106
} else if (timer_pending(&icsk->icsk_keepalive_timer)) {
107107
timer_active = 2;
108108
timer_expires = icsk->icsk_keepalive_timer.expires;

tools/testing/selftests/bpf/progs/bpf_iter_tcp6.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ static int dump_tcp6_sock(struct seq_file *seq, struct tcp6_sock *tp,
9999
icsk->icsk_pending == ICSK_TIME_REO_TIMEOUT ||
100100
icsk->icsk_pending == ICSK_TIME_LOSS_PROBE) {
101101
timer_active = 1;
102-
timer_expires = icsk->icsk_retransmit_timer.expires;
102+
timer_expires = sp->tcp_retransmit_timer.expires;
103103
} else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
104104
timer_active = 4;
105-
timer_expires = icsk->icsk_retransmit_timer.expires;
105+
timer_expires = sp->tcp_retransmit_timer.expires;
106106
} else if (timer_pending(&icsk->icsk_keepalive_timer)) {
107107
timer_active = 2;
108108
timer_expires = icsk->icsk_keepalive_timer.expires;

0 commit comments

Comments
 (0)