diff options
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/ip_tunnel.c | 14 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 21 | ||||
| -rw-r--r-- | net/ipv4/tcp_output.c | 19 | ||||
| -rw-r--r-- | net/ipv4/udp.c | 2 | 
4 files changed, 29 insertions, 27 deletions
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index aaeb5d16f0c9..158a30ae7c5f 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c @@ -568,20 +568,6 @@ static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb,  	return 0;  } -static void ip_tunnel_adj_headroom(struct net_device *dev, unsigned int headroom) -{ -	/* we must cap headroom to some upperlimit, else pskb_expand_head -	 * will overflow header offsets in skb_headers_offset_update(). -	 */ -	static const unsigned int max_allowed = 512; - -	if (headroom > max_allowed) -		headroom = max_allowed; - -	if (headroom > READ_ONCE(dev->needed_headroom)) -		WRITE_ONCE(dev->needed_headroom, headroom); -} -  void ip_md_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,  		       u8 proto, int tunnel_hlen)  { diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 31ea5af49f2d..e4a979b75cc6 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -891,18 +891,27 @@ static inline void tcp_rcv_rtt_measure_ts(struct sock *sk,  	}  } -void tcp_rcvbuf_grow(struct sock *sk) +void tcp_rcvbuf_grow(struct sock *sk, u32 newval)  {  	const struct net *net = sock_net(sk);  	struct tcp_sock *tp = tcp_sk(sk); -	int rcvwin, rcvbuf, cap; +	u32 rcvwin, rcvbuf, cap, oldval; +	u64 grow; + +	oldval = tp->rcvq_space.space; +	tp->rcvq_space.space = newval;  	if (!READ_ONCE(net->ipv4.sysctl_tcp_moderate_rcvbuf) ||  	    (sk->sk_userlocks & SOCK_RCVBUF_LOCK))  		return; +	/* DRS is always one RTT late. */ +	rcvwin = newval << 1; +  	/* slow start: allow the sender to double its rate. */ -	rcvwin = tp->rcvq_space.space << 1; +	grow = (u64)rcvwin * (newval - oldval); +	do_div(grow, oldval); +	rcvwin += grow << 1;  	if (!RB_EMPTY_ROOT(&tp->out_of_order_queue))  		rcvwin += TCP_SKB_CB(tp->ooo_last_skb)->end_seq - tp->rcv_nxt; @@ -943,9 +952,7 @@ void tcp_rcv_space_adjust(struct sock *sk)  	trace_tcp_rcvbuf_grow(sk, time); -	tp->rcvq_space.space = copied; - -	tcp_rcvbuf_grow(sk); +	tcp_rcvbuf_grow(sk, copied);  new_measure:  	tp->rcvq_space.seq = tp->copied_seq; @@ -5270,7 +5277,7 @@ end:  	}  	/* do not grow rcvbuf for not-yet-accepted or orphaned sockets. */  	if (sk->sk_socket) -		tcp_rcvbuf_grow(sk); +		tcp_rcvbuf_grow(sk, tp->rcvq_space.space);  }  static int __must_check tcp_queue_rcv(struct sock *sk, struct sk_buff *skb, diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index bb3576ac0ad7..b94efb3050d2 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -2369,7 +2369,8 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb,  				 u32 max_segs)  {  	const struct inet_connection_sock *icsk = inet_csk(sk); -	u32 send_win, cong_win, limit, in_flight; +	u32 send_win, cong_win, limit, in_flight, threshold; +	u64 srtt_in_ns, expected_ack, how_far_is_the_ack;  	struct tcp_sock *tp = tcp_sk(sk);  	struct sk_buff *head;  	int win_divisor; @@ -2431,9 +2432,19 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb,  	head = tcp_rtx_queue_head(sk);  	if (!head)  		goto send_now; -	delta = tp->tcp_clock_cache - head->tstamp; -	/* If next ACK is likely to come too late (half srtt), do not defer */ -	if ((s64)(delta - (u64)NSEC_PER_USEC * (tp->srtt_us >> 4)) < 0) + +	srtt_in_ns = (u64)(NSEC_PER_USEC >> 3) * tp->srtt_us; +	/* When is the ACK expected ? */ +	expected_ack = head->tstamp + srtt_in_ns; +	/* How far from now is the ACK expected ? */ +	how_far_is_the_ack = expected_ack - tp->tcp_clock_cache; + +	/* If next ACK is likely to come too late, +	 * ie in more than min(1ms, half srtt), do not defer. +	 */ +	threshold = min(srtt_in_ns >> 1, NSEC_PER_MSEC); + +	if ((s64)(how_far_is_the_ack - threshold) > 0)  		goto send_now;  	/* Ok, it looks like it is advisable to defer. diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 95241093b7f0..30dfbf73729d 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1851,8 +1851,6 @@ void skb_consume_udp(struct sock *sk, struct sk_buff *skb, int len)  		sk_peek_offset_bwd(sk, len);  	if (!skb_shared(skb)) { -		if (unlikely(udp_skb_has_head_state(skb))) -			skb_release_head_state(skb);  		skb_attempt_defer_free(skb);  		return;  	}  | 
