Please sign in to comment.
net: add a noref bit on skb dst
Use low order bit of skb->_skb_dst to tell dst is not refcounted. Change _skb_dst to _skb_refdst to make sure all uses are catched. skb_dst() returns the dst, regardless of noref bit set or not, but with a lockdep check to make sure a noref dst is not given if current user is not rcu protected. New skb_dst_set_noref() helper to set an notrefcounted dst on a skb. (with lockdep check) skb_dst_drop() drops a reference only if skb dst was refcounted. skb_dst_force() helper is used to force a refcount on dst, when skb is queued and not anymore RCU protected. Use skb_dst_force() in __sk_add_backlog(), __dev_xmit_skb() if !IFF_XMIT_DST_RELEASE or skb enqueued on qdisc queue, in sock_queue_rcv_skb(), in __nf_queue(). Use skb_dst_force() in dev_requeue_skb(). Note: dst_use_noref() still dirties dst, we might transform it later to do one dirtying per jiffies. Signed-off-by: Eric Dumazet <email@example.com> Signed-off-by: David S. Miller <firstname.lastname@example.org>
- Loading branch information...
Showing with 134 additions and 25 deletions.
- +54 −4 include/linux/skbuff.h
- +45 −3 include/net/dst.h
- +8 −5 include/net/sock.h
- +3 −0 net/core/dev.c
- +1 −1 net/core/skbuff.c
- +6 −0 net/core/sock.c
- +3 −3 net/ipv4/icmp.c
- +5 −4 net/ipv4/ip_options.c
- +3 −3 net/ipv4/netfilter.c
- +1 −1 net/ipv4/route.c
- +2 −0 net/netfilter/nf_queue.c
- +3 −1 net/sched/sch_generic.c