selftests/bpf: Mark tests that require unaligned memory access
authorBjörn Töpel <bjorn.topel@gmail.com>
Wed, 18 Nov 2020 07:16:40 +0000 (08:16 +0100)
committerAndrii Nakryiko <andrii@kernel.org>
Thu, 19 Nov 2020 01:45:35 +0000 (17:45 -0800)
A lot of tests require unaligned memory access to work. Mark the tests
as such, so that they can be avoided on unsupported architectures such
as RISC-V.

Signed-off-by: Björn Töpel <bjorn.topel@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Luke Nelson <luke.r.nels@gmail.com>
Link: https://lore.kernel.org/bpf/20201118071640.83773-4-bjorn.topel@gmail.com
tools/testing/selftests/bpf/verifier/ctx_sk_lookup.c
tools/testing/selftests/bpf/verifier/direct_value_access.c
tools/testing/selftests/bpf/verifier/map_ptr.c
tools/testing/selftests/bpf/verifier/raw_tp_writable.c
tools/testing/selftests/bpf/verifier/ref_tracking.c
tools/testing/selftests/bpf/verifier/regalloc.c
tools/testing/selftests/bpf/verifier/wide_access.c

index 2ad5f974451c3ffe265c940b7d850d2787539253..fb13ca2d5606823507002ca4a7f5094287f20260 100644 (file)
        .result = REJECT,
        .prog_type = BPF_PROG_TYPE_SK_LOOKUP,
        .expected_attach_type = BPF_SK_LOOKUP,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "invalid 8-byte read from bpf_sk_lookup remote_ip4 field",
        .result = REJECT,
        .prog_type = BPF_PROG_TYPE_SK_LOOKUP,
        .expected_attach_type = BPF_SK_LOOKUP,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "invalid 8-byte read from bpf_sk_lookup remote_port field",
        .result = REJECT,
        .prog_type = BPF_PROG_TYPE_SK_LOOKUP,
        .expected_attach_type = BPF_SK_LOOKUP,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "invalid 8-byte read from bpf_sk_lookup local_ip4 field",
        .result = REJECT,
        .prog_type = BPF_PROG_TYPE_SK_LOOKUP,
        .expected_attach_type = BPF_SK_LOOKUP,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "invalid 8-byte read from bpf_sk_lookup local_port field",
        .result = REJECT,
        .prog_type = BPF_PROG_TYPE_SK_LOOKUP,
        .expected_attach_type = BPF_SK_LOOKUP,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 /* invalid 1,2,4-byte reads from 8-byte fields in bpf_sk_lookup */
 {
        .result = REJECT,
        .prog_type = BPF_PROG_TYPE_SK_LOOKUP,
        .expected_attach_type = BPF_SK_LOOKUP,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "invalid 4-byte unaligned read from bpf_sk_lookup at even offset",
        .result = REJECT,
        .prog_type = BPF_PROG_TYPE_SK_LOOKUP,
        .expected_attach_type = BPF_SK_LOOKUP,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 /* in-bound and out-of-bound writes to bpf_sk_lookup */
 {
index 988f46a1a4c7307bc9c42d96915398e4e34f0a1a..c0648dc009b5274170bd5f7305441c6b45a62e8e 100644 (file)
@@ -69,6 +69,7 @@
        .fixup_map_array_48b = { 1 },
        .result = REJECT,
        .errstr = "R1 min value is outside of the allowed memory range",
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "direct map access, write test 7",
        .fixup_map_array_48b = { 1, 3 },
        .result = REJECT,
        .errstr = "invalid access to map value, value_size=48 off=47 size=2",
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "direct map access, write test 17",
        .fixup_map_array_48b = { 1, 3 },
        .result = REJECT,
        .errstr = "invalid access to map value, value_size=48 off=47 size=2",
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "direct map access, write test 18",
index 637f9293bda846bcf5687656007574473ce3a614..b117bdd3806d8789c2d15c4729b4c5c2504f5477 100644 (file)
@@ -44,6 +44,7 @@
        .errstr_unpriv = "bpf_array access is allowed only to CAP_PERFMON and CAP_SYS_ADMIN",
        .result = REJECT,
        .errstr = "cannot access ptr member ops with moff 0 in struct bpf_map with off 1 size 4",
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "bpf_map_ptr: read ops field accepted",
index 95b5d70a1dc126a3e5871e8d060df294571cf7e1..2978fb5a769d35113dc4c8975989a4e65351970c 100644 (file)
@@ -31,4 +31,5 @@
        .fixup_map_hash_8b = { 1, },
        .prog_type = BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE,
        .errstr = "R6 invalid variable buffer offset: off=0, var_off=(0x0; 0xffffffff)",
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
index 006b5bd99c089321658d6039acec2dbe24069787..3b6ee009c00b648e5b1d92f8fd257aa1a7cfe86a 100644 (file)
        .prog_type = BPF_PROG_TYPE_SCHED_CLS,
        .result = REJECT,
        .errstr = "invalid mem access",
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "reference tracking: use ptr from bpf_sk_fullsock() after release",
        .prog_type = BPF_PROG_TYPE_SCHED_CLS,
        .result = REJECT,
        .errstr = "invalid mem access",
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "reference tracking: use ptr from bpf_sk_fullsock(tp) after release",
        .prog_type = BPF_PROG_TYPE_SCHED_CLS,
        .result = REJECT,
        .errstr = "invalid mem access",
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "reference tracking: use sk after bpf_sk_release(tp)",
        .prog_type = BPF_PROG_TYPE_SCHED_CLS,
        .result = REJECT,
        .errstr = "invalid mem access",
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "reference tracking: use ptr from bpf_get_listener_sock() after bpf_sk_release(sk)",
index 4ad7e05de70680f0513a9140c8818bc23be71ad8..bb0dd89dd212b5f27fabe8d44932710696cb1208 100644 (file)
@@ -21,6 +21,7 @@
        .fixup_map_hash_48b = { 4 },
        .result = ACCEPT,
        .prog_type = BPF_PROG_TYPE_TRACEPOINT,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "regalloc negative",
@@ -71,6 +72,7 @@
        .fixup_map_hash_48b = { 4 },
        .result = ACCEPT,
        .prog_type = BPF_PROG_TYPE_TRACEPOINT,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "regalloc src_reg negative",
@@ -97,6 +99,7 @@
        .result = REJECT,
        .errstr = "invalid access to map value, value_size=48 off=44 size=8",
        .prog_type = BPF_PROG_TYPE_TRACEPOINT,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "regalloc and spill",
        .fixup_map_hash_48b = { 4 },
        .result = ACCEPT,
        .prog_type = BPF_PROG_TYPE_TRACEPOINT,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "regalloc and spill negative",
        .result = REJECT,
        .errstr = "invalid access to map value, value_size=48 off=48 size=8",
        .prog_type = BPF_PROG_TYPE_TRACEPOINT,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "regalloc three regs",
        .fixup_map_hash_48b = { 4 },
        .result = ACCEPT,
        .prog_type = BPF_PROG_TYPE_TRACEPOINT,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "regalloc after call",
        .fixup_map_hash_48b = { 4 },
        .result = ACCEPT,
        .prog_type = BPF_PROG_TYPE_TRACEPOINT,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "regalloc in callee",
        .fixup_map_hash_48b = { 4 },
        .result = ACCEPT,
        .prog_type = BPF_PROG_TYPE_TRACEPOINT,
+       .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
 {
        "regalloc, spill, JEQ",
index ccade9312d217ce657b7c4fd1193f2ce2af4903b..55af248efa93b2936b6074b8d8ca63571728b7b8 100644 (file)
@@ -1,4 +1,4 @@
-#define BPF_SOCK_ADDR_STORE(field, off, res, err) \
+#define BPF_SOCK_ADDR_STORE(field, off, res, err, flgs)        \
 { \
        "wide store to bpf_sock_addr." #field "[" #off "]", \
        .insns = { \
        .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, \
        .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, \
        .errstr = err, \
+       .flags = flgs, \
 }
 
 /* user_ip6[0] is u64 aligned */
 BPF_SOCK_ADDR_STORE(user_ip6, 0, ACCEPT,
-                   NULL),
+                   NULL, 0),
 BPF_SOCK_ADDR_STORE(user_ip6, 1, REJECT,
-                   "invalid bpf_context access off=12 size=8"),
+                   "invalid bpf_context access off=12 size=8",
+                   F_NEEDS_EFFICIENT_UNALIGNED_ACCESS),
 BPF_SOCK_ADDR_STORE(user_ip6, 2, ACCEPT,
-                   NULL),
+                   NULL, 0),
 BPF_SOCK_ADDR_STORE(user_ip6, 3, REJECT,
-                   "invalid bpf_context access off=20 size=8"),
+                   "invalid bpf_context access off=20 size=8",
+                   F_NEEDS_EFFICIENT_UNALIGNED_ACCESS),
 
 /* msg_src_ip6[0] is _not_ u64 aligned */
 BPF_SOCK_ADDR_STORE(msg_src_ip6, 0, REJECT,
-                   "invalid bpf_context access off=44 size=8"),
+                   "invalid bpf_context access off=44 size=8",
+                   F_NEEDS_EFFICIENT_UNALIGNED_ACCESS),
 BPF_SOCK_ADDR_STORE(msg_src_ip6, 1, ACCEPT,
-                   NULL),
+                   NULL, 0),
 BPF_SOCK_ADDR_STORE(msg_src_ip6, 2, REJECT,
-                   "invalid bpf_context access off=52 size=8"),
+                   "invalid bpf_context access off=52 size=8",
+                   F_NEEDS_EFFICIENT_UNALIGNED_ACCESS),
 BPF_SOCK_ADDR_STORE(msg_src_ip6, 3, REJECT,
-                   "invalid bpf_context access off=56 size=8"),
+                   "invalid bpf_context access off=56 size=8", 0),
 
 #undef BPF_SOCK_ADDR_STORE
 
