Re: [PATCH v2 2/5] Introducing qpw_lock() and per-cpu queue & flush work

From: Vlastimil Babka (SUSE)

Date: Mon Mar 16 2026 - 06:57:18 EST


On 3/15/26 18:37, Leonardo Bras wrote:
> On Wed, Mar 11, 2026 at 08:58:05AM +0100, Vlastimil Babka (SUSE) wrote:
>> On 3/2/26 16:49, Marcelo Tosatti wrote:
>> > Index: linux/Documentation/admin-guide/kernel-parameters.txt
>> > ===================================================================
>> > --- linux.orig/Documentation/admin-guide/kernel-parameters.txt
>> > +++ linux/Documentation/admin-guide/kernel-parameters.txt
>> > @@ -2840,6 +2840,16 @@ Kernel parameters
>> >
>> > The format of <cpu-list> is described above.
>> >
>> > + qpw= [KNL,SMP] Select a behavior on per-CPU resource sharing
>> > + and remote interference mechanism on a kernel built with
>> > + CONFIG_QPW.
>> > + Format: { "0" | "1" }
>> > + 0 - local_lock() + queue_work_on(remote_cpu)
>> > + 1 - spin_lock() for both local and remote operations
>> > +
>> > + Selecting 1 may be interesting for systems that want
>> > + to avoid interruption & context switches from IPIs.
>> Requiring a new boot option is always a nuissance. The cpu isolation is
>> AFAIK difficult enough to setup already. Could the default be that qpw will
>> auto-enable if there are isolated cpus configured? The option could still be
>> useful for overriding that automatic decision to both 0 and 1 for testing
>> etc, but not requried for the expected usecase?
>
>
> I think it's okay, as something like this?
> (should work for nohz_full and isolcpus)
>
> ######
> diff --git a/kernel/sched/isolation.c b/kernel/sched/isolation.c
> index 81bc8b329ef17..6c9052c28e3e4 100644
> --- a/kernel/sched/isolation.c
> +++ b/kernel/sched/isolation.c
> @@ -170,20 +170,23 @@ static int __init housekeeping_setup(char *str, unsigned long flags)
> for_each_set_bit(type, &iter_flags, HK_TYPE_MAX)
> housekeeping_setup_type(type, housekeeping_staging);
> }
>
> if ((flags & HK_FLAG_KERNEL_NOISE) && !(housekeeping.flags & HK_FLAG_KERNEL_NOISE))
> tick_nohz_full_setup(non_housekeeping_mask);
>
> housekeeping.flags |= flags;
> err = 1;
>
> + if (IS_ENABLED(CONFIG_QPW_DEFAULT))
> + qpw_setup("1");
> +
> free_housekeeping_staging:
> free_bootmem_cpumask_var(housekeeping_staging);
> free_non_housekeeping_mask:
> free_bootmem_cpumask_var(non_housekeeping_mask);
>
> return err;
> }
> ######
>
> We would only have to be sure that this runs before cmdline parses qpw=?,

I'm not sure it's possible to achieve this ordering with __setup calls,
unless one of them is early, and then it might be too early to do the
necessary action.

> so user could disable qpw if wanted.
>
> Would that work?

The pattern I'm familiar with is collecting all related params via
early_param() setting some variables, and then an init call (not tied to any
of the param) looks at those variables and does whatever is necessary.

> Thanks!
> Leo
>
>
>