From afef2004d5595a144f687679a0dc8dab9a915ec2 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 21 Dec 2011 07:11:44 +0000 Subject: [PATCH] --- yaml --- r: 276991 b: refs/heads/master c: 0fd7bac6b6157eed6cf0cb86a1e88ba29e57c033 h: refs/heads/master i: 276989: 14ceb469e884d31adbcaf0428dee8f9544939ef0 276987: 50d6e2d16a2d36e3d1eeeb053a2b111960fd7cd9 276983: 53f916e056f82a34c4d45cfe47ddfcce8b0bf5a9 276975: de73fd4f001c9134ab85e7b4efe0e8e8d5583508 276959: 1281ed2f9db254f612da585fd7580badd437c4d4 276927: 1e4ff69609e016275faa11a2620db177f5ba8a19 276863: 33bb4e426d9d14ecd945ce626d9682499aae69b9 276735: a2b7d2ab53ac298fa7c45e081b400c5217525baf 276479: fb4d3be6a95f9de1b4e69d9f5ccc5225b084aa7d v: v3 --- [refs] | 2 +- trunk/include/net/sock.h | 4 +++- trunk/net/core/sock.c | 6 +----- trunk/net/packet/af_packet.c | 6 ++---- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index 534551e70f27..e7b06cdefcf7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a0a129f8b6cff54ab479324a54aefdab5db4f240 +refs/heads/master: 0fd7bac6b6157eed6cf0cb86a1e88ba29e57c033 diff --git a/trunk/include/net/sock.h b/trunk/include/net/sock.h index abb6e0f0c3c3..32e39371fba6 100644 --- a/trunk/include/net/sock.h +++ b/trunk/include/net/sock.h @@ -637,12 +637,14 @@ static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb) /* * Take into account size of receive queue and backlog queue + * Do not take into account this skb truesize, + * to allow even a single big packet to come. */ static inline bool sk_rcvqueues_full(const struct sock *sk, const struct sk_buff *skb) { unsigned int qsize = sk->sk_backlog.len + atomic_read(&sk->sk_rmem_alloc); - return qsize + skb->truesize > sk->sk_rcvbuf; + return qsize > sk->sk_rcvbuf; } /* The per-socket spinlock must be held here. */ diff --git a/trunk/net/core/sock.c b/trunk/net/core/sock.c index 4ed7b1d12f5e..b23f174ab84c 100644 --- a/trunk/net/core/sock.c +++ b/trunk/net/core/sock.c @@ -288,11 +288,7 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) unsigned long flags; struct sk_buff_head *list = &sk->sk_receive_queue; - /* Cast sk->rcvbuf to unsigned... It's pointless, but reduces - number of warnings when compiling with -W --ANK - */ - if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= - (unsigned)sk->sk_rcvbuf) { + if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) { atomic_inc(&sk->sk_drops); trace_sock_rcvqueue_full(sk, skb); return -ENOMEM; diff --git a/trunk/net/packet/af_packet.c b/trunk/net/packet/af_packet.c index 82a6f34d39d0..3891702b81df 100644 --- a/trunk/net/packet/af_packet.c +++ b/trunk/net/packet/af_packet.c @@ -1630,8 +1630,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, if (snaplen > res) snaplen = res; - if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= - (unsigned)sk->sk_rcvbuf) + if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) goto drop_n_acct; if (skb_shared(skb)) { @@ -1762,8 +1761,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, if (po->tp_version <= TPACKET_V2) { if (macoff + snaplen > po->rx_ring.frame_size) { if (po->copy_thresh && - atomic_read(&sk->sk_rmem_alloc) + skb->truesize - < (unsigned)sk->sk_rcvbuf) { + atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf) { if (skb_shared(skb)) { copy_skb = skb_clone(skb, GFP_ATOMIC); } else {