[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Clean up domain_create() interface.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1213971686 -3600 # Node ID 926a366ca82f43ff1f9fd90bac435f4835b4dbf9 # Parent ad156e312aefd4deca7d968c13a6b9ed0ece45f8 Clean up domain_create() interface. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- xen/arch/ia64/xen/mm.c | 6 - xen/arch/x86/mm.c | 4 xen/common/domain.c | 259 +++++++++++++++++++++++------------------------ xen/include/xen/domain.h | 3 xen/include/xen/sched.h | 12 +- 5 files changed, 143 insertions(+), 141 deletions(-) diff -r ad156e312aef -r 926a366ca82f xen/arch/ia64/xen/mm.c --- a/xen/arch/ia64/xen/mm.c Fri Jun 20 15:21:04 2008 +0100 +++ b/xen/arch/ia64/xen/mm.c Fri Jun 20 15:21:26 2008 +0100 @@ -207,7 +207,7 @@ alloc_dom_xen_and_dom_io(void) * Any Xen-heap pages that we will allow to be mapped will have * their domain field set to dom_xen. */ - dom_xen = alloc_domain(DOMID_XEN); + dom_xen = domain_create(DOMID_XEN, DOMCRF_dummy, 0); BUG_ON(dom_xen == NULL); /* @@ -215,7 +215,7 @@ alloc_dom_xen_and_dom_io(void) * This domain owns I/O pages that are within the range of the page_info * array. Mappings occur at the priv of the caller. */ - dom_io = alloc_domain(DOMID_IO); + dom_io = domain_create(DOMID_IO, DOMCRF_dummy, 0); BUG_ON(dom_io == NULL); } @@ -1553,7 +1553,7 @@ expose_p2m_init(void) * Initialise our DOMID_P2M domain. * This domain owns m2p table pages. */ - dom_p2m = alloc_domain(DOMID_P2M); + dom_p2m = domain_create(DOMID_P2M, DOMCRF_dummy, 0); BUG_ON(dom_p2m == NULL); dom_p2m->max_pages = ~0U; diff -r ad156e312aef -r 926a366ca82f xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Fri Jun 20 15:21:04 2008 +0100 +++ b/xen/arch/x86/mm.c Fri Jun 20 15:21:26 2008 +0100 @@ -219,7 +219,7 @@ void __init arch_init_memory(void) * Any Xen-heap pages that we will allow to be mapped will have * their domain field set to dom_xen. */ - dom_xen = alloc_domain(DOMID_XEN); + dom_xen = domain_create(DOMID_XEN, DOMCRF_dummy, 0); BUG_ON(dom_xen == NULL); /* @@ -227,7 +227,7 @@ void __init arch_init_memory(void) * This domain owns I/O pages that are within the range of the page_info * array. Mappings occur at the priv of the caller. */ - dom_io = alloc_domain(DOMID_IO); + dom_io = domain_create(DOMID_IO, DOMCRF_dummy, 0); BUG_ON(dom_io == NULL); /* First 1MB of RAM is historically marked as I/O. */ diff -r ad156e312aef -r 926a366ca82f xen/common/domain.c --- a/xen/common/domain.c Fri Jun 20 15:21:04 2008 +0100 +++ b/xen/common/domain.c Fri Jun 20 15:21:26 2008 +0100 @@ -73,21 +73,133 @@ int current_domain_id(void) return current->domain->domain_id; } -struct domain *alloc_domain(domid_t domid) +static struct domain *alloc_domain_struct(void) +{ + return xmalloc(struct domain); +} + +static void free_domain_struct(struct domain *d) +{ + xfree(d); +} + +static void __domain_finalise_shutdown(struct domain *d) +{ + struct vcpu *v; + + BUG_ON(!spin_is_locked(&d->shutdown_lock)); + + if ( d->is_shut_down ) + return; + + for_each_vcpu ( d, v ) + if ( !v->paused_for_shutdown ) + return; + + d->is_shut_down = 1; + send_guest_global_virq(dom0, VIRQ_DOM_EXC); +} + +static void vcpu_check_shutdown(struct vcpu *v) +{ + struct domain *d = v->domain; + + spin_lock(&d->shutdown_lock); + + if ( d->is_shutting_down ) + { + if ( !v->paused_for_shutdown ) + vcpu_pause_nosync(v); + v->paused_for_shutdown = 1; + v->defer_shutdown = 0; + __domain_finalise_shutdown(d); + } + + spin_unlock(&d->shutdown_lock); +} + +struct vcpu *alloc_vcpu( + struct domain *d, unsigned int vcpu_id, unsigned int cpu_id) +{ + struct vcpu *v; + + BUG_ON(d->vcpu[vcpu_id] != NULL); + + if ( (v = alloc_vcpu_struct()) == NULL ) + return NULL; + + v->domain = d; + v->vcpu_id = vcpu_id; + + v->runstate.state = is_idle_vcpu(v) ? RUNSTATE_running : RUNSTATE_offline; + v->runstate.state_entry_time = NOW(); + + if ( !is_idle_domain(d) ) + { + set_bit(_VPF_down, &v->pause_flags); + v->vcpu_info = (void *)&shared_info(d, vcpu_info[vcpu_id]); + } + + if ( sched_init_vcpu(v, cpu_id) != 0 ) + { + free_vcpu_struct(v); + return NULL; + } + + if ( vcpu_initialise(v) != 0 ) + { + sched_destroy_vcpu(v); + free_vcpu_struct(v); + return NULL; + } + + d->vcpu[vcpu_id] = v; + if ( vcpu_id != 0 ) + d->vcpu[v->vcpu_id-1]->next_in_list = v; + + /* Must be called after making new vcpu visible to for_each_vcpu(). */ + vcpu_check_shutdown(v); + + return v; +} + +struct vcpu *alloc_idle_vcpu(unsigned int cpu_id) { struct domain *d; - - if ( (d = xmalloc(struct domain)) == NULL ) + struct vcpu *v; + unsigned int vcpu_id = cpu_id % MAX_VIRT_CPUS; + + if ( (v = idle_vcpu[cpu_id]) != NULL ) + return v; + + d = (vcpu_id == 0) ? + domain_create(IDLE_DOMAIN_ID, 0, 0) : + idle_vcpu[cpu_id - vcpu_id]->domain; + BUG_ON(d == NULL); + + v = alloc_vcpu(d, vcpu_id, cpu_id); + idle_vcpu[cpu_id] = v; + + return v; +} + +struct domain *domain_create( + domid_t domid, unsigned int domcr_flags, ssidref_t ssidref) +{ + struct domain *d, **pd; + enum { INIT_xsm = 1u<<0, INIT_rangeset = 1u<<1, INIT_evtchn = 1u<<2, + INIT_gnttab = 1u<<3, INIT_arch = 1u<<4 }; + int init_status = 0; + + if ( (d = alloc_domain_struct()) == NULL ) return NULL; memset(d, 0, sizeof(*d)); d->domain_id = domid; if ( xsm_alloc_security_domain(d) != 0 ) - { - free_domain(d); - return NULL; - } + goto fail; + init_status |= INIT_xsm; atomic_set(&d->refcnt, 1); spin_lock_init(&d->domain_lock); @@ -97,132 +209,17 @@ struct domain *alloc_domain(domid_t domi INIT_LIST_HEAD(&d->page_list); INIT_LIST_HEAD(&d->xenpage_list); - return d; -} - -void free_domain(struct domain *d) -{ - xsm_free_security_domain(d); - xfree(d); -} - -static void __domain_finalise_shutdown(struct domain *d) -{ - struct vcpu *v; - - BUG_ON(!spin_is_locked(&d->shutdown_lock)); - - if ( d->is_shut_down ) - return; - - for_each_vcpu ( d, v ) - if ( !v->paused_for_shutdown ) - return; - - d->is_shut_down = 1; - send_guest_global_virq(dom0, VIRQ_DOM_EXC); -} - -static void vcpu_check_shutdown(struct vcpu *v) -{ - struct domain *d = v->domain; - - spin_lock(&d->shutdown_lock); - - if ( d->is_shutting_down ) - { - if ( !v->paused_for_shutdown ) - vcpu_pause_nosync(v); - v->paused_for_shutdown = 1; - v->defer_shutdown = 0; - __domain_finalise_shutdown(d); - } - - spin_unlock(&d->shutdown_lock); -} - -struct vcpu *alloc_vcpu( - struct domain *d, unsigned int vcpu_id, unsigned int cpu_id) -{ - struct vcpu *v; - - BUG_ON(d->vcpu[vcpu_id] != NULL); - - if ( (v = alloc_vcpu_struct()) == NULL ) - return NULL; - - v->domain = d; - v->vcpu_id = vcpu_id; - - v->runstate.state = is_idle_vcpu(v) ? RUNSTATE_running : RUNSTATE_offline; - v->runstate.state_entry_time = NOW(); - - if ( !is_idle_domain(d) ) - { - set_bit(_VPF_down, &v->pause_flags); - v->vcpu_info = (void *)&shared_info(d, vcpu_info[vcpu_id]); - } - - if ( sched_init_vcpu(v, cpu_id) != 0 ) - { - free_vcpu_struct(v); - return NULL; - } - - if ( vcpu_initialise(v) != 0 ) - { - sched_destroy_vcpu(v); - free_vcpu_struct(v); - return NULL; - } - - d->vcpu[vcpu_id] = v; - if ( vcpu_id != 0 ) - d->vcpu[v->vcpu_id-1]->next_in_list = v; - - /* Must be called after making new vcpu visible to for_each_vcpu(). */ - vcpu_check_shutdown(v); - - return v; -} - -struct vcpu *alloc_idle_vcpu(unsigned int cpu_id) -{ - struct domain *d; - struct vcpu *v; - unsigned int vcpu_id = cpu_id % MAX_VIRT_CPUS; - - if ( (v = idle_vcpu[cpu_id]) != NULL ) - return v; - - d = (vcpu_id == 0) ? - domain_create(IDLE_DOMAIN_ID, 0, 0) : - idle_vcpu[cpu_id - vcpu_id]->domain; - BUG_ON(d == NULL); - - v = alloc_vcpu(d, vcpu_id, cpu_id); - idle_vcpu[cpu_id] = v; - - return v; -} - -struct domain *domain_create( - domid_t domid, unsigned int domcr_flags, ssidref_t ssidref) -{ - struct domain *d, **pd; - enum { INIT_evtchn = 1, INIT_gnttab = 2, INIT_arch = 8 }; - int init_status = 0; - - if ( (d = alloc_domain(domid)) == NULL ) - return NULL; - if ( domcr_flags & DOMCRF_hvm ) d->is_hvm = 1; if ( (domid == 0) && opt_dom0_vcpus_pin ) d->is_pinned = 1; + if ( domcr_flags & DOMCRF_dummy ) + return d; + rangeset_domain_initialise(d); + init_status |= INIT_rangeset; if ( !is_idle_domain(d) ) { @@ -278,8 +275,11 @@ struct domain *domain_create( grant_table_destroy(d); if ( init_status & INIT_evtchn ) evtchn_destroy(d); - rangeset_domain_destroy(d); - free_domain(d); + if ( init_status & INIT_rangeset ) + rangeset_domain_destroy(d); + if ( init_status & INIT_xsm ) + xsm_free_security_domain(d); + free_domain_struct(d); return NULL; } @@ -535,7 +535,8 @@ static void complete_domain_destroy(stru if ( d->target != NULL ) put_domain(d->target); - free_domain(d); + xsm_free_security_domain(d); + free_domain_struct(d); send_guest_global_virq(dom0, VIRQ_DOM_EXC); } diff -r ad156e312aef -r 926a366ca82f xen/include/xen/domain.h --- a/xen/include/xen/domain.h Fri Jun 20 15:21:04 2008 +0100 +++ b/xen/include/xen/domain.h Fri Jun 20 15:21:26 2008 +0100 @@ -15,9 +15,6 @@ int boot_vcpu( struct domain *d, int vcpuid, vcpu_guest_context_u ctxt); struct vcpu *alloc_idle_vcpu(unsigned int cpu_id); void vcpu_reset(struct vcpu *v); - -struct domain *alloc_domain(domid_t domid); -void free_domain(struct domain *d); struct xen_domctl_getdomaininfo; void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info); diff -r ad156e312aef -r 926a366ca82f xen/include/xen/sched.h --- a/xen/include/xen/sched.h Fri Jun 20 15:21:04 2008 +0100 +++ b/xen/include/xen/sched.h Fri Jun 20 15:21:26 2008 +0100 @@ -315,10 +315,14 @@ struct domain *domain_create( struct domain *domain_create( domid_t domid, unsigned int domcr_flags, ssidref_t ssidref); /* DOMCRF_hvm: Create an HVM domain, as opposed to a PV domain. */ -#define _DOMCRF_hvm 0 -#define DOMCRF_hvm (1U<<_DOMCRF_hvm) -#define _DOMCRF_hap 1 -#define DOMCRF_hap (1U<<_DOMCRF_hap) +#define _DOMCRF_hvm 0 +#define DOMCRF_hvm (1U<<_DOMCRF_hvm) + /* DOMCRF_hap: Create a domain with hardware-assisted paging. */ +#define _DOMCRF_hap 1 +#define DOMCRF_hap (1U<<_DOMCRF_hap) + /* DOMCRF_dummy: Create a dummy domain (not scheduled; not on domain list) */ +#define _DOMCRF_dummy 2 +#define DOMCRF_dummy (1U<<_DOMCRF_dummy) int construct_dom0( struct domain *d, _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |