Skip to content

Commit 08bcf03

Browse files
edumazetZhengShunQian
authored andcommitted
tcp: add max_quickacks param to tcp_incr_quickack and tcp_enter_quickack_mode
[ Upstream commit 9a9c9b5 ] We want to add finer control of the number of ACK packets sent after ECN events. This patch is not changing current behavior, it only enables following change. Signed-off-by: Eric Dumazet <[email protected]> Acked-by: Soheil Hassas Yeganeh <[email protected]> Acked-by: Neal Cardwell <[email protected]> Signed-off-by: David S. Miller <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 2863085 commit 08bcf03

File tree

3 files changed

+16
-14
lines changed

3 files changed

+16
-14
lines changed

include/net/tcp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
377377
struct pipe_inode_info *pipe, size_t len,
378378
unsigned int flags);
379379

380-
void tcp_enter_quickack_mode(struct sock *sk);
380+
void tcp_enter_quickack_mode(struct sock *sk, unsigned int max_quickacks);
381381
static inline void tcp_dec_quickack_mode(struct sock *sk,
382382
const unsigned int pkts)
383383
{

net/ipv4/tcp_dctcp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ static void dctcp_ce_state_0_to_1(struct sock *sk)
138138
*/
139139
if (inet_csk(sk)->icsk_ack.pending & ICSK_ACK_TIMER)
140140
__tcp_send_ack(sk, ca->prior_rcv_nxt);
141-
tcp_enter_quickack_mode(sk);
141+
tcp_enter_quickack_mode(sk, 1);
142142
}
143143

144144
ca->prior_rcv_nxt = tp->rcv_nxt;
@@ -159,7 +159,7 @@ static void dctcp_ce_state_1_to_0(struct sock *sk)
159159
*/
160160
if (inet_csk(sk)->icsk_ack.pending & ICSK_ACK_TIMER)
161161
__tcp_send_ack(sk, ca->prior_rcv_nxt);
162-
tcp_enter_quickack_mode(sk);
162+
tcp_enter_quickack_mode(sk, 1);
163163
}
164164

165165
ca->prior_rcv_nxt = tp->rcv_nxt;

net/ipv4/tcp_input.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -177,21 +177,23 @@ static void tcp_measure_rcv_mss(struct sock *sk, const struct sk_buff *skb)
177177
}
178178
}
179179

180-
static void tcp_incr_quickack(struct sock *sk)
180+
static void tcp_incr_quickack(struct sock *sk, unsigned int max_quickacks)
181181
{
182182
struct inet_connection_sock *icsk = inet_csk(sk);
183183
unsigned int quickacks = tcp_sk(sk)->rcv_wnd / (2 * icsk->icsk_ack.rcv_mss);
184184

185185
if (quickacks == 0)
186186
quickacks = 2;
187+
quickacks = min(quickacks, max_quickacks);
187188
if (quickacks > icsk->icsk_ack.quick)
188-
icsk->icsk_ack.quick = min(quickacks, TCP_MAX_QUICKACKS);
189+
icsk->icsk_ack.quick = quickacks;
189190
}
190191

191-
void tcp_enter_quickack_mode(struct sock *sk)
192+
void tcp_enter_quickack_mode(struct sock *sk, unsigned int max_quickacks)
192193
{
193194
struct inet_connection_sock *icsk = inet_csk(sk);
194-
tcp_incr_quickack(sk);
195+
196+
tcp_incr_quickack(sk, max_quickacks);
195197
icsk->icsk_ack.pingpong = 0;
196198
icsk->icsk_ack.ato = TCP_ATO_MIN;
197199
}
@@ -236,15 +238,15 @@ static void __tcp_ecn_check_ce(struct tcp_sock *tp, const struct sk_buff *skb)
236238
* it is probably a retransmit.
237239
*/
238240
if (tp->ecn_flags & TCP_ECN_SEEN)
239-
tcp_enter_quickack_mode((struct sock *)tp);
241+
tcp_enter_quickack_mode((struct sock *)tp, TCP_MAX_QUICKACKS);
240242
break;
241243
case INET_ECN_CE:
242244
if (tcp_ca_needs_ecn((struct sock *)tp))
243245
tcp_ca_event((struct sock *)tp, CA_EVENT_ECN_IS_CE);
244246

245247
if (!(tp->ecn_flags & TCP_ECN_DEMAND_CWR)) {
246248
/* Better not delay acks, sender can have a very low cwnd */
247-
tcp_enter_quickack_mode((struct sock *)tp);
249+
tcp_enter_quickack_mode((struct sock *)tp, TCP_MAX_QUICKACKS);
248250
tp->ecn_flags |= TCP_ECN_DEMAND_CWR;
249251
}
250252
tp->ecn_flags |= TCP_ECN_SEEN;
@@ -652,7 +654,7 @@ static void tcp_event_data_recv(struct sock *sk, struct sk_buff *skb)
652654
/* The _first_ data packet received, initialize
653655
* delayed ACK engine.
654656
*/
655-
tcp_incr_quickack(sk);
657+
tcp_incr_quickack(sk, TCP_MAX_QUICKACKS);
656658
icsk->icsk_ack.ato = TCP_ATO_MIN;
657659
} else {
658660
int m = now - icsk->icsk_ack.lrcvtime;
@@ -668,7 +670,7 @@ static void tcp_event_data_recv(struct sock *sk, struct sk_buff *skb)
668670
/* Too long gap. Apparently sender failed to
669671
* restart window, so that we send ACKs quickly.
670672
*/
671-
tcp_incr_quickack(sk);
673+
tcp_incr_quickack(sk, TCP_MAX_QUICKACKS);
672674
sk_mem_reclaim(sk);
673675
}
674676
}
@@ -4137,7 +4139,7 @@ static void tcp_send_dupack(struct sock *sk, const struct sk_buff *skb)
41374139
if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq &&
41384140
before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) {
41394141
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_DELAYEDACKLOST);
4140-
tcp_enter_quickack_mode(sk);
4142+
tcp_enter_quickack_mode(sk, TCP_MAX_QUICKACKS);
41414143

41424144
if (tcp_is_sack(tp) && sysctl_tcp_dsack) {
41434145
u32 end_seq = TCP_SKB_CB(skb)->end_seq;
@@ -4639,7 +4641,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
46394641
tcp_dsack_set(sk, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq);
46404642

46414643
out_of_window:
4642-
tcp_enter_quickack_mode(sk);
4644+
tcp_enter_quickack_mode(sk, TCP_MAX_QUICKACKS);
46434645
inet_csk_schedule_ack(sk);
46444646
drop:
46454647
__kfree_skb(skb);
@@ -5675,7 +5677,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
56755677
* to stand against the temptation 8) --ANK
56765678
*/
56775679
inet_csk_schedule_ack(sk);
5678-
tcp_enter_quickack_mode(sk);
5680+
tcp_enter_quickack_mode(sk, TCP_MAX_QUICKACKS);
56795681
inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK,
56805682
TCP_DELACK_MAX, TCP_RTO_MAX);
56815683

0 commit comments

Comments
 (0)