On Tue, 2012-10-09 at 11:53 +0200, Juergen Gross wrote: > > diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c > > --- a/xen/common/sched_credit.c > > +++ b/xen/common/sched_credit.c > ... > > static int > > _csched_cpu_pick(const struct scheduler *ops, struct vcpu *vc, bool_t commit) > > { > > - cpumask_t cpus; > > + cpumask_t cpus, start_cpus; > > cpumask_t idlers; > > cpumask_t *online; > > + struct csched_dom *sdom = CSCHED_DOM(vc->domain); > > struct csched_pcpu *spc = NULL; > > int cpu; > > > > /* > > - * Pick from online CPUs in VCPU's affinity mask, giving a > > - * preference to its current processor if it's in there. > > + * Pick an online CPU from the&& of vcpu-affinity and node-affinity > > + * masks (if not empty, in which case only the vcpu-affinity mask is > > + * used). Also, try to give a preference to its current processor if > > + * it's in there. > > */ > > online = cpupool_scheduler_cpumask(vc->domain->cpupool); > > cpumask_and(&cpus, online, vc->cpu_affinity); > > - cpu = cpumask_test_cpu(vc->processor,&cpus) > > + cpumask_and(&start_cpus,&cpus, sdom->node_affinity_cpumask); > > + if ( unlikely(cpumask_empty(&start_cpus)) ) > > + cpumask_copy(&start_cpus,&cpus); > > + cpu = cpumask_test_cpu(vc->processor,&start_cpus) > > ? vc->processor > > - : cpumask_cycle(vc->processor,&cpus); > > + : cpumask_cycle(vc->processor,&start_cpus); > > ASSERT( !cpumask_empty(&cpus)&& cpumask_test_cpu(cpu,&cpus) ); > > Shouldn't the ASSERT be changed to start_cpus, too? > Well, it seems it definitely should, and I seem to have missed that! Thanks a lot, Dario -- <> (Raistlin Majere) ----------------------------------------------------------------- Dario Faggioli, Ph.D, http://retis.sssup.it/people/faggioli Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)