Merge branch 'bpf-introduce-and-use-rcu_read_lock_dont_migrate'
Menglong Dong says: ==================== bpf: introduce and use rcu_read_lock_dont_migrate migrate_disable() and rcu_read_lock() are used to together in many case in bpf. However, when PREEMPT_RCU is not enabled, rcu_read_lock() will disable preemption, which indicate migrate_disable(), so we don't need to call it in this case. In this series, we introduce rcu_read_lock_dont_migrate and rcu_read_unlock_migrate, which will call migrate_disable and migrate_enable only when PREEMPT_RCU enabled. And use rcu_read_lock_dont_migrate in bpf subsystem. Changes since V2: * make rcu_read_lock_dont_migrate() more compatible by using IS_ENABLED() Changes since V1: * introduce rcu_read_lock_dont_migrate() instead of rcu_migrate_disable() + rcu_read_lock() ==================== Link: https://patch.msgid.link/20250821090609.42508-1-dongml2@chinatelecom.cn Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
@@ -962,6 +962,20 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)
|
||||
preempt_enable_notrace();
|
||||
}
|
||||
|
||||
static __always_inline void rcu_read_lock_dont_migrate(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_PREEMPT_RCU))
|
||||
migrate_disable();
|
||||
rcu_read_lock();
|
||||
}
|
||||
|
||||
static inline void rcu_read_unlock_migrate(void)
|
||||
{
|
||||
rcu_read_unlock();
|
||||
if (IS_ENABLED(CONFIG_PREEMPT_RCU))
|
||||
migrate_enable();
|
||||
}
|
||||
|
||||
/**
|
||||
* RCU_INIT_POINTER() - initialize an RCU protected pointer
|
||||
* @p: The pointer to be initialized.
|
||||
|
||||
@@ -45,8 +45,7 @@ void bpf_cgrp_storage_free(struct cgroup *cgroup)
|
||||
{
|
||||
struct bpf_local_storage *local_storage;
|
||||
|
||||
migrate_disable();
|
||||
rcu_read_lock();
|
||||
rcu_read_lock_dont_migrate();
|
||||
local_storage = rcu_dereference(cgroup->bpf_cgrp_storage);
|
||||
if (!local_storage)
|
||||
goto out;
|
||||
@@ -55,8 +54,7 @@ void bpf_cgrp_storage_free(struct cgroup *cgroup)
|
||||
bpf_local_storage_destroy(local_storage);
|
||||
bpf_cgrp_storage_unlock();
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
migrate_enable();
|
||||
rcu_read_unlock_migrate();
|
||||
}
|
||||
|
||||
static struct bpf_local_storage_data *
|
||||
|
||||
@@ -62,8 +62,7 @@ void bpf_inode_storage_free(struct inode *inode)
|
||||
if (!bsb)
|
||||
return;
|
||||
|
||||
migrate_disable();
|
||||
rcu_read_lock();
|
||||
rcu_read_lock_dont_migrate();
|
||||
|
||||
local_storage = rcu_dereference(bsb->storage);
|
||||
if (!local_storage)
|
||||
@@ -71,8 +70,7 @@ void bpf_inode_storage_free(struct inode *inode)
|
||||
|
||||
bpf_local_storage_destroy(local_storage);
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
migrate_enable();
|
||||
rcu_read_unlock_migrate();
|
||||
}
|
||||
|
||||
static void *bpf_fd_inode_storage_lookup_elem(struct bpf_map *map, void *key)
|
||||
|
||||
@@ -705,13 +705,11 @@ int bpf_iter_run_prog(struct bpf_prog *prog, void *ctx)
|
||||
migrate_enable();
|
||||
rcu_read_unlock_trace();
|
||||
} else {
|
||||
rcu_read_lock();
|
||||
migrate_disable();
|
||||
rcu_read_lock_dont_migrate();
|
||||
old_run_ctx = bpf_set_run_ctx(&run_ctx);
|
||||
ret = bpf_prog_run(prog, ctx);
|
||||
bpf_reset_run_ctx(old_run_ctx);
|
||||
migrate_enable();
|
||||
rcu_read_unlock();
|
||||
rcu_read_unlock_migrate();
|
||||
}
|
||||
|
||||
/* bpf program can only return 0 or 1:
|
||||
|
||||
@@ -70,8 +70,7 @@ void bpf_task_storage_free(struct task_struct *task)
|
||||
{
|
||||
struct bpf_local_storage *local_storage;
|
||||
|
||||
migrate_disable();
|
||||
rcu_read_lock();
|
||||
rcu_read_lock_dont_migrate();
|
||||
|
||||
local_storage = rcu_dereference(task->bpf_storage);
|
||||
if (!local_storage)
|
||||
@@ -81,8 +80,7 @@ void bpf_task_storage_free(struct task_struct *task)
|
||||
bpf_local_storage_destroy(local_storage);
|
||||
bpf_task_storage_unlock();
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
migrate_enable();
|
||||
rcu_read_unlock_migrate();
|
||||
}
|
||||
|
||||
static void *bpf_pid_task_storage_lookup_elem(struct bpf_map *map, void *key)
|
||||
|
||||
+2
-4
@@ -71,8 +71,7 @@ bpf_prog_run_array_cg(const struct cgroup_bpf *cgrp,
|
||||
u32 func_ret;
|
||||
|
||||
run_ctx.retval = retval;
|
||||
migrate_disable();
|
||||
rcu_read_lock();
|
||||
rcu_read_lock_dont_migrate();
|
||||
array = rcu_dereference(cgrp->effective[atype]);
|
||||
item = &array->items[0];
|
||||
old_run_ctx = bpf_set_run_ctx(&run_ctx.run_ctx);
|
||||
@@ -88,8 +87,7 @@ bpf_prog_run_array_cg(const struct cgroup_bpf *cgrp,
|
||||
item++;
|
||||
}
|
||||
bpf_reset_run_ctx(old_run_ctx);
|
||||
rcu_read_unlock();
|
||||
migrate_enable();
|
||||
rcu_read_unlock_migrate();
|
||||
return run_ctx.retval;
|
||||
}
|
||||
|
||||
|
||||
+6
-12
@@ -899,8 +899,7 @@ static __always_inline u64 notrace bpf_prog_start_time(void)
|
||||
static u64 notrace __bpf_prog_enter_recur(struct bpf_prog *prog, struct bpf_tramp_run_ctx *run_ctx)
|
||||
__acquires(RCU)
|
||||
{
|
||||
rcu_read_lock();
|
||||
migrate_disable();
|
||||
rcu_read_lock_dont_migrate();
|
||||
|
||||
run_ctx->saved_run_ctx = bpf_set_run_ctx(&run_ctx->run_ctx);
|
||||
|
||||
@@ -949,8 +948,7 @@ static void notrace __bpf_prog_exit_recur(struct bpf_prog *prog, u64 start,
|
||||
|
||||
update_prog_stats(prog, start);
|
||||
this_cpu_dec(*(prog->active));
|
||||
migrate_enable();
|
||||
rcu_read_unlock();
|
||||
rcu_read_unlock_migrate();
|
||||
}
|
||||
|
||||
static u64 notrace __bpf_prog_enter_lsm_cgroup(struct bpf_prog *prog,
|
||||
@@ -960,8 +958,7 @@ static u64 notrace __bpf_prog_enter_lsm_cgroup(struct bpf_prog *prog,
|
||||
/* Runtime stats are exported via actual BPF_LSM_CGROUP
|
||||
* programs, not the shims.
|
||||
*/
|
||||
rcu_read_lock();
|
||||
migrate_disable();
|
||||
rcu_read_lock_dont_migrate();
|
||||
|
||||
run_ctx->saved_run_ctx = bpf_set_run_ctx(&run_ctx->run_ctx);
|
||||
|
||||
@@ -974,8 +971,7 @@ static void notrace __bpf_prog_exit_lsm_cgroup(struct bpf_prog *prog, u64 start,
|
||||
{
|
||||
bpf_reset_run_ctx(run_ctx->saved_run_ctx);
|
||||
|
||||
migrate_enable();
|
||||
rcu_read_unlock();
|
||||
rcu_read_unlock_migrate();
|
||||
}
|
||||
|
||||
u64 notrace __bpf_prog_enter_sleepable_recur(struct bpf_prog *prog,
|
||||
@@ -1033,8 +1029,7 @@ static u64 notrace __bpf_prog_enter(struct bpf_prog *prog,
|
||||
struct bpf_tramp_run_ctx *run_ctx)
|
||||
__acquires(RCU)
|
||||
{
|
||||
rcu_read_lock();
|
||||
migrate_disable();
|
||||
rcu_read_lock_dont_migrate();
|
||||
|
||||
run_ctx->saved_run_ctx = bpf_set_run_ctx(&run_ctx->run_ctx);
|
||||
|
||||
@@ -1048,8 +1043,7 @@ static void notrace __bpf_prog_exit(struct bpf_prog *prog, u64 start,
|
||||
bpf_reset_run_ctx(run_ctx->saved_run_ctx);
|
||||
|
||||
update_prog_stats(prog, start);
|
||||
migrate_enable();
|
||||
rcu_read_unlock();
|
||||
rcu_read_unlock_migrate();
|
||||
}
|
||||
|
||||
void notrace __bpf_tramp_enter(struct bpf_tramp_image *tr)
|
||||
|
||||
Reference in New Issue
Block a user