On Tue, Nov 22, 2022 at 03:39:25PM -0500, Mathieu Desnoyers wrote: > Allow finding the first or next bit within two input cpumasks which is > either: > > - both zero and zero, > - respectively one and zero. > > Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> > --- > include/linux/cpumask.h | 60 +++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 60 insertions(+) > > diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h > index c2aa0aa26b45..271bccc0a6d7 100644 > --- a/include/linux/cpumask.h > +++ b/include/linux/cpumask.h > @@ -153,6 +153,32 @@ unsigned int cpumask_first_and(const struct cpumask *srcp1, const struct cpumask > return find_first_and_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits); > } > > +/** > + * cpumask_first_andnot - return the first cpu from *srcp1 & ~*srcp2 > + * @src1p: the first input > + * @src2p: the second input > + * > + * Returns >= nr_cpu_ids if no cpus match in both. > + */ > +static inline > +unsigned int cpumask_first_andnot(const struct cpumask *srcp1, const struct cpumask *srcp2) > +{ > + return find_first_andnot_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits); > +} > + > +/** > + * cpumask_first_notandnot - return the first cpu from ~*srcp1 & ~*srcp2 > + * @src1p: the first input > + * @src2p: the second input > + * > + * Returns >= nr_cpu_ids if no cpus match in both. > + */ > +static inline > +unsigned int cpumask_first_notandnot(const struct cpumask *srcp1, const struct cpumask *srcp2) cpumask_first_zero_or > +{ > + return find_first_notandnot_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits); > +} Can you be consistent - either add cpumask_check for all new functions, or don't. > + > /** > * cpumask_last - get the last CPU in a cpumask > * @srcp: - the cpumask pointer > @@ -195,6 +221,40 @@ static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp) > return find_next_zero_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1); > } > > +/** > + * cpumask_next_andnot - return the next cpu from *srcp1 & ~*srcp2 > + * @n: the cpu prior to the place to search (ie. return will be > @n) > + * @src1p: the first input > + * @src2p: the second input > + * > + * Returns >= nr_cpu_ids if no cpus match in both. > + */ > +static inline > +unsigned int cpumask_next_andnot(int n, const struct cpumask *srcp1, const struct cpumask *srcp2) > +{ > + /* -1 is a legal arg here. */ > + if (n != -1) > + cpumask_check(n); > + return find_next_andnot_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits, n+1); > +} > + > +/** > + * cpumask_next_notandnot - return the next cpu from ~*srcp1 & ~*srcp2 > + * @n: the cpu prior to the place to search (ie. return will be > @n) > + * @src1p: the first input > + * @src2p: the second input > + * > + * Returns >= nr_cpu_ids if no cpus match in both. > + */ > +static inline > +unsigned int cpumask_next_notandnot(int n, const struct cpumask *srcp1, const struct cpumask *srcp2) same here: cpumask_next_zero_or() Thanks, Yury > +{ > + /* -1 is a legal arg here. */ > + if (n != -1) > + cpumask_check(n); > + return find_next_notandnot_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits, n+1); > +} > + > #if NR_CPUS == 1 > /* Uniprocessor: there is only one valid CPU */ > static inline unsigned int cpumask_local_spread(unsigned int i, int node) > -- > 2.25.1 >