add xdp_build_skb_from_frame utility routine
Subsystems (4)
v2 cover add xdp_build_skb_from_frame utility routine
Introduce __xdp_build_skb_from_frame and xdp_build_skb_from_frame routines to build the skb from a xdp_frame. Respect to __xdp_build_skb_from_frame, xdp_build_skb_from_frame will allocate the skb object.
Rely on __xdp_build_skb_from_frame/xdp_build_skb_from_frame in cpumap and veth code.
Changes since v1:
- fix a checkpatch warning
- improve commit log in patch 2/2
Lorenzo Bianconi (2):
net: xdp: introduce __xdp_build_skb_from_frame utility routine
net: xdp: introduce xdp_build_skb_from_frame utility routine
drivers/net/veth.c | 18 +++----------- include/net/xdp.h | 5 ++++ kernel/bpf/cpumap.c | 46 ++--------------------------------- net/core/xdp.c | 59 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 59 deletions(-)
Signature · 1 line
2.29.2
PATCH v2 1/2 net: xdp: introduce __xdp_build_skb_from_frame utility routine
Introduce __xdp_build_skb_from_frame utility routine to build the skb from xdp_frame. Rely on __xdp_build_skb_from_frame in cpumap code.
--- include/net/xdp.h | 3 +++ kernel/bpf/cpumap.c | 46 ++------------------------------------------- net/core/xdp.c | 44 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 44 deletions(-)
include/net/xdp.h +3 -0
@@ -164,6 +164,9 @@ void xdp_warn(const char *msg, const char *func, const int line);#define XDP_WARN (msg) xdp_warn(msg, __func__, __LINE__)struct xdp_frame *xdp_convert_zc_to_xdp_frame (struct xdp_buff *xdp); +struct sk_buff *__xdp_build_skb_from_frame (struct xdp_frame *xdpf, +struct sk_buff *skb, +struct net_device *dev);static inline void xdp_convert_frame_to_buff (struct xdp_frame *frame,struct xdp_buff *xdp)
kernel/bpf/cpumap.c +2 -44
58 lines not on this page · raw message
net/core/xdp.c +44 -0
47 lines not on this page · raw message
Signature · 1 line
2.29.2
PATCH v2 2/2 net: xdp: introduce xdp_build_skb_from_frame utility routine
In reply to Lorenzo BianconiIntroduce xdp_build_skb_from_frame utility routine to build the skb from xdp_frame. Respect to __xdp_build_skb_from_frame, xdp_build_skb_from_frame will allocate the skb object. Rely on xdp_build_skb_from_frame in veth driver.
Introduce missing xdp metadata support in veth_xdp_rcv_one routine. Add missing metadata support in veth_xdp_rcv_one().
--- drivers/net/veth.c | 18 +++--------------- include/net/xdp.h | 2 ++ net/core/xdp.c | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 15 deletions(-)
drivers/net/veth.c +3 -15
@@ -567,16 +567,10 @@ static struct sk_buff *veth_xdp_rcv_one(struct veth_rq *rq,struct veth_xdp_tx_bq *bq, struct veth_stats *stats) { - void *hard_start = frame->data - frame->headroom; -int len = frame->len, delta =0 ; struct xdp_frame orig_frame;struct bpf_prog *xdp_prog; -unsigned int headroom;struct sk_buff *skb; -/* bpf_xdp_adjust_head() assures BPF cannot access xdp_frame area */ - hard_start -=sizeof (struct xdp_frame ); -rcu_read_lock (); xdp_prog =rcu_dereference (rq->xdp_prog);if (likely (xdp_prog)) {
@@ -590,8 +584,8 @@ static struct sk_buff *veth_xdp_rcv_one(struct veth_rq *rq,switch (act) {case XDP_PASS : - delta = frame->data - xdp.data; - len = xdp.data_end - xdp.data; +if (xdp_update_frame_from_buff (&xdp, frame)) + goto err_xdp;break ;case XDP_TX : orig_frame = *frame;
@@ -629,18 +623,12 @@ static struct sk_buff *veth_xdp_rcv_one(struct veth_rq *rq, }rcu_read_unlock (); - headroom =sizeof (struct xdp_frame ) + frame->headroom - delta; - skb =veth_build_skb (hard_start, headroom, len, frame->frame_sz); + skb =xdp_build_skb_from_frame (frame, rq->dev);if (!skb) {xdp_return_frame (frame); stats->rx_drops++; - goto err; } -xdp_release_frame (frame); -xdp_scrub_frame (frame); - skb->protocol =eth_type_trans (skb, rq->dev); -err:return skb; err_xdp:rcu_read_unlock ();
include/net/xdp.h +2 -0
@@ -167,6 +167,8 @@ struct xdp_frame *xdp_convert_zc_to_xdp_frame(struct xdp_buff *xdp);struct sk_buff *__xdp_build_skb_from_frame (struct xdp_frame *xdpf,struct sk_buff *skb,struct net_device *dev); +struct sk_buff *xdp_build_skb_from_frame (struct xdp_frame *xdpf, +struct net_device *dev);static inline void xdp_convert_frame_to_buff (struct xdp_frame *frame,struct xdp_buff *xdp)
net/core/xdp.c +15 -0
@@ -557,3 +557,18 @@ struct sk_buff *__xdp_build_skb_from_frame(struct xdp_frame *xdpf,return skb; }EXPORT_SYMBOL_GPL (__xdp_build_skb_from_frame); + +struct sk_buff *xdp_build_skb_from_frame (struct xdp_frame *xdpf, +struct net_device *dev) +{ +struct sk_buff *skb; + + skb =kmem_cache_alloc (skbuff_head_cache,GFP_ATOMIC ); +if (unlikely (!skb)) +return NULL ; + +memset (skb,0 , offsetof(struct sk_buff , tail)); + +return __xdp_build_skb_from_frame (xdpf, skb, dev); +} +EXPORT_SYMBOL_GPL (xdp_build_skb_from_frame);
Signature · 1 line
2.29.2
This series was applied to bpf/bpf-next.git (refs/heads/master):
Hello:
This series was applied to bpf/bpf-next.git (refs/heads/master):
Quoted 11 lines · On Tue, 12 Jan 2021 19:26:11 +0100 you wrote:
Introduce
__xdp_build_skb_from_frameandxdp_build_skb_from_frameroutines to build the skb from axdp_frame. Respect to__xdp_build_skb_from_frame,xdp_build_skb_from_framewill allocate the skb object.
Rely on __xdp_build_skb_from_frame/xdp_build_skb_from_frame in cpumap and veth code.Changes since v1:
- fix a checkpatch warning
- improve commit log in patch 2/2[...]
Here is the summary with links:
- [v2,bpf-next,1/2] net: xdp: introduce __xdp_build_skb_from_frame utility routine
https://git.kernel.org/bpf/bpf-next/c/e753e92bbf33 - [v2,bpf-next,2/2] net: xdp: introduce xdp_build_skb_from_frame utility routine https://git.kernel.org/bpf/bpf-next/c/a2c2998d5c6b
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html