tools/testing/selftests/bpf/progs/iters_testmod.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/progs/iters_testmod.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/bpf/progs/iters_testmod.c
Extension
.c
Size
3947 bytes
Lines
172
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0

#include "vmlinux.h"
#include "bpf_experimental.h"
#include <bpf/bpf_helpers.h>
#include "bpf_misc.h"
#include "../test_kmods/bpf_testmod_kfunc.h"

char _license[] SEC("license") = "GPL";

SEC("raw_tp/sys_enter")
__success
int iter_next_trusted(const void *ctx)
{
	struct task_struct *cur_task = bpf_get_current_task_btf();
	struct bpf_iter_task_vma vma_it;
	struct vm_area_struct *vma_ptr;

	bpf_iter_task_vma_new(&vma_it, cur_task, 0);

	vma_ptr = bpf_iter_task_vma_next(&vma_it);
	if (vma_ptr == NULL)
		goto out;

	bpf_kfunc_trusted_vma_test(vma_ptr);
out:
	bpf_iter_task_vma_destroy(&vma_it);
	return 0;
}

SEC("raw_tp/sys_enter")
__failure __msg("Possibly NULL pointer passed to trusted R1")
int iter_next_trusted_or_null(const void *ctx)
{
	struct task_struct *cur_task = bpf_get_current_task_btf();
	struct bpf_iter_task_vma vma_it;
	struct vm_area_struct *vma_ptr;

	bpf_iter_task_vma_new(&vma_it, cur_task, 0);

	vma_ptr = bpf_iter_task_vma_next(&vma_it);

	bpf_kfunc_trusted_vma_test(vma_ptr);

	bpf_iter_task_vma_destroy(&vma_it);
	return 0;
}

SEC("raw_tp/sys_enter")
__success
int iter_next_rcu(const void *ctx)
{
	struct task_struct *cur_task = bpf_get_current_task_btf();
	struct bpf_iter_task task_it;
	struct task_struct *task_ptr;

	bpf_iter_task_new(&task_it, cur_task, 0);

	task_ptr = bpf_iter_task_next(&task_it);
	if (task_ptr == NULL)
		goto out;

	bpf_kfunc_rcu_task_test(task_ptr);
out:
	bpf_iter_task_destroy(&task_it);
	return 0;
}

SEC("raw_tp/sys_enter")
__failure __msg("Possibly NULL pointer passed to trusted R1")
int iter_next_rcu_or_null(const void *ctx)
{
	struct task_struct *cur_task = bpf_get_current_task_btf();
	struct bpf_iter_task task_it;
	struct task_struct *task_ptr;

	bpf_iter_task_new(&task_it, cur_task, 0);

	task_ptr = bpf_iter_task_next(&task_it);

	bpf_kfunc_rcu_task_test(task_ptr);

	bpf_iter_task_destroy(&task_it);
	return 0;
}

SEC("raw_tp/sys_enter")
__failure __msg("R1 must be referenced or trusted")
int iter_next_rcu_not_trusted(const void *ctx)
{

Annotation

Implementation Notes