Message ID | 169272714720.1975370.12172959079424954030.stgit@firesoul (mailing list archive) |
---|---|
State | RFC |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | veth: reduce reallocations of SKBs when XDP bpf-prog is loaded | expand |
diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 953f6d8f8db0..be7b62f57087 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -897,12 +897,13 @@ static struct sk_buff *veth_xdp_rcv_skb(struct veth_rq *rq, rcu_read_unlock(); /* check if bpf_xdp_adjust_head was used */ - off = orig_data - xdp->data; - if (off > 0) - __skb_push(skb, off); - else if (off < 0) - __skb_pull(skb, -off); - + off = xdp->data - orig_data; + if (off) { + if (off > 0) + __skb_pull(skb, off); + else if (off < 0) + __skb_push(skb, -off); + } skb_reset_mac_header(skb); /* check if bpf_xdp_adjust_tail was used */
This is a consistency patch, no functional change. Both veth_xdp_rcv_skb() and bpf_prog_run_generic_xdp() checks if XDP bpf_prog adjusted packet head via BPF-helper bpf_xdp_adjust_head(). The order of subtracting orig_data and xdp->data are opposite between the two functions. This is confusing when reviewing and reading the code. This patch choose to follow generic-XDP and adjust veth_xdp_rcv_skb(). In veth_xdp_rcv_skb() the skb_mac_header length have been __skb_push()'ed. Thus, we skip the skb->mac_header adjustments like bpf_prog_run_generic_xdp() and instead do a skb_reset_mac_header() as skb->data point to Eth header. Signed-off-by: Jesper Dangaard Brouer <hawk@kernel.org> --- drivers/net/veth.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)