[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Refactor domain/vcpu allocation to be more separated.
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID d6e99066959acf9f25b5515a67a2d15a7946a510 # Parent af38c6b205f6f1bfb13310647b95b7557ab0e574 Refactor domain/vcpu allocation to be more separated. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> diff -r af38c6b205f6 -r d6e99066959a xen/arch/x86/domain_build.c --- a/xen/arch/x86/domain_build.c Wed Oct 12 16:00:29 2005 +++ b/xen/arch/x86/domain_build.c Wed Oct 12 16:01:38 2005 @@ -560,7 +560,7 @@ d->shared_info->n_vcpu = num_online_cpus(); for ( i = 1; i < d->shared_info->n_vcpu; i++ ) - (void)alloc_vcpu(d, i); + (void)alloc_vcpu(d, i, i % num_online_cpus()); /* Set up monitor table */ update_pagetables(v); diff -r af38c6b205f6 -r d6e99066959a xen/common/dom0_ops.c --- a/xen/common/dom0_ops.c Wed Oct 12 16:00:29 2005 +++ b/xen/common/dom0_ops.c Wed Oct 12 16:01:38 2005 @@ -224,7 +224,7 @@ case DOM0_MAX_VCPUS: { struct domain *d; - unsigned int i, max = op->u.max_vcpus.max; + unsigned int i, max = op->u.max_vcpus.max, cpu; ret = -EINVAL; if ( max > MAX_VIRT_CPUS ) @@ -250,8 +250,14 @@ ret = -ENOMEM; for ( i = 0; i < max; i++ ) - if ( (d->vcpu[i] == NULL) && (alloc_vcpu(d, i) == NULL) ) - goto maxvcpu_out; + { + if ( d->vcpu[i] == NULL ) + { + cpu = (d->vcpu[i-1]->processor + 1) % num_online_cpus(); + if ( alloc_vcpu(d, i, cpu) == NULL ) + goto maxvcpu_out; + } + } ret = 0; diff -r af38c6b205f6 -r d6e99066959a xen/common/domain.c --- a/xen/common/domain.c Wed Oct 12 16:00:29 2005 +++ b/xen/common/domain.c Wed Oct 12 16:01:38 2005 @@ -36,16 +36,11 @@ if ( (d = alloc_domain()) == NULL ) return NULL; - v = d->vcpu[0]; + d->domain_id = dom_id; atomic_set(&d->refcnt, 1); - atomic_set(&v->pausecnt, 0); - - d->domain_id = dom_id; - v->processor = cpu; spin_lock_init(&d->big_lock); - spin_lock_init(&d->page_alloc_lock); INIT_LIST_HEAD(&d->page_list); INIT_LIST_HEAD(&d->xenpage_list); @@ -63,10 +58,16 @@ return NULL; } + if ( (v = alloc_vcpu(d, 0, cpu)) == NULL ) + { + grant_table_destroy(d); + evtchn_destroy(d); + free_domain(d); + return NULL; + } + arch_do_createdomain(v); - sched_add_domain(v); - if ( !is_idle_task(d) ) { write_lock(&domlist_lock); @@ -370,8 +371,6 @@ if ( (rc = arch_set_info_guest(v, ctxt)) != 0 ) return rc; - sched_add_domain(v); - return rc; } diff -r af38c6b205f6 -r d6e99066959a xen/common/schedule.c --- a/xen/common/schedule.c Wed Oct 12 16:00:29 2005 +++ b/xen/common/schedule.c Wed Oct 12 16:01:38 2005 @@ -93,7 +93,8 @@ xfree(d); } -struct vcpu *alloc_vcpu(struct domain *d, unsigned int vcpu_id) +struct vcpu *alloc_vcpu( + struct domain *d, unsigned int vcpu_id, unsigned int cpu_id) { struct vcpu *v; @@ -104,6 +105,7 @@ v->domain = d; v->vcpu_id = vcpu_id; + v->processor = cpu_id; atomic_set(&v->pausecnt, 0); v->cpumap = CPUMAP_RUNANYWHERE; @@ -116,18 +118,14 @@ return NULL; } - if ( vcpu_id == 0 ) - return v; - - v->vcpu_info = &d->shared_info->vcpu_data[vcpu_id]; - - d->vcpu[v->vcpu_id-1]->next_in_list = v; - - v->processor = (d->vcpu[0]->processor + 1) % num_online_cpus(); - if ( test_bit(_VCPUF_cpu_pinned, &d->vcpu[0]->vcpu_flags) ) - set_bit(_VCPUF_cpu_pinned, &v->vcpu_flags); - - set_bit(_VCPUF_down, &v->vcpu_flags); + sched_add_domain(v); + + if ( vcpu_id != 0 ) + { + v->vcpu_info = &d->shared_info->vcpu_data[vcpu_id]; + d->vcpu[v->vcpu_id-1]->next_in_list = v; + set_bit(_VCPUF_down, &v->vcpu_flags); + } return v; } @@ -136,19 +134,10 @@ { struct domain *d; - if ( (d = xmalloc(struct domain)) == NULL ) - return NULL; - - memset(d, 0, sizeof(*d)); - - if ( alloc_vcpu(d, 0) == NULL ) - goto out; + if ( (d = xmalloc(struct domain)) != NULL ) + memset(d, 0, sizeof(*d)); return d; - - out: - xfree(d); - return NULL; } /* diff -r af38c6b205f6 -r d6e99066959a xen/include/xen/sched.h --- a/xen/include/xen/sched.h Wed Oct 12 16:00:29 2005 +++ b/xen/include/xen/sched.h Wed Oct 12 16:01:38 2005 @@ -167,7 +167,8 @@ #define IDLE_DOMAIN_ID (0x7FFFU) #define is_idle_task(_d) (test_bit(_DOMF_idle_domain, &(_d)->domain_flags)) -struct vcpu *alloc_vcpu(struct domain *d, unsigned int vcpu_id); +struct vcpu *alloc_vcpu( + struct domain *d, unsigned int vcpu_id, unsigned int cpu_id); struct domain *alloc_domain(void); void free_domain(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 |