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@citrix.com>
Reviewed-by: George Dunlap <george.dunlap@citrix.com>
Reviewed-by: Dario Faggioli <dfaggioli@suse.com>
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 )
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)