|
@@ -1512,6 +1512,7 @@ static int tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb)
|
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
|
const struct inet_connection_sock *icsk = inet_csk(sk);
|
|
|
u32 send_win, cong_win, limit, in_flight;
|
|
|
+ int win_divisor;
|
|
|
|
|
|
if (TCP_SKB_CB(skb)->flags & TCPHDR_FIN)
|
|
|
goto send_now;
|
|
@@ -1543,13 +1544,14 @@ static int tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb)
|
|
|
if ((skb != tcp_write_queue_tail(sk)) && (limit >= skb->len))
|
|
|
goto send_now;
|
|
|
|
|
|
- if (sysctl_tcp_tso_win_divisor) {
|
|
|
+ win_divisor = ACCESS_ONCE(sysctl_tcp_tso_win_divisor);
|
|
|
+ if (win_divisor) {
|
|
|
u32 chunk = min(tp->snd_wnd, tp->snd_cwnd * tp->mss_cache);
|
|
|
|
|
|
/* If at least some fraction of a window is available,
|
|
|
* just use it.
|
|
|
*/
|
|
|
- chunk /= sysctl_tcp_tso_win_divisor;
|
|
|
+ chunk /= win_divisor;
|
|
|
if (limit >= chunk)
|
|
|
goto send_now;
|
|
|
} else {
|