diff options
author | Eric Dumazet <dada1@cosmosbay.com> | 2008-11-26 01:08:18 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-11-26 01:08:18 -0800 |
commit | 70355602879229c6f8bd694ec9c0814222bc4936 (patch) | |
tree | c970f5b6134fac0c8da11f20ae364c92ae80a8ad /net/core/sock.c | |
parent | dd24c00191d5e4a1ae896aafe33c6b8095ab4bd1 (diff) | |
download | linux-stable-70355602879229c6f8bd694ec9c0814222bc4936.tar.gz linux-stable-70355602879229c6f8bd694ec9c0814222bc4936.tar.bz2 linux-stable-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/sock.c')
-rw-r--r-- | net/core/sock.c | 6 |
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 |