Re: [PATCH bpf-next v3 1/2] bpf: Require a BPF cpumask for bpf_cpumask_populate()

"Emil Tsalapatis" <[email protected]>
Newsgroups dev.linux.lists.sched-ext,org.kernel.vger.bpf
Message-ID <[email protected]>
On Thu Jul 9, 2026 at 2:27 PM EDT, Nicholas Dudar wrote:
> bpf_cpumask_populate() writes to its destination with bitmap_copy(), but
> the destination is typed as struct cpumask *. That allows the verifier to
> accept borrowed cpumask pointers returned by read-only kfuncs, such as
> scx_bpf_get_online_cpumask(), as a writable destination.
>
> Make the destination a struct bpf_cpumask * so populate follows the same
> ownership rule as the other mutating cpumask kfuncs. Query kfuncs continue
> to accept const struct cpumask * inputs.
>
> Fixes: 950ad93df2fc ("bpf: add kfunc for populating cpumask bits")
> Signed-off-by: Nicholas Dudar <[email protected]>
> Assisted-by: Claude:claude-opus-4-8

Reviewed-by: Emil Tsalapatis <[email protected]>

> ---
>  kernel/bpf/cpumask.c                     | 6 +++---
>  tools/sched_ext/include/scx/compat.bpf.h | 2 +-
>  2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/kernel/bpf/cpumask.c b/kernel/bpf/cpumask.c
> index b8c805b4b06a..1336a4efa755 100644
> --- a/kernel/bpf/cpumask.c
> +++ b/kernel/bpf/cpumask.c
> @@ -449,12 +449,12 @@ __bpf_kfunc u32 bpf_cpumask_weight(const struct cpumask *cpumask)
>   * @src__sz: Length of the BPF memory region in bytes.
>   *
>   * Return:
> - * * 0 if the struct cpumask * instance was populated successfully.
> + * * 0 if the struct bpf_cpumask * instance was populated successfully.
>   * * -EACCES if the memory region is too small to populate the cpumask.
>   * * -EINVAL if the memory region is not aligned to the size of a long
>   *   and the architecture does not support efficient unaligned accesses.
>   */
> -__bpf_kfunc int bpf_cpumask_populate(struct cpumask *cpumask, void *src, size_t src__sz)
> +__bpf_kfunc int bpf_cpumask_populate(struct bpf_cpumask *cpumask, void *src, size_t src__sz)
>  {
>  	unsigned long source = (unsigned long)src;
>  
> @@ -467,7 +467,7 @@ __bpf_kfunc int bpf_cpumask_populate(struct cpumask *cpumask, void *src, size_t
>  		!IS_ALIGNED(source, sizeof(long)))
>  		return -EINVAL;
>  
> -	bitmap_copy(cpumask_bits(cpumask), src, nr_cpu_ids);
> +	bitmap_copy(cpumask_bits(&cpumask->cpumask), src, nr_cpu_ids);
>  
>  	return 0;
>  }
> diff --git a/tools/sched_ext/include/scx/compat.bpf.h b/tools/sched_ext/include/scx/compat.bpf.h
> index 87f15f296234..3f74d522f7e7 100644
> --- a/tools/sched_ext/include/scx/compat.bpf.h
> +++ b/tools/sched_ext/include/scx/compat.bpf.h
> @@ -84,7 +84,7 @@ bool scx_bpf_dispatch_vtime_from_dsq___old(struct bpf_iter_scx_dsq *it__iter, st
>   *
>   * Compat macro will be dropped on v6.19 release.
>   */
> -int bpf_cpumask_populate(struct cpumask *dst, void *src, size_t src__sz) __ksym __weak;
> +int bpf_cpumask_populate(struct bpf_cpumask *dst, void *src, size_t src__sz) __ksym __weak;
>  
>  #define __COMPAT_bpf_cpumask_populate(cpumask, src, size__sz)		\
>  	(bpf_ksym_exists(bpf_cpumask_populate) ?			\
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.