[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.