]> www.infradead.org Git - nvme.git/commitdiff
selftests/bpf: Fix tests after fields reorder in struct file
authorSong Liu <song@kernel.org>
Thu, 27 Mar 2025 18:55:28 +0000 (11:55 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 3 Apr 2025 04:55:43 +0000 (21:55 -0700)
The change in struct file [1] moved f_ref to the 3rd cache line.
It made *(u64 *)file dereference invalid from the verifier point of view,
because btf_struct_walk() walks into f_lock field, which is 4-byte long.

Fix the selftests to deference the file pointer as a 4-byte access.

[1] commit e249056c91a2 ("fs: place f_ref to 3rd cache line in struct file to resolve false sharing")
Reported-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20250327185528.1740787-1-song@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/test_module_attach.c
tools/testing/selftests/bpf/progs/test_subprogs_extable.c

index fb07f5773888b05f0c653bc168769c85c99811fb..7f3c233943b3ae49a9b177bc12a52a6f85abd475 100644 (file)
@@ -117,7 +117,7 @@ int BPF_PROG(handle_fexit_ret, int arg, struct file *ret)
 
        bpf_probe_read_kernel(&buf, 8, ret);
        bpf_probe_read_kernel(&buf, 8, (char *)ret + 256);
-       *(volatile long long *)ret;
+       *(volatile int *)ret;
        *(volatile int *)&ret->f_mode;
        return 0;
 }
index e2a21fbd4e4423859bcbf0e25e284a2611796a96..dcac69f5928a722598bcff28e6f2bad90d7e576c 100644 (file)
@@ -21,7 +21,7 @@ static __u64 test_cb(struct bpf_map *map, __u32 *key, __u64 *val, void *data)
 SEC("fexit/bpf_testmod_return_ptr")
 int BPF_PROG(handle_fexit_ret_subprogs, int arg, struct file *ret)
 {
-       *(volatile long *)ret;
+       *(volatile int *)ret;
        *(volatile int *)&ret->f_mode;
        bpf_for_each_map_elem(&test_array, test_cb, NULL, 0);
        triggered++;
@@ -31,7 +31,7 @@ int BPF_PROG(handle_fexit_ret_subprogs, int arg, struct file *ret)
 SEC("fexit/bpf_testmod_return_ptr")
 int BPF_PROG(handle_fexit_ret_subprogs2, int arg, struct file *ret)
 {
-       *(volatile long *)ret;
+       *(volatile int *)ret;
        *(volatile int *)&ret->f_mode;
        bpf_for_each_map_elem(&test_array, test_cb, NULL, 0);
        triggered++;
@@ -41,7 +41,7 @@ int BPF_PROG(handle_fexit_ret_subprogs2, int arg, struct file *ret)
 SEC("fexit/bpf_testmod_return_ptr")
 int BPF_PROG(handle_fexit_ret_subprogs3, int arg, struct file *ret)
 {
-       *(volatile long *)ret;
+       *(volatile int *)ret;
        *(volatile int *)&ret->f_mode;
        bpf_for_each_map_elem(&test_array, test_cb, NULL, 0);
        triggered++;