]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/bpf: assert BPF kfunc default trusted pointer semantics
authorMatt Bobrowski <mattbobrowski@google.com>
Tue, 13 Jan 2026 08:39:49 +0000 (08:39 +0000)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 14 Jan 2026 03:19:13 +0000 (19:19 -0800)
The BPF verifier was recently updated to treat pointers to struct types
returned from BPF kfuncs as implicitly trusted by default. Add a new
test case to exercise this new implicit trust semantic.

The KF_ACQUIRE flag was dropped from the bpf_get_root_mem_cgroup()
kfunc because it returns a global pointer to root_mem_cgroup without
performing any explicit reference counting. This makes it an ideal
candidate to verify the new implicit trusted pointer semantics.

Signed-off-by: Matt Bobrowski <mattbobrowski@google.com>
Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20260113083949.2502978-3-mattbobrowski@google.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/verifier.c
tools/testing/selftests/bpf/progs/verifier_memcontrol.c [new file with mode: 0644]

index 5829ffd70f8f2a5c8d798c0aead7307700ee60aa..38c5ba70100cb349c2126b280828affc1337a5a7 100644 (file)
@@ -61,6 +61,7 @@
 #include "verifier_masking.skel.h"
 #include "verifier_may_goto_1.skel.h"
 #include "verifier_may_goto_2.skel.h"
+#include "verifier_memcontrol.skel.h"
 #include "verifier_meta_access.skel.h"
 #include "verifier_movsx.skel.h"
 #include "verifier_mtu.skel.h"
@@ -202,6 +203,7 @@ void test_verifier_map_ret_val(void)          { RUN(verifier_map_ret_val); }
 void test_verifier_masking(void)              { RUN(verifier_masking); }
 void test_verifier_may_goto_1(void)           { RUN(verifier_may_goto_1); }
 void test_verifier_may_goto_2(void)           { RUN(verifier_may_goto_2); }
+void test_verifier_memcontrol(void)          { RUN(verifier_memcontrol); }
 void test_verifier_meta_access(void)          { RUN(verifier_meta_access); }
 void test_verifier_movsx(void)                 { RUN(verifier_movsx); }
 void test_verifier_mul(void)                  { RUN(verifier_mul); }
diff --git a/tools/testing/selftests/bpf/progs/verifier_memcontrol.c b/tools/testing/selftests/bpf/progs/verifier_memcontrol.c
new file mode 100644 (file)
index 0000000..1356495
--- /dev/null
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2026 Google LLC.
+ */
+
+#include <vmlinux.h>
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+#include "bpf_misc.h"
+
+SEC("syscall")
+__success __retval(0)
+int root_mem_cgroup_default_trusted(void *ctx)
+{
+       unsigned long usage;
+       struct mem_cgroup *root_mem_cgroup;
+
+       root_mem_cgroup = bpf_get_root_mem_cgroup();
+       if (!root_mem_cgroup)
+               return 1;
+
+       /*
+        * BPF kfunc bpf_get_root_mem_cgroup() returns a PTR_TO_BTF_ID |
+        * PTR_TRUSTED | PTR_MAYBE_NULL, therefore it should be accepted when
+        * passed to a BPF kfunc only accepting KF_TRUSTED_ARGS.
+        */
+       usage = bpf_mem_cgroup_usage(root_mem_cgroup);
+       __sink(usage);
+       return 0;
+}
+
+char _license[] SEC("license") = "GPL";