Messages in this thread | | | Date | Thu, 15 Jun 2023 15:10:09 -0700 | Subject | Re: [PATCH v4 11/24] x86/resctrl: Add cpumask_any_housekeeping() for limbo/overflow | From | Reinette Chatre <> |
| |
Hi James,
On 5/25/2023 11:01 AM, James Morse wrote:
...
> @@ -55,6 +56,28 @@ > /* Max event bits supported */ > #define MAX_EVT_CONFIG_BITS GENMASK(6, 0) > > +/** > + * cpumask_any_housekeeping() - Choose any CPU in @mask, preferring those that > + * aren't marked nohz_full > + * @mask: The mask to pick a CPU from. > + * > + * Returns a CPU in @mask. If there are housekeeping CPUs that don't use > + * nohz_full, these are preferred. > + */ > +static inline unsigned int cpumask_any_housekeeping(const struct cpumask *mask) > +{ > + int cpu, hk_cpu;
Should both of these be unsigned int?
> + > + cpu = cpumask_any(mask); > + if (tick_nohz_full_cpu(cpu)) { > + hk_cpu = cpumask_nth_andnot(0, mask, tick_nohz_full_mask); > + if (hk_cpu < nr_cpu_ids) > + cpu = hk_cpu; > + } > + > + return cpu; > +} > + > struct rdt_fs_context { > struct kernfs_fs_context kfc; > bool enable_cdpl2; > diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c > index 128d4c7206e4..e267869d60d5 100644 > --- a/arch/x86/kernel/cpu/resctrl/monitor.c > +++ b/arch/x86/kernel/cpu/resctrl/monitor.c > @@ -770,9 +770,9 @@ static void mbm_update(struct rdt_resource *r, struct rdt_domain *d, > void cqm_handle_limbo(struct work_struct *work) > { > unsigned long delay = msecs_to_jiffies(CQM_LIMBOCHECK_INTERVAL); > - int cpu = smp_processor_id(); > struct rdt_resource *r; > struct rdt_domain *d; > + int cpu; > > mutex_lock(&rdtgroup_mutex); > > @@ -781,8 +781,10 @@ void cqm_handle_limbo(struct work_struct *work) > > __check_limbo(d, false); > > - if (has_busy_rmid(r, d)) > + if (has_busy_rmid(r, d)) { > + cpu = cpumask_any_housekeeping(&d->cpu_mask); > schedule_delayed_work_on(cpu, &d->cqm_limbo, delay);
I expected cqm_work_cpu to also change when the worker moves to a different CPU.
> + } > > mutex_unlock(&rdtgroup_mutex); > } > @@ -792,7 +794,7 @@ void cqm_setup_limbo_handler(struct rdt_domain *dom, unsigned long delay_ms) > unsigned long delay = msecs_to_jiffies(delay_ms); > int cpu; > > - cpu = cpumask_any(&dom->cpu_mask); > + cpu = cpumask_any_housekeeping(&dom->cpu_mask); > dom->cqm_work_cpu = cpu; > > schedule_delayed_work_on(cpu, &dom->cqm_limbo, delay); > @@ -802,10 +804,10 @@ void mbm_handle_overflow(struct work_struct *work) > { > unsigned long delay = msecs_to_jiffies(MBM_OVERFLOW_INTERVAL); > struct rdtgroup *prgrp, *crgrp; > - int cpu = smp_processor_id(); > struct list_head *head; > struct rdt_resource *r; > struct rdt_domain *d; > + int cpu; > > mutex_lock(&rdtgroup_mutex); > > @@ -826,6 +828,11 @@ void mbm_handle_overflow(struct work_struct *work) > update_mba_bw(prgrp, d); > } > > + /* > + * Re-check for housekeeping CPUs. This allows the overflow handler to > + * move off a nohz_full CPU quickly. > + */ > + cpu = cpumask_any_housekeeping(&d->cpu_mask); > schedule_delayed_work_on(cpu, &d->mbm_over, delay);
Here I expected mbm_work_cpu to change if the worker moves to a different CPU.
> > out_unlock: > @@ -839,7 +846,7 @@ void mbm_setup_overflow_handler(struct rdt_domain *dom, unsigned long delay_ms) > > if (!static_branch_likely(&rdt_mon_enable_key)) > return; > - cpu = cpumask_any(&dom->cpu_mask); > + cpu = cpumask_any_housekeeping(&dom->cpu_mask); > dom->mbm_work_cpu = cpu; > schedule_delayed_work_on(cpu, &dom->mbm_over, delay); > }
Reinette
| |