[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.5] Revert "xen: Remove buggy initial placement algorithm"
commit 0fc8aab8a9b39a2a6127c98b31e9c8a9b921c7ce Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Aug 5 15:42:52 2016 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Aug 5 15:42:52 2016 +0200 Revert "xen: Remove buggy initial placement algorithm" This reverts commit 505ad3a8b7fd3b91ab39c829ca6636cd264198c7, as its prereq needs further so far unidentified prereqs. --- xen/common/domctl.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/xen/common/domctl.c b/xen/common/domctl.c index d76cd27..3641296 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -215,6 +215,54 @@ void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info) memcpy(info->handle, d->handle, sizeof(xen_domain_handle_t)); } +static unsigned int default_vcpu0_location(cpumask_t *online) +{ + struct domain *d; + struct vcpu *v; + unsigned int i, cpu, nr_cpus, *cnt; + cpumask_t cpu_exclude_map; + + /* Do an initial CPU placement. Pick the least-populated CPU. */ + nr_cpus = cpumask_last(&cpu_online_map) + 1; + cnt = xzalloc_array(unsigned int, nr_cpus); + if ( cnt ) + { + rcu_read_lock(&domlist_read_lock); + for_each_domain ( d ) + for_each_vcpu ( d, v ) + if ( !test_bit(_VPF_down, &v->pause_flags) + && ((cpu = v->processor) < nr_cpus) ) + cnt[cpu]++; + rcu_read_unlock(&domlist_read_lock); + } + + /* + * If we're on a HT system, we only auto-allocate to a non-primary HT. We + * favour high numbered CPUs in the event of a tie. + */ + cpumask_copy(&cpu_exclude_map, per_cpu(cpu_sibling_mask, 0)); + cpu = cpumask_first(&cpu_exclude_map); + i = cpumask_next(cpu, &cpu_exclude_map); + if ( i < nr_cpu_ids ) + cpu = i; + for_each_cpu(i, online) + { + if ( cpumask_test_cpu(i, &cpu_exclude_map) ) + continue; + if ( (i == cpumask_first(per_cpu(cpu_sibling_mask, i))) && + (cpumask_next(i, per_cpu(cpu_sibling_mask, i)) < nr_cpu_ids) ) + continue; + cpumask_or(&cpu_exclude_map, &cpu_exclude_map, + per_cpu(cpu_sibling_mask, i)); + if ( !cnt || cnt[i] <= cnt[cpu] ) + cpu = i; + } + + xfree(cnt); + + return cpu; +} + bool_t domctl_lock_acquire(void) { /* @@ -630,7 +678,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) continue; cpu = (i == 0) ? - cpumask_any(online) : + default_vcpu0_location(online) : cpumask_cycle(d->vcpu[i-1]->processor, online); if ( alloc_vcpu(d, i, cpu) == NULL ) -- generated by git-patchbot for /home/xen/git/xen.git#stable-4.5 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |