Loading include/net/udp.h +61 −0 Original line number Diff line number Diff line Loading @@ -302,6 +302,67 @@ struct sock *__udp6_lib_lookup(struct net *net, struct sock *udp6_lib_lookup_skb(struct sk_buff *skb, __be16 sport, __be16 dport); /* UDP uses skb->dev_scratch to cache as much information as possible and avoid * possibly multiple cache miss on dequeue() */ #if BITS_PER_LONG == 64 /* truesize, len and the bit needed to compute skb_csum_unnecessary will be on * cold cache lines at recvmsg time. * skb->len can be stored on 16 bits since the udp header has been already * validated and pulled. */ struct udp_dev_scratch { u32 truesize; u16 len; bool is_linear; bool csum_unnecessary; }; static inline unsigned int udp_skb_len(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->len; } static inline bool udp_skb_csum_unnecessary(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->csum_unnecessary; } static inline bool udp_skb_is_linear(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->is_linear; } #else static inline unsigned int udp_skb_len(struct sk_buff *skb) { return skb->len; } static inline bool udp_skb_csum_unnecessary(struct sk_buff *skb) { return skb_csum_unnecessary(skb); } static inline bool udp_skb_is_linear(struct sk_buff *skb) { return !skb_is_nonlinear(skb); } #endif static inline int copy_linear_skb(struct sk_buff *skb, int len, int off, struct iov_iter *to) { int n, copy = len - off; n = copy_to_iter(skb->data + off, copy, to); if (n == copy) return 0; return -EFAULT; } /* * SNMP statistics for UDP and UDP-Lite */ Loading net/ipv4/udp.c +0 −60 Original line number Diff line number Diff line Loading @@ -1163,24 +1163,7 @@ int udp_sendpage(struct sock *sk, struct page *page, int offset, return ret; } /* Copy as much information as possible into skb->dev_scratch to avoid * possibly multiple cache miss on dequeue(); */ #if BITS_PER_LONG == 64 /* we can store multiple info here: truesize, len and the bit needed to * compute skb_csum_unnecessary will be on cold cache lines at recvmsg * time. * skb->len can be stored on 16 bits since the udp header has been already * validated and pulled. */ struct udp_dev_scratch { u32 truesize; u16 len; bool is_linear; bool csum_unnecessary; }; static void udp_set_dev_scratch(struct sk_buff *skb) { struct udp_dev_scratch *scratch; Loading @@ -1197,22 +1180,6 @@ static int udp_skb_truesize(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->truesize; } static unsigned int udp_skb_len(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->len; } static bool udp_skb_csum_unnecessary(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->csum_unnecessary; } static bool udp_skb_is_linear(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->is_linear; } #else static void udp_set_dev_scratch(struct sk_buff *skb) { Loading @@ -1223,21 +1190,6 @@ static int udp_skb_truesize(struct sk_buff *skb) { return skb->dev_scratch; } static unsigned int udp_skb_len(struct sk_buff *skb) { return skb->len; } static bool udp_skb_csum_unnecessary(struct sk_buff *skb) { return skb_csum_unnecessary(skb); } static bool udp_skb_is_linear(struct sk_buff *skb) { return !skb_is_nonlinear(skb); } #endif /* fully reclaim rmem/fwd memory allocated for skb */ Loading Loading @@ -1598,18 +1550,6 @@ struct sk_buff *__skb_recv_udp(struct sock *sk, unsigned int flags, } EXPORT_SYMBOL_GPL(__skb_recv_udp); static int copy_linear_skb(struct sk_buff *skb, int len, int off, struct iov_iter *to) { int n, copy = len - off; n = copy_to_iter(skb->data + off, copy, to); if (n == copy) return 0; return -EFAULT; } /* * This should be easy, if there is something there we * return it, otherwise we block. Loading Loading
include/net/udp.h +61 −0 Original line number Diff line number Diff line Loading @@ -302,6 +302,67 @@ struct sock *__udp6_lib_lookup(struct net *net, struct sock *udp6_lib_lookup_skb(struct sk_buff *skb, __be16 sport, __be16 dport); /* UDP uses skb->dev_scratch to cache as much information as possible and avoid * possibly multiple cache miss on dequeue() */ #if BITS_PER_LONG == 64 /* truesize, len and the bit needed to compute skb_csum_unnecessary will be on * cold cache lines at recvmsg time. * skb->len can be stored on 16 bits since the udp header has been already * validated and pulled. */ struct udp_dev_scratch { u32 truesize; u16 len; bool is_linear; bool csum_unnecessary; }; static inline unsigned int udp_skb_len(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->len; } static inline bool udp_skb_csum_unnecessary(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->csum_unnecessary; } static inline bool udp_skb_is_linear(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->is_linear; } #else static inline unsigned int udp_skb_len(struct sk_buff *skb) { return skb->len; } static inline bool udp_skb_csum_unnecessary(struct sk_buff *skb) { return skb_csum_unnecessary(skb); } static inline bool udp_skb_is_linear(struct sk_buff *skb) { return !skb_is_nonlinear(skb); } #endif static inline int copy_linear_skb(struct sk_buff *skb, int len, int off, struct iov_iter *to) { int n, copy = len - off; n = copy_to_iter(skb->data + off, copy, to); if (n == copy) return 0; return -EFAULT; } /* * SNMP statistics for UDP and UDP-Lite */ Loading
net/ipv4/udp.c +0 −60 Original line number Diff line number Diff line Loading @@ -1163,24 +1163,7 @@ int udp_sendpage(struct sock *sk, struct page *page, int offset, return ret; } /* Copy as much information as possible into skb->dev_scratch to avoid * possibly multiple cache miss on dequeue(); */ #if BITS_PER_LONG == 64 /* we can store multiple info here: truesize, len and the bit needed to * compute skb_csum_unnecessary will be on cold cache lines at recvmsg * time. * skb->len can be stored on 16 bits since the udp header has been already * validated and pulled. */ struct udp_dev_scratch { u32 truesize; u16 len; bool is_linear; bool csum_unnecessary; }; static void udp_set_dev_scratch(struct sk_buff *skb) { struct udp_dev_scratch *scratch; Loading @@ -1197,22 +1180,6 @@ static int udp_skb_truesize(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->truesize; } static unsigned int udp_skb_len(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->len; } static bool udp_skb_csum_unnecessary(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->csum_unnecessary; } static bool udp_skb_is_linear(struct sk_buff *skb) { return ((struct udp_dev_scratch *)&skb->dev_scratch)->is_linear; } #else static void udp_set_dev_scratch(struct sk_buff *skb) { Loading @@ -1223,21 +1190,6 @@ static int udp_skb_truesize(struct sk_buff *skb) { return skb->dev_scratch; } static unsigned int udp_skb_len(struct sk_buff *skb) { return skb->len; } static bool udp_skb_csum_unnecessary(struct sk_buff *skb) { return skb_csum_unnecessary(skb); } static bool udp_skb_is_linear(struct sk_buff *skb) { return !skb_is_nonlinear(skb); } #endif /* fully reclaim rmem/fwd memory allocated for skb */ Loading Loading @@ -1598,18 +1550,6 @@ struct sk_buff *__skb_recv_udp(struct sock *sk, unsigned int flags, } EXPORT_SYMBOL_GPL(__skb_recv_udp); static int copy_linear_skb(struct sk_buff *skb, int len, int off, struct iov_iter *to) { int n, copy = len - off; n = copy_to_iter(skb->data + off, copy, to); if (n == copy) return 0; return -EFAULT; } /* * This should be easy, if there is something there we * return it, otherwise we block. Loading