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.
Showing the changes to include/linux (1 of 2 files). Show all
Unified · Split
| @@ -515,10 +515,12 @@ struct sock_fprog_kern { · 514 unmodified lines | |||
| 515 | struct sock_filter *filter; | 515 | struct sock_filter *filter; |
| 516 | }; | 516 | }; |
| 517 | 517 | ||
| 518 | /* Some arches need doubleword alignment for their instructions and/or data */ | ||
| 519 | #define BPF_IMAGE_ALIGNMENT 8 | ||
| 520 | |||
| 518 | struct bpf_binary_header { | 521 | struct bpf_binary_header { |
| 519 | u32 pages; | 522 | u32 pages; |
| 520 | /* Some arches need word alignment for their instructions */ | 523 | u8 image[] __aligned(BPF_IMAGE_ALIGNMENT); |
| 521 | u8 image[] __aligned(4); | ||
| 522 | }; | 524 | }; |
| 523 | 525 | ||
| 524 | struct bpf_prog { | 526 | struct bpf_prog { |