[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Some refactoring of domain creation/destruction.



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 1ccc28e075bad4306e3096d860f4bec2654f52b3
# Parent  334dc7e6a23f2786895b706ea50958dc5296c609
Some refactoring of domain creation/destruction.

Interface name changes:
1. do_createdomain -> domain_create

2. domain_destruct -> domain_destroy

Arch-specific changes:
1. arch_do_createdomain -> arch_domain_create
This function now takes a domain pointer, not a VCPU
pointer! Initialisation of VCPU0 must happen in
alloc_vcpu_struct().

2. free_perdomain_pt -> arch_domain_destroy
This function must undo the work of arch_domain_create

TODO: arch_domain_create() refactoring is not completed
for ia64.

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>

diff -r 334dc7e6a23f -r 1ccc28e075ba xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Sat Jan 14 21:17:33 2006
+++ b/xen/arch/ia64/xen/domain.c        Sat Jan 14 22:16:43 2006
@@ -67,10 +67,11 @@
 extern unsigned long dom_fw_setup(struct domain *, char *, int);
 
 /* this belongs in include/asm, but there doesn't seem to be a suitable place 
*/
-void free_perdomain_pt(struct domain *d)
-{
-       printf("free_perdomain_pt: not implemented\n");
+void arch_domain_destroy(struct domain *d)
+{
+       printf("arch_domain_destroy: not implemented\n");
        //free_page((unsigned long)d->mm.perdomain_pt);
+       free_xenheap_page(d->shared_info);
 }
 
 static void default_idle(void)
@@ -192,9 +193,8 @@
        memset(v->arch._thread.fph,0,sizeof(struct ia64_fpreg)*96);
 }
 
-int arch_do_createdomain(struct vcpu *v)
-{
-       struct domain *d = v->domain;
+int arch_domain_create(struct domain *d)
+{
        struct thread_info *ti = alloc_thread_info(v);
 
        /* Clear thread_info to clear some important fields, like preempt_count 
*/
@@ -255,7 +255,7 @@
                printk("Can't allocate pgd for domain %d\n",d->domain_id);
                return -ENOMEM;
        }
-       printf ("arch_do_create_domain: domain=%p\n", d);
+       printf ("arch_domain_create: domain=%p\n", d);
 
        return 0;
 }
diff -r 334dc7e6a23f -r 1ccc28e075ba xen/arch/ia64/xen/xensetup.c
--- a/xen/arch/ia64/xen/xensetup.c      Sat Jan 14 21:17:33 2006
+++ b/xen/arch/ia64/xen/xensetup.c      Sat Jan 14 22:16:43 2006
@@ -281,7 +281,7 @@
 printk("About to call scheduler_init()\n");
     scheduler_init();
     idle_vcpu[0] = (struct vcpu*) ia64_r13;
-    idle_domain = do_createdomain(IDLE_DOMAIN_ID, 0);
+    idle_domain = domain_create(IDLE_DOMAIN_ID, 0);
     BUG_ON(idle_domain == NULL);
 
     late_setup_arch(&cmdline);
@@ -339,14 +339,14 @@
 
 
     /* Create initial domain 0. */
-printk("About to call do_createdomain()\n");
-    dom0 = do_createdomain(0, 0);
+printk("About to call domain_create()\n");
+    dom0 = domain_create(0, 0);
 
 #ifdef CLONE_DOMAIN0
     {
     int i;
     for (i = 0; i < CLONE_DOMAIN0; i++) {
-       clones[i] = do_createdomain(i+1, 0);
+       clones[i] = domain_create(i+1, 0);
         if ( clones[i] == NULL )
             panic("Error creating domain0 clone %d\n",i);
     }
diff -r 334dc7e6a23f -r 1ccc28e075ba xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Sat Jan 14 21:17:33 2006
+++ b/xen/arch/x86/domain.c     Sat Jan 14 22:16:43 2006
@@ -218,41 +218,35 @@
     v->arch.flags = TF_kernel_mode;
 
     if ( is_idle_domain(d) )
+    {
         percpu_ctxt[vcpu_id].curr_vcpu = v;
-
-    if ( (v->vcpu_id = vcpu_id) != 0 )
-    {
-        v->arch.schedule_tail  = d->vcpu[0]->arch.schedule_tail;
-        v->arch.perdomain_ptes =
-            d->arch.mm_perdomain_pt + (vcpu_id << GDT_LDT_VCPU_SHIFT);
-    }
+        v->arch.schedule_tail = continue_idle_domain;
+    }
+    else
+    {
+        v->arch.schedule_tail = continue_nonidle_domain;
+    }
+
+    v->arch.perdomain_ptes =
+        d->arch.mm_perdomain_pt + (vcpu_id << GDT_LDT_VCPU_SHIFT);
+
+    v->arch.guest_vtable  = __linear_l2_table;
+    v->arch.shadow_vtable = __shadow_linear_l2_table;
+#if defined(__x86_64__)
+    v->arch.guest_vl3table = __linear_l3_table;
+    v->arch.guest_vl4table = __linear_l4_table;
+#endif
 
     return v;
 }
 
 void free_vcpu_struct(struct vcpu *v)
 {
-    BUG_ON(v->next_in_list != NULL);
-    if ( v->vcpu_id != 0 )
-        v->domain->vcpu[v->vcpu_id - 1]->next_in_list = NULL;
     xfree(v);
 }
 
-void free_perdomain_pt(struct domain *d)
-{
-    free_xenheap_pages(
-        d->arch.mm_perdomain_pt,
-        get_order_from_bytes(PDPT_L1_ENTRIES * sizeof(l1_pgentry_t)));
-
-#ifdef __x86_64__
-    free_xenheap_page(d->arch.mm_perdomain_l2);
-    free_xenheap_page(d->arch.mm_perdomain_l3);
-#endif
-}
-
-int arch_do_createdomain(struct vcpu *v)
-{
-    struct domain *d = v->domain;
+int arch_domain_create(struct domain *d)
+{
     l1_pgentry_t gdt_l1e;
     int vcpuid, pdpt_order, rc;
 #ifdef __x86_64__
@@ -263,9 +257,7 @@
     d->arch.mm_perdomain_pt = alloc_xenheap_pages(pdpt_order);
     if ( d->arch.mm_perdomain_pt == NULL )
         goto fail_nomem;
-
     memset(d->arch.mm_perdomain_pt, 0, PAGE_SIZE << pdpt_order);
-    v->arch.perdomain_ptes = d->arch.mm_perdomain_pt;
 
     /*
      * Map Xen segments into every VCPU's GDT, irrespective of whether every
@@ -279,17 +271,11 @@
         d->arch.mm_perdomain_pt[((vcpuid << GDT_LDT_VCPU_SHIFT) +
                                  FIRST_RESERVED_GDT_PAGE)] = gdt_l1e;
 
-    v->arch.guest_vtable  = __linear_l2_table;
-    v->arch.shadow_vtable = __shadow_linear_l2_table;
-
 #if defined(__i386__)
 
     mapcache_init(d);
 
 #else /* __x86_64__ */
-
-    v->arch.guest_vl3table = __linear_l3_table;
-    v->arch.guest_vl4table = __linear_l4_table;
 
     d->arch.mm_perdomain_l2 = alloc_xenheap_page();
     d->arch.mm_perdomain_l3 = alloc_xenheap_page();
@@ -327,12 +313,8 @@
             goto fail_nomem;
 
         memset(d->shared_info, 0, PAGE_SIZE);
-        v->vcpu_info = &d->shared_info->vcpu_info[v->vcpu_id];
         SHARE_PFN_WITH_DOMAIN(virt_to_page(d->shared_info), d);
     }
-
-    v->arch.schedule_tail = is_idle_domain(d) ?
-        continue_idle_domain : continue_nonidle_domain;
 
     return 0;
 
@@ -344,6 +326,20 @@
 #endif
     free_xenheap_pages(d->arch.mm_perdomain_pt, pdpt_order);
     return -ENOMEM;
+}
+
+void arch_domain_destroy(struct domain *d)
+{
+    free_xenheap_pages(
+        d->arch.mm_perdomain_pt,
+        get_order_from_bytes(PDPT_L1_ENTRIES * sizeof(l1_pgentry_t)));
+
+#ifdef __x86_64__
+    free_xenheap_page(d->arch.mm_perdomain_l2);
+    free_xenheap_page(d->arch.mm_perdomain_l3);
+#endif
+
+    free_xenheap_page(d->shared_info);
 }
 
 /* This is called by arch_final_setup_guest and do_boot_vcpu */
diff -r 334dc7e6a23f -r 1ccc28e075ba xen/arch/x86/setup.c
--- a/xen/arch/x86/setup.c      Sat Jan 14 21:17:33 2006
+++ b/xen/arch/x86/setup.c      Sat Jan 14 22:16:43 2006
@@ -385,7 +385,7 @@
 
     scheduler_init();
 
-    idle_domain = do_createdomain(IDLE_DOMAIN_ID, 0);
+    idle_domain = domain_create(IDLE_DOMAIN_ID, 0);
     BUG_ON(idle_domain == NULL);
 
     set_current(idle_domain->vcpu[0]);
@@ -487,7 +487,7 @@
     acm_init(&initrdidx, mbi, initial_images_start);
 
     /* Create initial domain 0. */
-    dom0 = do_createdomain(0, 0);
+    dom0 = domain_create(0, 0);
     if ( dom0 == NULL )
         panic("Error creating domain 0\n");
 
diff -r 334dc7e6a23f -r 1ccc28e075ba xen/common/dom0_ops.c
--- a/xen/common/dom0_ops.c     Sat Jan 14 21:17:33 2006
+++ b/xen/common/dom0_ops.c     Sat Jan 14 22:16:43 2006
@@ -208,7 +208,7 @@
                 pro = i;
 
         ret = -ENOMEM;
-        if ( (d = do_createdomain(dom, pro)) == NULL )
+        if ( (d = domain_create(dom, pro)) == NULL )
             break;
 
         memcpy(d->handle, op->u.createdomain.handle,
diff -r 334dc7e6a23f -r 1ccc28e075ba xen/common/domain.c
--- a/xen/common/domain.c       Sat Jan 14 21:17:33 2006
+++ b/xen/common/domain.c       Sat Jan 14 22:16:43 2006
@@ -29,7 +29,7 @@
 
 struct domain *dom0;
 
-struct domain *do_createdomain(domid_t dom_id, unsigned int cpu)
+struct domain *domain_create(domid_t dom_id, unsigned int cpu)
 {
     struct domain *d, **pd;
     struct vcpu *v;
@@ -46,25 +46,27 @@
     INIT_LIST_HEAD(&d->page_list);
     INIT_LIST_HEAD(&d->xenpage_list);
 
+    rangeset_domain_initialise(d);
+
     if ( !is_idle_domain(d) )
+    {
         set_bit(_DOMF_ctrl_pause, &d->domain_flags);
-
-    if ( !is_idle_domain(d) &&
-         ((evtchn_init(d) != 0) || (grant_table_create(d) != 0)) )
-        goto fail1;
-    
+        if ( evtchn_init(d) != 0 )
+            goto fail1;
+        if ( grant_table_create(d) != 0 )
+            goto fail2;
+    }
+
+    if ( arch_domain_create(d) != 0 )
+        goto fail3;
+
     if ( (v = alloc_vcpu(d, 0, cpu)) == NULL )
-        goto fail2;
-
-    rangeset_domain_initialise(d);
+        goto fail4;
 
     d->iomem_caps = rangeset_new(d, "I/O Memory", RANGESETF_prettyprint_hex);
     d->irq_caps   = rangeset_new(d, "Interrupts", 0);
-
-    if ( (d->iomem_caps == NULL) ||
-         (d->irq_caps == NULL) ||
-         (arch_do_createdomain(v) != 0) )
-        goto fail3;
+    if ( (d->iomem_caps == NULL) || (d->irq_caps == NULL) )
+        goto fail5;
 
     if ( !is_idle_domain(d) )
     {
@@ -82,12 +84,18 @@
 
     return d;
 
+ fail5:
+    free_vcpu(v);
+ fail4:
+    arch_domain_destroy(d);
  fail3:
+    if ( !is_idle_domain(d) )
+        grant_table_destroy(d);
+ fail2:
+    if ( !is_idle_domain(d) )
+        evtchn_destroy(d);
+ fail1:
     rangeset_domain_destroy(d);
- fail2:
-    grant_table_destroy(d);
- fail1:
-    evtchn_destroy(d);
     free_domain(d);
     return NULL;
 }
@@ -256,16 +264,16 @@
 
 
 /* Release resources belonging to task @p. */
-void domain_destruct(struct domain *d)
+void domain_destroy(struct domain *d)
 {
     struct domain **pd;
     atomic_t      old, new;
 
     BUG_ON(!test_bit(_DOMF_dying, &d->domain_flags));
 
-    /* May be already destructed, or get_domain() can race us. */
+    /* May be already destroyed, or get_domain() can race us. */
     _atomic_set(old, 0);
-    _atomic_set(new, DOMAIN_DESTRUCTED);
+    _atomic_set(new, DOMAIN_DESTROYED);
     old = atomic_compareandswap(old, new, &d->refcnt);
     if ( _atomic_read(old) != 0 )
         return;
@@ -287,8 +295,7 @@
     evtchn_destroy(d);
     grant_table_destroy(d);
 
-    free_perdomain_pt(d);
-    free_xenheap_page(d->shared_info);
+    arch_domain_destroy(d);
 
     free_domain(d);
 
diff -r 334dc7e6a23f -r 1ccc28e075ba xen/common/schedule.c
--- a/xen/common/schedule.c     Sat Jan 14 21:17:33 2006
+++ b/xen/common/schedule.c     Sat Jan 14 22:16:43 2006
@@ -100,6 +100,7 @@
     v->vcpu_id = vcpu_id;
     v->processor = cpu_id;
     atomic_set(&v->pausecnt, 0);
+    v->vcpu_info = &d->shared_info->vcpu_info[vcpu_id];
 
     v->cpu_affinity = is_idle_domain(d) ?
         cpumask_of_cpu(cpu_id) : CPU_MASK_ALL;
@@ -117,12 +118,18 @@
 
     if ( vcpu_id != 0 )
     {
-        v->vcpu_info = &d->shared_info->vcpu_info[vcpu_id];
         d->vcpu[v->vcpu_id-1]->next_in_list = v;
-        set_bit(_VCPUF_down, &v->vcpu_flags);
+        if ( !is_idle_domain(d) )
+            set_bit(_VCPUF_down, &v->vcpu_flags);
     }
 
     return v;
+}
+
+void free_vcpu(struct vcpu *v)
+{
+    /* NB. Rest of destruction is done in free_domain(). */
+    sched_rem_domain(v);
 }
 
 struct domain *alloc_domain(void)
diff -r 334dc7e6a23f -r 1ccc28e075ba xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Sat Jan 14 21:17:33 2006
+++ b/xen/include/asm-ia64/domain.h     Sat Jan 14 22:16:43 2006
@@ -9,8 +9,6 @@
 #include <public/arch-ia64.h>
 #include <asm/vmx_platform.h>
 #include <xen/list.h>
-
-extern int arch_do_createdomain(struct vcpu *);
 
 extern void domain_relinquish_resources(struct domain *);
 
diff -r 334dc7e6a23f -r 1ccc28e075ba xen/include/xen/domain.h
--- a/xen/include/xen/domain.h  Sat Jan 14 21:17:33 2006
+++ b/xen/include/xen/domain.h  Sat Jan 14 22:16:43 2006
@@ -13,12 +13,12 @@
 
 extern void free_vcpu_struct(struct vcpu *v);
 
-extern int arch_do_createdomain(struct vcpu *v);
+extern int arch_domain_create(struct domain *d);
+
+extern void arch_domain_destroy(struct domain *d);
 
 extern int arch_set_info_guest(
     struct vcpu *v, struct vcpu_guest_context *c);
-
-extern void free_perdomain_pt(struct domain *d);
 
 extern void domain_relinquish_resources(struct domain *d);
 
diff -r 334dc7e6a23f -r 1ccc28e075ba xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Sat Jan 14 21:17:33 2006
+++ b/xen/include/xen/sched.h   Sat Jan 14 22:16:43 2006
@@ -181,17 +181,18 @@
 
 struct vcpu *alloc_vcpu(
     struct domain *d, unsigned int vcpu_id, unsigned int cpu_id);
+void free_vcpu(struct vcpu *v);
 
 struct domain *alloc_domain(void);
 void free_domain(struct domain *d);
 
-#define DOMAIN_DESTRUCTED (1<<31) /* assumes atomic_t is >= 32 bits */
+#define DOMAIN_DESTROYED (1<<31) /* assumes atomic_t is >= 32 bits */
 #define put_domain(_d) \
-  if ( atomic_dec_and_test(&(_d)->refcnt) ) domain_destruct(_d)
+  if ( atomic_dec_and_test(&(_d)->refcnt) ) domain_destroy(_d)
 
 /*
  * Use this when you don't have an existing reference to @d. It returns
- * FALSE if @d is being destructed.
+ * FALSE if @d is being destroyed.
  */
 static always_inline int get_domain(struct domain *d)
 {
@@ -199,7 +200,7 @@
     do
     {
         old = seen;
-        if ( unlikely(_atomic_read(old) & DOMAIN_DESTRUCTED) )
+        if ( unlikely(_atomic_read(old) & DOMAIN_DESTROYED) )
             return 0;
         _atomic_set(new, _atomic_read(old) + 1);
         seen = atomic_compareandswap(old, new, &d->refcnt);
@@ -210,15 +211,15 @@
 
 /*
  * Use this when you already have, or are borrowing, a reference to @d.
- * In this case we know that @d cannot be destructed under our feet.
+ * In this case we know that @d cannot be destroyed under our feet.
  */
 static inline void get_knownalive_domain(struct domain *d)
 {
     atomic_inc(&d->refcnt);
-    ASSERT(!(atomic_read(&d->refcnt) & DOMAIN_DESTRUCTED));
+    ASSERT(!(atomic_read(&d->refcnt) & DOMAIN_DESTROYED));
 }
 
-extern struct domain *do_createdomain(
+extern struct domain *domain_create(
     domid_t dom_id, unsigned int cpu);
 extern int construct_dom0(
     struct domain *d,
@@ -228,7 +229,7 @@
 extern int set_info_guest(struct domain *d, dom0_setvcpucontext_t *);
 
 struct domain *find_domain_by_id(domid_t dom);
-extern void domain_destruct(struct domain *d);
+extern void domain_destroy(struct domain *d);
 extern void domain_kill(struct domain *d);
 extern void domain_shutdown(struct domain *d, u8 reason);
 extern void domain_pause_for_debugger(void);

_______________________________________________
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®.