From dbfa7bba0f213b1802e1900b71bc34837c30ee52 Mon Sep 17 00:00:00 2001 From: George Dunlap Date: Tue, 10 Apr 2012 10:42:35 +0100 Subject: xen, cpupools: Fix cpupool-move to make more consistent The full order for creating new private data structures when moving from one pool to another is now: * Allocate all new structures - Allocate a new private domain structure (but don't point there yet) - Allocate per-vcpu data structures (but don't point there yet) * Remove old structures - Remove each vcpu, freeing the associated data structure - Free the domain data structure * Switch to the new structures - Set the domain to the new cpupool, with the new private domain structure - Set each vcpu to the respective new structure, and insert This is in line with a (fairly reasonable) assumption in credit2 that the private structure of the domain will be the private structure pointed to by the per-vcpu private structure. Also fix a bug, in which insert_vcpu was called with the *old* vcpu ops rather than the new ones. Signed-off-by: George Dunlap Committed-by: Keir Fraser --- xen/common/schedule.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'xen/common/schedule.c') diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 724e8fa1ab..0854f55bf5 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -261,6 +261,18 @@ int sched_move_domain(struct domain *d, struct cpupool *c) domain_pause(d); + for_each_vcpu ( d, v ) + { + SCHED_OP(VCPU2OP(v), remove_vcpu, v); + SCHED_OP(VCPU2OP(v), free_vdata, v->sched_priv); + v->sched_priv = NULL; + } + + SCHED_OP(DOM2OP(d), free_domdata, d->sched_priv); + + d->cpupool = c; + d->sched_priv = domdata; + new_p = cpumask_first(c->cpu_valid); for_each_vcpu ( d, v ) { @@ -268,9 +280,6 @@ int sched_move_domain(struct domain *d, struct cpupool *c) migrate_timer(&v->singleshot_timer, new_p); migrate_timer(&v->poll_timer, new_p); - SCHED_OP(VCPU2OP(v), remove_vcpu, v); - SCHED_OP(VCPU2OP(v), free_vdata, v->sched_priv); - cpumask_setall(v->cpu_affinity); v->processor = new_p; v->sched_priv = vcpu_priv[v->vcpu_id]; @@ -278,13 +287,9 @@ int sched_move_domain(struct domain *d, struct cpupool *c) new_p = cpumask_cycle(new_p, c->cpu_valid); - SCHED_OP(VCPU2OP(v), insert_vcpu, v); + SCHED_OP(c->sched, insert_vcpu, v); } - d->cpupool = c; - SCHED_OP(DOM2OP(d), free_domdata, d->sched_priv); - d->sched_priv = domdata; - domain_update_node_affinity(d); domain_unpause(d); -- cgit v1.2.3