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: Ilya Leoshkevich <iii@linux.ibm.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20191115123722.58462-1-iii@linux.ibm.com
This commit is contained in:
parent
e47a179997
commit
b7b3fc8dd9
@ -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 @@
|
|||||||
#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,
|
|||||||
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.
|
||||||
|
Loading…
Reference in New Issue
Block a user