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) ? \