Commit b7b3fc8d authored by Ilya Leoshkevich's avatar Ilya Leoshkevich Committed by Daniel Borkmann

bpf: Support doubleword alignment in bpf_jit_binary_alloc

Currently passing alignment greater than 4 to bpf_jit_binary_alloc does
not work: in such cases it silently aligns only to 4 bytes.

On s390, in order to load a constant from memory in a large (>512k) BPF
program, one must use lgrl instruction, whose memory operand must be
aligned on an 8-byte boundary.

This patch makes it possible to request 8-byte alignment from
bpf_jit_binary_alloc, and also makes it issue a warning when an
unsupported alignment is requested.
Signed-off-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20191115123722.58462-1-iii@linux.ibm.com
parent e47a1799
...@@ -515,10 +515,12 @@ struct sock_fprog_kern { ...@@ -515,10 +515,12 @@ struct sock_fprog_kern {
struct sock_filter *filter; struct sock_filter *filter;
}; };
/* Some arches need doubleword alignment for their instructions and/or data */
#define BPF_IMAGE_ALIGNMENT 8
struct bpf_binary_header { struct bpf_binary_header {
u32 pages; u32 pages;
/* Some arches need word alignment for their instructions */ u8 image[] __aligned(BPF_IMAGE_ALIGNMENT);
u8 image[] __aligned(4);
}; };
struct bpf_prog { struct bpf_prog {
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/rcupdate.h> #include <linux/rcupdate.h>
#include <linux/perf_event.h> #include <linux/perf_event.h>
#include <linux/extable.h> #include <linux/extable.h>
#include <linux/log2.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
/* Registers */ /* Registers */
...@@ -815,6 +816,9 @@ bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr, ...@@ -815,6 +816,9 @@ bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr,
struct bpf_binary_header *hdr; struct bpf_binary_header *hdr;
u32 size, hole, start, pages; u32 size, hole, start, pages;
WARN_ON_ONCE(!is_power_of_2(alignment) ||
alignment > BPF_IMAGE_ALIGNMENT);
/* Most of BPF filters are really small, but if some of them /* Most of BPF filters are really small, but if some of them
* fill a page, allow at least 128 extra bytes to insert a * fill a page, allow at least 128 extra bytes to insert a
* random section of illegal instructions. * random section of illegal instructions.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment