KFunc bpf_rcu_read_lock
Definition
This kfunc is used to define a RCU read lock region in the BPF program.
The end of such a region is marked by bpf_rcu_read_unlock
The current implementation does not support nested RCU read lock region in the program.
void bpf_rcu_read_lock()
Usage
struct task_struct {
...
struct task_struct *last_wakee;
struct task_struct __rcu *real_parent;
...
};
Let us say the program executes task = bpf_get_current_task_btf()
to get a
task
pointer. The basic rules are:
- '
real_parent = task->real_parent
should be insidebpf_rcu_read_lock
region. This is to simulatercu_dereference()
operation. Thereal_parent
is marked asMEM_RCU
only if (1).task->real_parent
is insidebpf_rcu_read_lock
region, and (2). task is atrusted_ptr
. SoMEM_RCU
marked pointer can be "trusted" inside thebpf_rcu_read_lock
region. last_wakee = real_parent->last_wakee
should be insidebpf_rcu_read_lock
region since it tries to access rcu protected memory.- the
last_wakee
pointer will be marked asPTR_UNTRUSTED
since in general it is not clear whether the object pointed bylast_wakee
is valid or not even insidebpf_rcu_read_lock
region.
Program types
The following program types can make use of this kfunc:
BPF_PROG_TYPE_CGROUP_SKB
BPF_PROG_TYPE_CGROUP_SOCK_ADDR
BPF_PROG_TYPE_LSM
BPF_PROG_TYPE_LWT_IN
BPF_PROG_TYPE_LWT_OUT
BPF_PROG_TYPE_LWT_SEG6LOCAL
BPF_PROG_TYPE_LWT_XMIT
BPF_PROG_TYPE_NETFILTER
BPF_PROG_TYPE_SCHED_ACT
BPF_PROG_TYPE_SCHED_CLS
BPF_PROG_TYPE_SK_SKB
BPF_PROG_TYPE_SOCKET_FILTER
BPF_PROG_TYPE_STRUCT_OPS
BPF_PROG_TYPE_SYSCALL
BPF_PROG_TYPE_TRACING
BPF_PROG_TYPE_XDP
Example
Docs could be improved
This part of the docs is incomplete, contributions are very welcome