selftests/bpf: assert BPF kfunc default trusted pointer semantics

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>
This commit is contained in:
Matt Bobrowski 2026-01-13 08:39:49 +00:00 committed by Alexei Starovoitov
parent e463b6de9d
commit bbdbed193b
2 changed files with 34 additions and 0 deletions

View 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); }

View File

@ -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";