summaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorEric Dumazet <dada1@cosmosbay.com>2008-11-26 01:08:18 -0800
committerDavid S. Miller <davem@davemloft.net>2008-11-26 01:08:18 -0800
commit70355602879229c6f8bd694ec9c0814222bc4936 (patch)
treec970f5b6134fac0c8da11f20ae364c92ae80a8ad /net/core
parentdd24c00191d5e4a1ae896aafe33c6b8095ab4bd1 (diff)
downloadlinux-70355602879229c6f8bd694ec9c0814222bc4936.tar.gz
linux-70355602879229c6f8bd694ec9c0814222bc4936.tar.bz2
linux-70355602879229c6f8bd694ec9c0814222bc4936.zip
net: release skb->dst in sock_queue_rcv_skb()
When queuing a skb to sk->sk_receive_queue, we can release its dst, not anymore needed. Since current cpu did the dst_hold(), refcount is probably still hot int this cpu caches. This avoids readers to access the original dst to decrement its refcount, possibly a long time after packet reception. This should speedup UDP and RAW receive path. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/sock.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/net/core/sock.c b/net/core/sock.c
index 7a081b647bf9..b28764558a7d 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -289,7 +289,11 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
skb->dev = NULL;
skb_set_owner_r(skb, sk);
-
+ /*
+ * release dst right now while its hot
+ */
+ dst_release(skb->dst);
+ skb->dst = NULL;
/* Cache the SKB length before we tack it onto the receive
* queue. Once it is added it no longer belongs to us and
* may be freed by other threads of control pulling packets