tcp: avoid a possible divide by zero
sysctl_tcp_tso_win_divisor might be set to zero while one cpu runs in tcp_tso_should_defer(). Make sure we dont allow a divide by zero by reading sysctl_tcp_tso_win_divisor exactly once. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c7757fdb41
commit
ad9f4f50fe
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue