[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.2] move domain to cpupool0 before destroying it
commit 0a7c4ea20c444a22e05a5483ce317dbefe940ba3 Author: Juergen Gross <juergen.gross@xxxxxxxxxxxxxx> AuthorDate: Fri May 23 15:42:16 2014 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri May 23 15:42:16 2014 +0200 move domain to cpupool0 before destroying it Currently when a domain is destroyed it is removed from the domain_list before all of it's resources, including the cpupool membership, are freed. This can lead to a situation where the domain is still member of a cpupool without for_each_domain_in_cpupool() (or even for_each_domain()) being able to find it any more. This in turn can result in rejection of removing the last cpu from a cpupool, because there seems to be still a domain in the cpupool, even if it can't be found by scanning through all domains. This situation can be avoided by moving the domain to be destroyed to cpupool0 first and then remove it from this cpupool BEFORE deleting it from the domain_list. As cpupool0 is always active and a domain without any cpupool membership is implicitly regarded as belonging to cpupool0, this poses no problem. Signed-off-by: Juergen Gross <juergen.gross@xxxxxxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> master commit: bac6334b51d9bcfe57ecf4a4cb5288348fcf044a master date: 2014-05-20 15:55:42 +0200 --- xen/common/domain.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/xen/common/domain.c b/xen/common/domain.c index c05509c..1fde261 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -482,6 +482,8 @@ int domain_kill(struct domain *d) BUG_ON(rc != -EAGAIN); break; } + if ( sched_move_domain(d, cpupool0) ) + return -EAGAIN; d->is_dying = DOMDYING_dead; /* Mem event cleanup has to go here because the rings * have to be put before we call put_domain. */ @@ -660,8 +662,6 @@ static void complete_domain_destroy(struct rcu_head *head) rangeset_domain_destroy(d); - cpupool_rm_domain(d); - sched_destroy_domain(d); /* Free page used by xen oprofile buffer. */ @@ -710,6 +710,8 @@ void domain_destroy(struct domain *d) if ( _atomic_read(old) != 0 ) return; + cpupool_rm_domain(d); + /* Delete from task list and task hashtable. */ TRACE_1D(TRC_SCHED_DOM_REM, d->domain_id); spin_lock(&domlist_update_lock); -- generated by git-patchbot for /home/xen/git/xen.git#stable-4.2 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog |
Lists.xenproject.org is hosted with RackSpace, monitoring our |