|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 5/6] xen/domain: Call sched_destroy_domain() in the domain_create() error path
If domain_create() fails, complete_domain_destroy() doesn't get called,
meaning that sched_destroy_domain() is missed. In practice, this can only
fail because of exceptional late_hwdom_init() issues at the moment.
Make sched_destroy_domain() idempotent, and call it in the fail path.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
CC: Tim Deegan <tim@xxxxxxx>
CC: Wei Liu <wei.liu2@xxxxxxxxxx>
CC: Dario Faggioli <dfaggioli@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
xen/common/domain.c | 3 +++
xen/common/schedule.c | 14 ++++++++------
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/xen/common/domain.c b/xen/common/domain.c
index e0b024c..3cefe76 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -404,6 +404,9 @@ struct domain *domain_create(domid_t domid, unsigned int
domcr_flags,
hardware_domain = old_hwdom;
atomic_set(&d->refcnt, DOMAIN_DESTROYED);
xfree(d->pbuf);
+
+ sched_destroy_domain(d);
+
if ( init_status & INIT_arch )
arch_domain_destroy(d);
if ( init_status & INIT_gnttab )
diff --git a/xen/common/schedule.c b/xen/common/schedule.c
index 5f596f0..64524f4 100644
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -436,16 +436,18 @@ int sched_init_domain(struct domain *d, int poolid)
void sched_destroy_domain(struct domain *d)
{
- ASSERT(d->cpupool != NULL || is_idle_domain(d));
ASSERT(d->domain_id < DOMID_FIRST_RESERVED);
- SCHED_STAT_CRANK(dom_destroy);
- TRACE_1D(TRC_SCHED_DOM_REM, d->domain_id);
+ if ( d->cpupool )
+ {
+ SCHED_STAT_CRANK(dom_destroy);
+ TRACE_1D(TRC_SCHED_DOM_REM, d->domain_id);
- sched_free_domdata(dom_scheduler(d), d->sched_priv);
- d->sched_priv = NULL;
+ sched_free_domdata(dom_scheduler(d), d->sched_priv);
+ d->sched_priv = NULL;
- cpupool_rm_domain(d);
+ cpupool_rm_domain(d);
+ }
}
void vcpu_sleep_nosync(struct vcpu *v)
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |