On Fri, Feb 07, 2025 at 07:37:51PM -0800, Alexei Starovoitov wrote: > On Wed, Feb 5, 2025 at 11:35 AM Juntong Deng <juntong.deng@xxxxxxxxxxx> wrote: > > > > This patch adds filter for scx_kfunc_ids_unlocked. > > > > The kfuncs in the scx_kfunc_ids_unlocked set can be used in init, exit, > > cpu_online, cpu_offline, init_task, dump, cgroup_init, cgroup_exit, > > cgroup_prep_move, cgroup_cancel_move, cgroup_move, cgroup_set_weight > > operations. > > > > Signed-off-by: Juntong Deng <juntong.deng@xxxxxxxxxxx> > > --- > > kernel/sched/ext.c | 30 ++++++++++++++++++++++++++++++ > > 1 file changed, 30 insertions(+) > > > > diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c > > index 7f039a32f137..955fb0f5fc5e 100644 > > --- a/kernel/sched/ext.c > > +++ b/kernel/sched/ext.c > > @@ -7079,9 +7079,39 @@ BTF_ID_FLAGS(func, scx_bpf_dispatch_from_dsq, KF_RCU) > > BTF_ID_FLAGS(func, scx_bpf_dispatch_vtime_from_dsq, KF_RCU) > > BTF_KFUNCS_END(scx_kfunc_ids_unlocked) > > > > +static int scx_kfunc_ids_unlocked_filter(const struct bpf_prog *prog, u32 kfunc_id) > > +{ > > + u32 moff; > > + > > + if (!btf_id_set8_contains(&scx_kfunc_ids_unlocked, kfunc_id) || > > + prog->aux->st_ops != &bpf_sched_ext_ops) > > + return 0; > > + > > + moff = prog->aux->attach_st_ops_member_off; > > + if (moff == offsetof(struct sched_ext_ops, init) || > > + moff == offsetof(struct sched_ext_ops, exit) || > > + moff == offsetof(struct sched_ext_ops, cpu_online) || > > + moff == offsetof(struct sched_ext_ops, cpu_offline) || > > + moff == offsetof(struct sched_ext_ops, init_task) || > > + moff == offsetof(struct sched_ext_ops, dump)) > > + return 0; > > + > > +#ifdef CONFIG_EXT_GROUP_SCHED > > + if (moff == offsetof(struct sched_ext_ops, cgroup_init) || > > + moff == offsetof(struct sched_ext_ops, cgroup_exit) || > > + moff == offsetof(struct sched_ext_ops, cgroup_prep_move) || > > + moff == offsetof(struct sched_ext_ops, cgroup_cancel_move) || > > + moff == offsetof(struct sched_ext_ops, cgroup_move) || > > + moff == offsetof(struct sched_ext_ops, cgroup_set_weight)) > > + return 0; > > +#endif > > + return -EACCES; > > +} > > + > > static const struct btf_kfunc_id_set scx_kfunc_set_unlocked = { > > .owner = THIS_MODULE, > > .set = &scx_kfunc_ids_unlocked, > > + .filter = scx_kfunc_ids_unlocked_filter, > > }; > > why does sched-ext use so many id_set-s ? > > if ((ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS, > &scx_kfunc_set_select_cpu)) || > (ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS, > > &scx_kfunc_set_enqueue_dispatch)) || > (ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS, > &scx_kfunc_set_dispatch)) || > (ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS, > &scx_kfunc_set_cpu_release)) || > (ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS, > &scx_kfunc_set_unlocked)) || > > Can they all be rolled into one id_set then > the patches 2-6 will be collapsed into one patch and > one filter callback that will describe allowed hook/kfunc combinations? I think the idea was to group them in different sets based on their context usage, like scx_kfunc_set_select_cpu kfuncs can be used only from ops.select_cpu(), scx_kfunc_set_dispatch kfuncs can be used only from ops.dispatch(), etc. However, since the actual context enforcement is done by scx_kf_allowed(), it seems that we could have just 3 sets to classify the kfuncs based by their prog type: 1) BPF_PROG_TYPE_STRUCT_OPS 2) BPF_PROG_TYPE_STRUCT_OPS + BPF_PROG_TYPE_SYSCALL 3) BPF_PROG_TYPE_STRUCT_OPS + BPF_PROG_TYPE_SYSCALL + BPF_PROG_TYPE_TRACING -Andrea