Firstly, ensure programs successfully load when using all of the supported maps. Then, extend existing tests to test more cases at runtime. We are currently testing both the synchronous freeing of items and asynchronous destruction when map is freed, but the code needs to be adjusted a bit to be able to also accomodate support for percpu maps. We now do a delete on the item (and update for array maps which has a similar effect for kptrs) to perform a synchronous free of the kptr, and test destruction both for the synchronous and asynchronous deletion. Next time the program runs, it should observe the refcount as 1 since all existing references should have been released by then. By running the program after both possible paths freeing kptrs, we establish that they correctly release resources. Next, we augment the existing test to also test the same code path shared by all local storage maps using a task local storage map. Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> Link: https://lore.kernel.org/r/20230225154010.391965-4-memxor@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
36 lines
838 B
C
36 lines
838 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <vmlinux.h>
|
|
#include <bpf/bpf_tracing.h>
|
|
#include <bpf/bpf_helpers.h>
|
|
|
|
struct task_ls_map {
|
|
__uint(type, BPF_MAP_TYPE_TASK_STORAGE);
|
|
__uint(map_flags, BPF_F_NO_PREALLOC);
|
|
__type(key, int);
|
|
__type(value, int);
|
|
} task_ls_map SEC(".maps");
|
|
|
|
long gp_seq;
|
|
|
|
SEC("syscall")
|
|
int do_call_rcu_tasks_trace(void *ctx)
|
|
{
|
|
struct task_struct *current;
|
|
int *v;
|
|
|
|
current = bpf_get_current_task_btf();
|
|
v = bpf_task_storage_get(&task_ls_map, current, NULL, BPF_LOCAL_STORAGE_GET_F_CREATE);
|
|
if (!v)
|
|
return 1;
|
|
/* Invoke call_rcu_tasks_trace */
|
|
return bpf_task_storage_delete(&task_ls_map, current);
|
|
}
|
|
|
|
SEC("kprobe/rcu_tasks_trace_postgp")
|
|
int rcu_tasks_trace_postgp(void *ctx)
|
|
{
|
|
__sync_add_and_fetch(&gp_seq, 1);
|
|
return 0;
|
|
}
|
|
|
|
char _license[] SEC("license") = "GPL";
|