diff options
| author | Alexei Starovoitov <ast@kernel.org> | 2018-12-01 08:38:49 +0300 |
|---|---|---|
| committer | Alexei Starovoitov <ast@kernel.org> | 2018-12-01 08:38:49 +0300 |
| commit | 9ffd05d9b78a2fb393d31936886c320b1d6e438f (patch) | |
| tree | 64414ade83109cdb78f8a702d58ae59f1b72e7b8 /include | |
| parent | 88945f460603ad8909b556c67a9229bb23188d41 (diff) | |
| parent | 0a68632488aa0129ed530af9ae9e8573f5650812 (diff) | |
| download | linux-9ffd05d9b78a2fb393d31936886c320b1d6e438f.tar.xz | |
Merge branch 'improve-test-coverage-sparc'
David Miller says:
====================
On sparc64 a ton of test cases in test_verifier.c fail because
the memory accesses in the test case are unaligned (or cannot
be proven to be aligned by the verifier).
Perhaps we can eventually try to (carefully) modify each test case
which has this problem to not use unaligned accesses but:
1) That is delicate work.
2) The changes might not fully respect the original
intention of the testcase.
3) In some cases, such a transformation might not even
be feasible at all.
So add an "any alignment" flag to tell the verifier to forcefully
disable it's alignment checks completely.
test_verifier.c is then annotated to use this flag when necessary.
The presence of the flag in each test case is good documentation to
anyone who wants to actually tackle the job of eliminating the
unaligned memory accesses in the test cases.
I've also seen several weird things in test cases, like trying to
access __skb->mark in a packet buffer.
This gets rid of 104 test_verifier.c failures on sparc64.
Changes since v1:
1) Explain the new BPF_PROG_LOAD flag in easier to understand terms.
Suggested by Alexei.
2) Make bpf_verify_program() just take a __u32 prog_flags instead of
just accumulating boolean arguments over and over. Also suggested
by Alexei.
Changes since RFC:
1) Only the admin can allow the relaxation of alignment restrictions
on inefficient unaligned access architectures.
2) Use F_NEEDS_EFFICIENT_UNALIGNED_ACCESS instead of making a new
flag.
3) Annotate in the output, when we have a test case that the verifier
accepted but we did not try to execute because we are on an
inefficient unaligned access platform. Maybe with some arch
machinery we can avoid this in the future.
Signed-off-by: David S. Miller <davem@davemloft.net>
====================
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'include')
| -rw-r--r-- | include/uapi/linux/bpf.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 597afdbc1ab9..8050caea7495 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -232,6 +232,20 @@ enum bpf_attach_type { */ #define BPF_F_STRICT_ALIGNMENT (1U << 0) +/* If BPF_F_ANY_ALIGNMENT is used in BPF_PROF_LOAD command, the + * verifier will allow any alignment whatsoever. On platforms + * with strict alignment requirements for loads ands stores (such + * as sparc and mips) the verifier validates that all loads and + * stores provably follow this requirement. This flag turns that + * checking and enforcement off. + * + * It is mostly used for testing when we want to validate the + * context and memory access aspects of the verifier, but because + * of an unaligned access the alignment check would trigger before + * the one we are interested in. + */ +#define BPF_F_ANY_ALIGNMENT (1U << 1) + /* when bpf_ldimm64->src_reg == BPF_PSEUDO_MAP_FD, bpf_ldimm64->imm == fd */ #define BPF_PSEUDO_MAP_FD 1 |
