|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/2] xen/sched: setup dom0 vCPUs affinity only once
Mmm... this patch has a few hard-tabs in it! Apologies for that. :-/
I'm attaching a version without them, but I surely can resubmit the
series with this fixed, it that's easier.
Regards, and Sorry again
On Tue, 2022-08-02 at 15:51 +0200, Dario Faggioli wrote:
> Right now, affinity for dom0 vCPUs is setup in two steps. This is a
> problem as, at least in Credit2, unit_insert() sees and uses the
> "intermediate" affinity, and place the vCPUs on CPUs where they
> cannot
> be run. And this in turn results in boot hangs, if the "dom0_nodes"
> parameter is used.
>
> Fix this by setting up the affinity properly once and for all, in
> sched_init_vcpu() called by create_vcpu().
>
> Note that, unless a soft-affinity is explicitly specified for dom0
> (by
> using the relaxed mode of "dom0_nodes") we set it to the default,
> which
> is all CPUs, instead of computing it basing on hard affinity (if
> any).
> This is because hard and soft affinity should be considered as
> independent user controlled properties. In fact, if we dor derive
> dom0's
> soft-affinity from its boot-time hard-affinity, such computed value
> will
> continue to be used even if later the user changes the hard-affinity.
> And this could result in the vCPUs behaving differently than what the
> user wanted and expects.
>
> Fixes: dafd936ddd ("Make credit2 the default scheduler")
> Reported-by: Olaf Hering <ohering@xxxxxxx>
> Signed-off-by: Dario Faggioli <dfaggioli@xxxxxxxx>
> ---
> Cc: Jan Beulich <jbeulich@xxxxxxxx>
> Cc: George Dunlap <george.dunlap@xxxxxxxxxx>
> ---
> Changes from "RFC" [1]:
> - Moved handling of the shim case
> - Added some more explanation (in particular, about why we stick to
> all
> CPUs for the soft affinity) in both commit message and comment
> - Remove spurious (and non-necessary) credit2 change
>
> [1]
> https://lore.kernel.org/xen-devel/e061a647cd77a36834e2085a96a07caa785c5066.camel@xxxxxxxx/
> ---
> xen/common/sched/core.c | 63 +++++++++++++++++++++++++++++--------
> ----------
> 1 file changed, 39 insertions(+), 24 deletions(-)
>
> diff --git a/xen/common/sched/core.c b/xen/common/sched/core.c
> index 379a791d62..0585c643a5 100644
> --- a/xen/common/sched/core.c
> +++ b/xen/common/sched/core.c
> @@ -571,12 +571,46 @@ int sched_init_vcpu(struct vcpu *v)
> return 1;
> }
>
> - /*
> - * Initialize affinity settings. The idler, and potentially
> - * domain-0 VCPUs, are pinned onto their respective physical
> CPUs.
> - */
> - if ( is_idle_domain(d) || (is_control_domain(d) &&
> opt_dom0_vcpus_pin) )
> + if ( is_idle_domain(d) )
> + {
> + /* Idle vCPUs are always pinned onto their respective pCPUs
> */
> + sched_set_affinity(unit, cpumask_of(processor),
> &cpumask_all);
> + }
> + else if ( pv_shim && v->vcpu_id == 0 )
> + {
> + /*
> + * PV-shim: vcpus are pinned 1:1. Initially only 1 cpu is
> online,
> + * others will be dealt with when onlining them. This avoids
> pinning
> + * a vcpu to a not yet online cpu here.
> + */
> + sched_set_affinity(unit, cpumask_of(0), cpumask_of(0));
> + }
> + else if ( is_control_domain(d) && opt_dom0_vcpus_pin )
> + {
> + /*
> + * If dom0_vcpus_pin is specified, dom0 vCPUs are pinned 1:1
> to
> + * their respective pCPUs too.
> + */
> sched_set_affinity(unit, cpumask_of(processor),
> &cpumask_all);
> + }
> +#ifdef CONFIG_X86
> + else if ( is_control_domain(d) )
> + {
> + /*
> + * In absence of dom0_vcpus_pin instead, the hard and soft
> affinity of
> + * dom0 is controlled by the (x86 only) dom0_nodes
> parameter. At this
> + * point it has been parsed and decoded into the dom0_cpus
> mask.
> + *
> + * Note that we always honor what user explicitly requested,
> for both
> + * hard and soft affinity, without doing any dynamic
> computation of
> + * either of them.
> + */
> + if ( !dom0_affinity_relaxed )
> + sched_set_affinity(unit, &dom0_cpus, &cpumask_all);
> + else
> + sched_set_affinity(unit, &cpumask_all, &dom0_cpus);
> + }
> +#endif
> else
> sched_set_affinity(unit, &cpumask_all, &cpumask_all);
>
> @@ -3402,29 +3436,10 @@ void wait(void)
> void __init sched_setup_dom0_vcpus(struct domain *d)
> {
> unsigned int i;
> - struct sched_unit *unit;
>
> for ( i = 1; i < d->max_vcpus; i++ )
> vcpu_create(d, i);
>
> - /*
> - * PV-shim: vcpus are pinned 1:1.
> - * Initially only 1 cpu is online, others will be dealt with
> when
> - * onlining them. This avoids pinning a vcpu to a not yet online
> cpu here.
> - */
> - if ( pv_shim )
> - sched_set_affinity(d->vcpu[0]->sched_unit,
> - cpumask_of(0), cpumask_of(0));
> - else
> - {
> - for_each_sched_unit ( d, unit )
> - {
> - if ( !opt_dom0_vcpus_pin && !dom0_affinity_relaxed )
> - sched_set_affinity(unit, &dom0_cpus, NULL);
> - sched_set_affinity(unit, NULL, &dom0_cpus);
> - }
> - }
> -
> domain_update_node_affinity(d);
> }
> #endif
>
>
>
--
Dario Faggioli, Ph.D
http://about.me/dario.faggioli
Virtualization Software Engineer
SUSE Labs, SUSE https://www.suse.com/
-------------------------------------------------------------------
<<This happens because _I_ choose it to happen!>> (Raistlin Majere)
Attachment:
0002-xen-sched-setup-dom0-vCPUs-affinity-only-once.patch Attachment:
signature.asc
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |