On Wed, Apr 03, 2024 at 06:41:23PM +0800, Dawei Li wrote: > On Tue, Apr 02, 2024 at 03:41:51PM +0100, Mark Rutland wrote: > > Looking at this case, the only reason we need the mask is because it made the > > logic a little easier to write. All we really want is to choose some CPU in the > > intersection of two masks ignoring a specific CPU, and there was no helper > > function to do that. > > > > We can add a new helper to do that for us, which would avoid redundant work to > > manipulate the entire mask, and it would make the existing code simpler. I had > > a series a few years back to add cpumask_any_and_but(): > > > > https://lore.kernel.org/lkml/1486381132-5610-1-git-send-email-mark.rutland@xxxxxxx/ > > Sounds a perfect idea! > > Actually I am re-implementing new series on top of your seven-years-late-yet-still-helpful > patch, with minor update on it: > > diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h > index 1c29947db848..121f3ac757ff 100644 > --- a/include/linux/cpumask.h > +++ b/include/linux/cpumask.h > @@ -388,6 +388,29 @@ unsigned int cpumask_any_but(const struct cpumask *mask, unsigned int cpu) > return i; > } > > +/** > + * cpumask_any_and_but - pick a "random" cpu from *mask1 & *mask2, but not this one. > + * @mask1: the first input cpumask > + * @mask2: the second input cpumask > + * @cpu: the cpu to ignore > + * > + * Returns >= nr_cpu_ids if no cpus set. > + */ > +static inline > +unsigned int cpumask_any_and_but(const struct cpumask *mask1, > + const struct cpumask *mask2, > + unsigned int cpu) > +{ > + unsigned int i; > + > + cpumask_check(cpu); > + i = cpumask_first_and(mask1, mask2); > + if (i != cpu) > + return i; > + > + return cpumask_next_and(cpu, mask1, mask2); > +} > + > /** > * cpumask_nth - get the Nth cpu in a cpumask > * @srcp: the cpumask pointer > > Change from your original version: > 1 Moved to cpumask.h, just like other helpers. > 2 Return value converted to unsigned int. > 3 Remove EXPORT_SYMBOL, for obvious reason. That's exactly how I rebased it locally, so that looks good to me! > I will respin V2 as a whole as soon as possible. Great! Thanks, Mark.