tcp: fix over estimation in sk_forced_mem_schedule()

sk_forced_mem_schedule() has a bug similar to ones fixed
in commit 7c80b038d2 ("net: fix sk_wmem_schedule() and
sk_rmem_schedule() errors")

While this bug has little chance to trigger in old kernels,
we need to fix it before the following patch.

Fixes: d83769a580 ("tcp: fix possible deadlock in tcp_send_fin()")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
Reviewed-by: Shakeel Butt <shakeelb@google.com>
Reviewed-by: Wei Wang <weiwan@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Eric Dumazet 2022-06-14 10:17:33 -07:00 committed by David S. Miller
parent e8b03391b6
commit c4ee118561

View File

@ -3362,11 +3362,12 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
*/ */
void sk_forced_mem_schedule(struct sock *sk, int size) void sk_forced_mem_schedule(struct sock *sk, int size)
{ {
int amt; int delta, amt;
if (size <= sk->sk_forward_alloc) delta = size - sk->sk_forward_alloc;
if (delta <= 0)
return; return;
amt = sk_mem_pages(size); amt = sk_mem_pages(delta);
sk->sk_forward_alloc += amt << PAGE_SHIFT; sk->sk_forward_alloc += amt << PAGE_SHIFT;
sk_memory_allocated_add(sk, amt); sk_memory_allocated_add(sk, amt);