Re: [RFC][Patch v1 1/3] sched/isolation: API to get num of hosekeeping CPUs

From: Frederic Weisbecker
Date: Tue Sep 22 2020 - 06:08:22 EST


On Mon, Sep 21, 2020 at 11:16:51PM -0400, Nitesh Narayan Lal wrote:
>
> On 9/21/20 7:40 PM, Frederic Weisbecker wrote:
> > On Wed, Sep 09, 2020 at 11:08:16AM -0400, Nitesh Narayan Lal wrote:
> >> +/*
> >> + * num_housekeeping_cpus() - Read the number of housekeeping CPUs.
> >> + *
> >> + * This function returns the number of available housekeeping CPUs
> >> + * based on __num_housekeeping_cpus which is of type atomic_t
> >> + * and is initialized at the time of the housekeeping setup.
> >> + */
> >> +unsigned int num_housekeeping_cpus(void)
> >> +{
> >> + unsigned int cpus;
> >> +
> >> + if (static_branch_unlikely(&housekeeping_overridden)) {
> >> + cpus = atomic_read(&__num_housekeeping_cpus);
> >> + /* We should always have at least one housekeeping CPU */
> >> + BUG_ON(!cpus);
> >> + return cpus;
> >> + }
> >> + return num_online_cpus();
> >> +}
> >> +EXPORT_SYMBOL_GPL(num_housekeeping_cpus);
> >> +
> >> int housekeeping_any_cpu(enum hk_flags flags)
> >> {
> >> int cpu;
> >> @@ -131,6 +153,7 @@ static int __init housekeeping_setup(char *str, enum hk_flags flags)
> >>
> >> housekeeping_flags |= flags;
> >>
> >> + atomic_set(&__num_housekeeping_cpus, cpumask_weight(housekeeping_mask));
> > So the problem here is that it takes the whole cpumask weight but you're only
> > interested in the housekeepers who take the managed irq duties I guess
> > (HK_FLAG_MANAGED_IRQ ?).
>
> IMHO we should also consider the cases where we only have nohz_full.
> Otherwise, we may run into the same situation on those setups, do you agree?

I guess it's up to the user to gather the tick and managed irq housekeeping
together?

Of course that makes the implementation more complicated. But if this is
called only on drivers initialization for now, this could be just a function
that does:

cpumask_weight(cpu_online_mask | housekeeping_cpumask(HK_FLAG_MANAGED_IRQ))

And then can we rename it to housekeeping_num_online()?

Thanks.

> >
> >> free_bootmem_cpumask_var(non_housekeeping_mask);
> >>
> >> return 1;
> >> --
> >> 2.27.0
> >>
> --
> Thanks
> Nitesh
>