[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.4] adjust number of domains in cpupools when destroying domain
commit c4ca9ef8864e3649cd1d8063356f92471f3760ee Author: Juergen Gross <jgross@xxxxxxxx> AuthorDate: Wed Dec 10 12:20:40 2014 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Wed Dec 10 12:20:40 2014 +0100 adjust number of domains in cpupools when destroying domain Commit bac6334b51d9bcfe57ecf4a4cb5288348fcf044a (move domain to cpupool0 before destroying it) introduced an error in the accounting of cpupools regarding the number of domains. The number of domains is nor adjusted when a domain is moved to cpupool0 in kill_domain(). Correct this by introducing a cpupool function doing the move instead of open coding it by calling sched_move_domain(). Reported-by: Dietmar Hahn <dietmar.hahn@xxxxxxxxxxxxxx> Signed-off-by: Juergen Gross <jgross@xxxxxxxx> Tested-by: Dietmar Hahn <dietmar.hahn@xxxxxxxxxxxxxx> Reviewed-by: Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx> Acked-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> master commit: 934e7baa6c12d19cfaf24e8f8e27d6c6a8b8c5e4 master date: 2014-11-12 12:39:58 +0100 --- xen/common/cpupool.c | 47 +++++++++++++++++++++++++++++++++-------------- xen/common/domain.c | 2 +- xen/include/xen/sched.h | 1 + 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/xen/common/cpupool.c b/xen/common/cpupool.c index e46e930..53a1394 100644 --- a/xen/common/cpupool.c +++ b/xen/common/cpupool.c @@ -225,6 +225,35 @@ static int cpupool_destroy(struct cpupool *c) } /* + * Move domain to another cpupool + */ +static int cpupool_move_domain_locked(struct domain *d, struct cpupool *c) +{ + int ret; + + d->cpupool->n_dom--; + ret = sched_move_domain(d, c); + if ( ret ) + d->cpupool->n_dom++; + else + c->n_dom++; + + return ret; +} +int cpupool_move_domain(struct domain *d, struct cpupool *c) +{ + int ret; + + spin_lock(&cpupool_lock); + + ret = cpupool_move_domain_locked(d, c); + + spin_unlock(&cpupool_lock); + + return ret; +} + +/* * assign a specific cpu to a cpupool * cpupool_lock must be held */ @@ -338,14 +367,9 @@ int cpupool_unassign_cpu(struct cpupool *c, unsigned int cpu) ret = -EBUSY; break; } - c->n_dom--; - ret = sched_move_domain(d, cpupool0); + ret = cpupool_move_domain_locked(d, cpupool0); if ( ret ) - { - c->n_dom++; break; - } - cpupool0->n_dom++; } rcu_read_unlock(&domlist_read_lock); if ( ret ) @@ -613,16 +637,11 @@ int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op) d->domain_id, op->cpupool_id); ret = -ENOENT; spin_lock(&cpupool_lock); + c = cpupool_find_by_id(op->cpupool_id); if ( (c != NULL) && cpumask_weight(c->cpu_valid) ) - { - d->cpupool->n_dom--; - ret = sched_move_domain(d, c); - if ( ret ) - d->cpupool->n_dom++; - else - c->n_dom++; - } + ret = cpupool_move_domain_locked(d, c); + spin_unlock(&cpupool_lock); cpupool_dprintk("cpupool move_domain(dom=%d)->pool=%d ret %d\n", d->domain_id, op->cpupool_id, ret); diff --git a/xen/common/domain.c b/xen/common/domain.c index f050af5..b6601a3 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -538,7 +538,7 @@ int domain_kill(struct domain *d) { break; } - if ( sched_move_domain(d, cpupool0) ) + if ( cpupool_move_domain(d, cpupool0) ) return -EAGAIN; for_each_vcpu ( d, v ) unmap_vcpu_info(v); diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 4418883..996a08a 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -828,6 +828,7 @@ struct cpupool *cpupool_get_by_id(int poolid); void cpupool_put(struct cpupool *pool); int cpupool_add_domain(struct domain *d, int poolid); void cpupool_rm_domain(struct domain *d); +int cpupool_move_domain(struct domain *d, struct cpupool *c); int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op); void schedule_dump(struct cpupool *c); extern void dump_runq(unsigned char key); -- generated by git-patchbot for /home/xen/git/xen.git#stable-4.4 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |