| From 5b119118504a823af253c972645061e64f8b45d1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 19 Dec 2018 17:00:23 +0100 |
| Subject: bpf/cpumap: make sure frame_size for build_skb is aligned if headroom |
| isn't |
| |
| From: Jesper Dangaard Brouer <brouer@redhat.com> |
| |
| [ Upstream commit 77ea5f4cbe2084db9ab021ba73fb7eadf1610884 ] |
| |
| The frame_size passed to build_skb must be aligned, else it is |
| possible that the embedded struct skb_shared_info gets unaligned. |
| |
| For correctness make sure that xdpf->headroom in included in the |
| alignment. No upstream drivers can hit this, as all XDP drivers provide |
| an aligned headroom. This was discovered when playing with implementing |
| XDP support for mvneta, which have a 2 bytes DSA header, and this |
| Marvell ARM64 platform didn't like doing atomic operations on an |
| unaligned skb_shinfo(skb)->dataref addresses. |
| |
| Fixes: 1c601d829ab0 ("bpf: cpumap xdp_buff to skb conversion and allocation") |
| Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> |
| Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/bpf/cpumap.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c |
| index 24aac0d0f4127..8974b3755670e 100644 |
| --- a/kernel/bpf/cpumap.c |
| +++ b/kernel/bpf/cpumap.c |
| @@ -183,7 +183,7 @@ static struct sk_buff *cpu_map_build_skb(struct bpf_cpu_map_entry *rcpu, |
| * is not at a fixed memory location, with mixed length |
| * packets, which is bad for cache-line hotness. |
| */ |
| - frame_size = SKB_DATA_ALIGN(xdpf->len) + xdpf->headroom + |
| + frame_size = SKB_DATA_ALIGN(xdpf->len + xdpf->headroom) + |
| SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); |
| |
| pkt_data_start = xdpf->data - xdpf->headroom; |
| -- |
| 2.20.1 |
| |