diff options
Diffstat (limited to 'kernel/bpf/bpf_task_storage.c')
| -rw-r--r-- | kernel/bpf/bpf_task_storage.c | 10 | 
1 files changed, 7 insertions, 3 deletions
| diff --git a/kernel/bpf/bpf_task_storage.c b/kernel/bpf/bpf_task_storage.c index ebfa8bc90892..5da7bed0f5f6 100644 --- a/kernel/bpf/bpf_task_storage.c +++ b/kernel/bpf/bpf_task_storage.c @@ -17,6 +17,7 @@  #include <uapi/linux/btf.h>  #include <linux/btf_ids.h>  #include <linux/fdtable.h> +#include <linux/rcupdate_trace.h>  DEFINE_BPF_STORAGE_CACHE(task_cache); @@ -59,7 +60,8 @@ task_storage_lookup(struct task_struct *task, struct bpf_map *map,  	struct bpf_local_storage *task_storage;  	struct bpf_local_storage_map *smap; -	task_storage = rcu_dereference(task->bpf_storage); +	task_storage = +		rcu_dereference_check(task->bpf_storage, bpf_rcu_lock_held());  	if (!task_storage)  		return NULL; @@ -229,6 +231,7 @@ BPF_CALL_4(bpf_task_storage_get, struct bpf_map *, map, struct task_struct *,  {  	struct bpf_local_storage_data *sdata; +	WARN_ON_ONCE(!bpf_rcu_lock_held());  	if (flags & ~(BPF_LOCAL_STORAGE_GET_F_CREATE))  		return (unsigned long)NULL; @@ -260,6 +263,7 @@ BPF_CALL_2(bpf_task_storage_delete, struct bpf_map *, map, struct task_struct *,  {  	int ret; +	WARN_ON_ONCE(!bpf_rcu_lock_held());  	if (!task)  		return -EINVAL; @@ -323,7 +327,7 @@ const struct bpf_func_proto bpf_task_storage_get_proto = {  	.ret_type = RET_PTR_TO_MAP_VALUE_OR_NULL,  	.arg1_type = ARG_CONST_MAP_PTR,  	.arg2_type = ARG_PTR_TO_BTF_ID, -	.arg2_btf_id = &btf_task_struct_ids[0], +	.arg2_btf_id = &btf_tracing_ids[BTF_TRACING_TYPE_TASK],  	.arg3_type = ARG_PTR_TO_MAP_VALUE_OR_NULL,  	.arg4_type = ARG_ANYTHING,  }; @@ -334,5 +338,5 @@ const struct bpf_func_proto bpf_task_storage_delete_proto = {  	.ret_type = RET_INTEGER,  	.arg1_type = ARG_CONST_MAP_PTR,  	.arg2_type = ARG_PTR_TO_BTF_ID, -	.arg2_btf_id = &btf_task_struct_ids[0], +	.arg2_btf_id = &btf_tracing_ids[BTF_TRACING_TYPE_TASK],  }; |