|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/2] xen/sched: don't disable scheduler on cpus during suspend
On Thu, 2019-03-14 at 10:59 +0100, Juergen Gross wrote:
> Today there is special handling in cpu_disable_scheduler() for
> suspend
> by forcing all vcpus to the boot cpu. In fact there is no need for
> that
> as during resume the vcpus are put on the correct cpus again.
>
So, basically, you're saying that moving the vcpus to BSP / CPU0,
before suspending is not necessary, right?
I thought it was, because going into suspend involves things like
cpu_schedule_down(), which does, among other things,
SCHED_OP(free_pdata) for freeing the scheduler's data structs, and
hence we did not want vcpus "around".
> So we can just omit the call of cpu_disable_scheduler() when
> offlining
> a cpu due to suspend and on resuming we can omit taking the schedule
> lock for selecting the new processor.
>
Well, in theory, we should hold the lock when for using
'cpumask_scratch_cpu(cpu)'. Not sure this is an actual problem in this
case, but still...
> In restore_vcpu_affinity() we should be careful when applying
> affinity
> as the cpu might not have come back to life.
>
But restore_vcpu_affinity() is done, in a loop, for all vcpus of all
domains, in thaw_domains(), which in turn comes after
enable_nonboot_cpus(), which I think is supposed to bring every CPU
back up.... What am I missing?
> diff --git a/xen/common/cpupool.c b/xen/common/cpupool.c
> index e89bb67e71..7b5ce18426 100644
> --- a/xen/common/cpupool.c
> +++ b/xen/common/cpupool.c
> @@ -313,7 +313,7 @@ static long cpupool_unassign_cpu_helper(void
> *info)
> * cpu_disable_scheduler(), and at the bottom of this function.
> */
> rcu_read_lock(&domlist_read_lock);
> - ret = cpu_disable_scheduler(cpu);
> + ret = (system_state == SYS_STATE_suspend) ? 0 :
> cpu_disable_scheduler(cpu);
>
Mmm... How can this function be called with state = STATE_suspend ?
> @@ -735,31 +708,36 @@ void restore_vcpu_affinity(struct domain *d)
>
> ASSERT(!vcpu_runnable(v));
>
> - lock = vcpu_schedule_lock_irq(v);
> -
> - if ( v->affinity_broken )
> - {
> - sched_set_affinity(v, v->cpu_hard_affinity_saved, NULL);
> - v->affinity_broken = 0;
> -
> - }
> -
> /*
> - * During suspend (in cpu_disable_scheduler()), we moved
> every vCPU
> - * to BSP (which, as of now, is pCPU 0), as a temporary
> measure to
> - * allow the nonboot processors to have their data structure
> freed
> - * and go to sleep. But nothing guardantees that the BSP is
> a valid
> - * pCPU for a particular domain.
> + * Re-assign the initial processor as after resume we have
> no
> + * guarantee the old processor has come back to life again.
> *
> * Therefore, here, before actually unpausing the domains,
> we should
> * set v->processor of each of their vCPUs to something that
> will
> * make sense for the scheduler of the cpupool in which they
> are in.
> */
> cpumask_and(cpumask_scratch_cpu(cpu), v->cpu_hard_affinity,
> - cpupool_domain_cpumask(v->domain));
> - v->processor = cpumask_any(cpumask_scratch_cpu(cpu));
> + cpupool_domain_cpumask(d));
> + if ( cpumask_empty(cpumask_scratch_cpu(cpu)) )
> + {
> + if ( v->affinity_broken )
> + {
> + sched_set_affinity(v, v->cpu_hard_affinity_saved,
> NULL);
> + v->affinity_broken = 0;
> + cpumask_and(cpumask_scratch_cpu(cpu), v-
> >cpu_hard_affinity,
> + cpupool_domain_cpumask(d));
> + }
>
I'm not sure I follow this; I'll think deeper, but, in the meanwhile...
> - spin_unlock_irq(lock);
> + if ( cpumask_empty(cpumask_scratch_cpu(cpu)) )
> + {
> + printk(XENLOG_DEBUG "Breaking affinity for %pv\n",
> v);
> + sched_set_affinity(v, &cpumask_all, NULL);
> + cpumask_and(cpumask_scratch_cpu(cpu), v-
> >cpu_hard_affinity,
> + cpupool_domain_cpumask(d));
>
... what does it mean we're breaking the affinity while trying to
restore it?
When/where is this vcpu getting its real affinity back in place then?
It might well be me, but I feel like there is something I'm missing
about how this patch is supposed to work.
Regards,
Dario
--
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://about.me/dario.faggioli
Software Engineer @ SUSE https://www.suse.com/
Attachment:
signature.asc _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |