Re: [PATCH v4 sched_ext/for-7.3 08/40] sched_ext: Reject direct slice and dsq_vtime writes for cid-form schedulers

Andrea Righi <[email protected]>
Newsgroups dev.linux.lists.sched-ext,org.kernel.vger.linux-kernel
Message-ID <alALFXPBJpxcQWw5@gpd4>
On Wed, Jul 08, 2026 at 11:23:57AM -1000, Tejun Heo wrote:
> Direct writes to p->scx.slice and p->scx.dsq_vtime bypass
> scx_bpf_task_set_slice/dsq_vtime() and the authority checks they carry.
> Those checks exist for sub-schedulers, which attach only through the
> cid-form struct_ops, so the direct writes only need to be closed there.
> 
> Give sched_ext_ops_cid its own verifier ops that reject the two fields.
> cid-form is a new interface with no legacy users, so there is no
> compatibility to keep. The cpu-form keeps direct writes, and the deprecation
> warning they carried is dropped.
> 
> Signed-off-by: Tejun Heo <[email protected]>

The thing reported by sashiko seems more like a BPF issue. From an scx
perspective this one looks good to me.

Reviewed-by: Andrea Righi <[email protected]>

Thanks,
-Andrea

> ---
>  kernel/sched/ext/ext.c | 44 ++++++++++++++++++++++++++++++------------
>  1 file changed, 32 insertions(+), 12 deletions(-)
> 
> diff --git a/kernel/sched/ext/ext.c b/kernel/sched/ext/ext.c
> index be75bdc9ada2..bd3cb59b1dbf 100644
> --- a/kernel/sched/ext/ext.c
> +++ b/kernel/sched/ext/ext.c
> @@ -6995,6 +6995,21 @@ static bool bpf_scx_is_valid_access(int off, int size,
>  	return btf_ctx_access(off, size, type, prog, info);
>  }
>  
> +/* common to both forms: only scx.disallow is writable */
> +static int bpf_scx_btf_struct_access_common(const struct bpf_reg_state *reg,
> +					    int off, int size)
> +{
> +	const struct btf_type *t;
> +
> +	t = btf_type_by_id(reg->btf, reg->btf_id);
> +	if (t == task_struct_type &&
> +	    off >= offsetof(struct task_struct, scx.disallow) &&
> +	    off + size <= offsetofend(struct task_struct, scx.disallow))
> +		return SCALAR_VALUE;
> +
> +	return -EACCES;
> +}
> +
>  static int bpf_scx_btf_struct_access(struct bpf_verifier_log *log,
>  				     const struct bpf_reg_state *reg, int off,
>  				     int size)
> @@ -7003,23 +7018,22 @@ static int bpf_scx_btf_struct_access(struct bpf_verifier_log *log,
>  
>  	t = btf_type_by_id(reg->btf, reg->btf_id);
>  	if (t == task_struct_type) {
> -		/*
> -		 * COMPAT: Will be removed in v6.23.
> -		 */
>  		if ((off >= offsetof(struct task_struct, scx.slice) &&
>  		     off + size <= offsetofend(struct task_struct, scx.slice)) ||
>  		    (off >= offsetof(struct task_struct, scx.dsq_vtime) &&
> -		     off + size <= offsetofend(struct task_struct, scx.dsq_vtime))) {
> -			pr_warn_ratelimited("sched_ext: Writing directly to p->scx.slice/dsq_vtime is deprecated, use scx_bpf_task_set_slice/dsq_vtime()\n");
> -			return SCALAR_VALUE;
> -		}
> -
> -		if (off >= offsetof(struct task_struct, scx.disallow) &&
> -		    off + size <= offsetofend(struct task_struct, scx.disallow))
> +		     off + size <= offsetofend(struct task_struct, scx.dsq_vtime)))
>  			return SCALAR_VALUE;
>  	}
>  
> -	return -EACCES;
> +	return bpf_scx_btf_struct_access_common(reg, off, size);
> +}
> +
> +/* cid-form rejects direct slice and dsq_vtime writes in favor of the kfuncs */
> +static int bpf_scx_cid_btf_struct_access(struct bpf_verifier_log *log,
> +					 const struct bpf_reg_state *reg, int off,
> +					 int size)
> +{
> +	return bpf_scx_btf_struct_access_common(reg, off, size);
>  }
>  
>  static const struct bpf_verifier_ops bpf_scx_verifier_ops = {
> @@ -7028,6 +7042,12 @@ static const struct bpf_verifier_ops bpf_scx_verifier_ops = {
>  	.btf_struct_access = bpf_scx_btf_struct_access,
>  };
>  
> +static const struct bpf_verifier_ops bpf_scx_cid_verifier_ops = {
> +	.get_func_proto = bpf_base_func_proto,
> +	.is_valid_access = bpf_scx_is_valid_access,
> +	.btf_struct_access = bpf_scx_cid_btf_struct_access,
> +};
> +
>  static int bpf_scx_init_member(const struct btf_type *t,
>  			       const struct btf_member *member,
>  			       void *kdata, const void *udata)
> @@ -7368,7 +7388,7 @@ static struct sched_ext_ops_cid __bpf_ops_sched_ext_ops_cid = {
>   * verified to match by the BUILD_BUG_ON checks in scx_init().
>   */
>  static struct bpf_struct_ops bpf_sched_ext_ops_cid = {
> -	.verifier_ops = &bpf_scx_verifier_ops,
> +	.verifier_ops = &bpf_scx_cid_verifier_ops,
>  	.reg = bpf_scx_reg_cid,
>  	.unreg = bpf_scx_unreg,
>  	.check_member = bpf_scx_check_member,
> -- 
> 2.54.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.