-#define BPF_SOCK_ADDR_LOAD(field, off, res, err) \
+#define BPF_SOCK_ADDR_LOAD(field, off, res, err, flgs) \
 { \
        "wide load from bpf_sock_addr." #field "[" #off "]", \
        .insns = { \
@@ -48,26 +53,31 @@ BPF_SOCK_ADDR_STORE(msg_src_ip6, 3, REJECT,
        .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, \
        .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, \
        .errstr = err, \
+       .flags = flgs, \
 }
 
 /* user_ip6[0] is u64 aligned */
 BPF_SOCK_ADDR_LOAD(user_ip6, 0, ACCEPT,
-                  NULL),
+                  NULL, 0),
 BPF_SOCK_ADDR_LOAD(user_ip6, 1, REJECT,
-                  "invalid bpf_context access off=12 size=8"),
+                  "invalid bpf_context access off=12 size=8",
+                   F_NEEDS_EFFICIENT_UNALIGNED_ACCESS),
 BPF_SOCK_ADDR_LOAD(user_ip6, 2, ACCEPT,
-                  NULL),
+                  NULL, 0),
 BPF_SOCK_ADDR_LOAD(user_ip6, 3, REJECT,
-                  "invalid bpf_context access off=20 size=8"),
+                  "invalid bpf_context access off=20 size=8",
+                   F_NEEDS_EFFICIENT_UNALIGNED_ACCESS),
 
 /* msg_src_ip6[0] is _not_ u64 aligned */
 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 0, REJECT,
-                  "invalid bpf_context access off=44 size=8"),
+                  "invalid bpf_context access off=44 size=8",
+                   F_NEEDS_EFFICIENT_UNALIGNED_ACCESS),
 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 1, ACCEPT,
-                  NULL),
+                  NULL, 0),
 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 2, REJECT,
-                  "invalid bpf_context access off=52 size=8"),
+                  "invalid bpf_context access off=52 size=8",
+                   F_NEEDS_EFFICIENT_UNALIGNED_ACCESS),
 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 3, REJECT,
-                  "invalid bpf_context access off=56 size=8"),
+                  "invalid bpf_context access off=56 size=8", 0),
 
 #undef BPF_SOCK_ADDR_LOAD