Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12:Update
xen.481
5463470e-adjust-number-of-domains-in-cpupools-w...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5463470e-adjust-number-of-domains-in-cpupools-when-destroying-domain.patch of Package xen.481
# Commit 934e7baa6c12d19cfaf24e8f8e27d6c6a8b8c5e4 # Date 2014-11-12 12:39:58 +0100 # Author Juergen Gross <jgross@suse.com> # Committer Jan Beulich <jbeulich@suse.com> 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@ts.fujitsu.com> Signed-off-by: Juergen Gross <jgross@suse.com> Tested-by: Dietmar Hahn <dietmar.hahn@ts.fujitsu.com> Reviewed-by: Andrew Cooper <Andrew.Cooper3@citrix.com> Acked-by: George Dunlap <george.dunlap@eu.citrix.com> --- a/xen/common/cpupool.c +++ b/xen/common/cpupool.c @@ -225,6 +225,35 @@ static int cpupool_destroy(struct cpupoo } /* + * 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 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_ 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); --- 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); --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -828,6 +828,7 @@ struct cpupool *cpupool_get_by_id(int po 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);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor