Messages in this thread Patch in this message |  | | Subject | Re: ppoll() stuck on POLLIN while TCP peer is sending | From | Eric Dumazet <> | Date | Tue, 08 Jan 2013 18:54:42 -0800 |
| |
On Tue, 2013-01-08 at 18:32 -0800, Eric Dumazet wrote:
> > Hmm, it seems sk_filter() can return -ENOMEM because skb has the > pfmemalloc() set.
> > One TCP socket keeps retransmitting an SKB via loopback, and TCP stack > drops the packet again and again.
sock_init_data() sets sk->sk_allocation to GFP_KERNEL
Shouldnt it use (GFP_KERNEL | __GFP_NOMEMALLOC) instead ?
diff --git a/net/core/sock.c b/net/core/sock.c index bc131d4..76c4b39 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -286,6 +286,7 @@ void sk_set_memalloc(struct sock *sk) { sock_set_flag(sk, SOCK_MEMALLOC); sk->sk_allocation |= __GFP_MEMALLOC; + sk->sk_allocation &= ~__GFP_NOMEMALLOC; static_key_slow_inc(&memalloc_socks); } EXPORT_SYMBOL_GPL(sk_set_memalloc); @@ -294,6 +295,7 @@ void sk_clear_memalloc(struct sock *sk) { sock_reset_flag(sk, SOCK_MEMALLOC); sk->sk_allocation &= ~__GFP_MEMALLOC; + sk->sk_allocation |= __GFP_NOMEMALLOC; static_key_slow_dec(&memalloc_socks); /* @@ -2230,7 +2232,7 @@ void sock_init_data(struct socket *sock, struct sock *sk) init_timer(&sk->sk_timer); - sk->sk_allocation = GFP_KERNEL; + sk->sk_allocation = GFP_KERNEL | __GFP_NOMEMALLOC; sk->sk_rcvbuf = sysctl_rmem_default; sk->sk_sndbuf = sysctl_wmem_default; sk->sk_state = TCP_CLOSE;
|  |