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

[Xen-changelog] [xen-unstable] x86: Add VGCF_onlien flag to vcpu_guest_context.



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1173707623 0
# Node ID f3f5f2756d750b8c2576e3dd4b817d12cee002ba
# Parent  1721f90e14220beda99ae5f68aef8eb411eaf5c7
x86: Add VGCF_onlien flag to vcpu_guest_context.
Change common Xen code to start all VCPUs (except idle ones)
offline. Change arch code to deal with this.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 tools/libxc/xc_dom_x86.c              |    4 ++--
 tools/libxc/xc_hvm_build.c            |    8 +++++++-
 tools/libxc/xc_linux_restore.c        |    5 +++++
 xen/arch/ia64/xen/domain.c            |    8 ++++++--
 xen/arch/powerpc/domain.c             |    5 ++++-
 xen/arch/powerpc/domain_build.c       |    1 +
 xen/arch/x86/domain.c                 |    7 ++++++-
 xen/arch/x86/domain_build.c           |    1 +
 xen/common/domain.c                   |    2 +-
 xen/common/domctl.c                   |   20 ++++++++------------
 xen/include/public/arch-x86/xen.h     |    2 ++
 xen/include/public/foreign/structs.py |    2 ++
 12 files changed, 45 insertions(+), 20 deletions(-)

diff -r 1721f90e1422 -r f3f5f2756d75 tools/libxc/xc_dom_x86.c
--- a/tools/libxc/xc_dom_x86.c  Mon Mar 12 11:15:56 2007 +0000
+++ b/tools/libxc/xc_dom_x86.c  Mon Mar 12 13:53:43 2007 +0000
@@ -455,7 +455,7 @@ static int vcpu_x86_32(struct xc_dom_ima
     ctxt->kernel_ss = ctxt->user_regs.ss;
     ctxt->kernel_sp = ctxt->user_regs.esp;
 
-    ctxt->flags = VGCF_in_kernel_X86_32;
+    ctxt->flags = VGCF_in_kernel_X86_32 | VGCF_online_X86_32;
     if ( dom->parms.pae == 2 /* extended_cr3 */ ||
          dom->parms.pae == 3 /* bimodal */ )
         ctxt->vm_assist |= (1UL << VMASST_TYPE_pae_extended_cr3);
@@ -494,7 +494,7 @@ static int vcpu_x86_64(struct xc_dom_ima
     ctxt->kernel_ss = ctxt->user_regs.ss;
     ctxt->kernel_sp = ctxt->user_regs.esp;
 
-    ctxt->flags = VGCF_in_kernel_X86_64;
+    ctxt->flags = VGCF_in_kernel_X86_64 | VGCF_online_X86_64;
     cr3_pfn = xc_dom_p2m_guest(dom, dom->pgtables_seg.pfn);
     ctxt->ctrlreg[3] = xen_pfn_to_cr3_x86_64(cr3_pfn);
     xc_dom_printf("%s: cr3: pfn 0x%" PRIpfn " mfn 0x%" PRIpfn "\n",
diff -r 1721f90e1422 -r f3f5f2756d75 tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c        Mon Mar 12 11:15:56 2007 +0000
+++ b/tools/libxc/xc_hvm_build.c        Mon Mar 12 13:53:43 2007 +0000
@@ -302,9 +302,15 @@ static int setup_guest(int xc_handle,
 
     /* Set [er]ip in the way that's right for Xen */
     if ( strstr(caps, "x86_64") )
+    {
         ctxt->c64.user_regs.rip = elf_uval(&elf, elf.ehdr, e_entry); 
+        ctxt->c64.flags = VGCF_online;
+    }
     else
+    {
         ctxt->c32.user_regs.eip = elf_uval(&elf, elf.ehdr, e_entry);
+        ctxt->c32.flags = VGCF_online;
+    }
 
     return 0;
 
@@ -344,7 +350,7 @@ static int xc_hvm_build_internal(int xc_
 
     memset(&launch_domctl, 0, sizeof(launch_domctl));
     launch_domctl.domain = (domid_t)domid;
-    launch_domctl.u.vcpucontext.vcpu   = 0;
+    launch_domctl.u.vcpucontext.vcpu = 0;
     set_xen_guest_handle(launch_domctl.u.vcpucontext.ctxt, &ctxt.c);
     launch_domctl.cmd = XEN_DOMCTL_setvcpucontext;
     rc = xc_domctl(xc_handle, &launch_domctl);
diff -r 1721f90e1422 -r f3f5f2756d75 tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c    Mon Mar 12 11:15:56 2007 +0000
+++ b/tools/libxc/xc_linux_restore.c    Mon Mar 12 13:53:43 2007 +0000
@@ -189,6 +189,7 @@ int xc_linux_restore(int xc_handle, int 
 
     uint64_t vcpumap = 1ULL;
     unsigned int max_vcpu_id = 0;
+    int new_ctxt_format = 0;
 
     max_pfn = nr_pfns;
 
@@ -372,6 +373,7 @@ int xc_linux_restore(int xc_handle, int 
         }
 
         if (j == -2) {
+            new_ctxt_format = 1;
             if (!read_exact(io_fd, &max_vcpu_id, sizeof(int)) ||
                 (max_vcpu_id >= 64) ||
                 !read_exact(io_fd, &vcpumap, sizeof(uint64_t))) {
@@ -797,6 +799,9 @@ int xc_linux_restore(int xc_handle, int 
             goto out;
         }
 
+        if ( !new_ctxt_format )
+            ctxt.flags |= VGCF_online;
+
         if (i == 0) {
             /*
              * Uncanonicalise the suspend-record frame number and poke
diff -r 1721f90e1422 -r f3f5f2756d75 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Mon Mar 12 11:15:56 2007 +0000
+++ b/xen/arch/ia64/xen/domain.c        Mon Mar 12 13:53:43 2007 +0000
@@ -672,8 +672,11 @@ int arch_set_info_guest(struct vcpu *v, 
        /* This overrides some registers. */
        vcpu_init_regs(v);
 
-       /* Don't redo final setup */
-       set_bit(_VCPUF_initialised, &v->vcpu_flags);
+       /* Don't redo final setup. Auto-online VCPU0. */
+       if (!test_and_set_bit(_VCPUF_initialised, &v->vcpu_flags) &&
+           (v->vcpu_id == 0))
+               clear_bit(_VCPUF_down, &v->vcpu_flags);
+
        return 0;
 }
 
@@ -1182,6 +1185,7 @@ int construct_dom0(struct domain *d,
        printk("Dom0: 0x%lx\n", (u64)dom0);
 
        set_bit(_VCPUF_initialised, &v->vcpu_flags);
+       clear_bit(_VCPUF_down, &v->vcpu_flags);
 
        /* Build firmware.
           Note: Linux kernel reserve memory used by start_info, so there is
diff -r 1721f90e1422 -r f3f5f2756d75 xen/arch/powerpc/domain.c
--- a/xen/arch/powerpc/domain.c Mon Mar 12 11:15:56 2007 +0000
+++ b/xen/arch/powerpc/domain.c Mon Mar 12 13:53:43 2007 +0000
@@ -168,7 +168,10 @@ int arch_set_info_guest(struct vcpu *v, 
     d->shared_info->wc_nsec = dom0->shared_info->wc_nsec;
     d->shared_info->arch.boot_timebase = dom0->shared_info->arch.boot_timebase;
 
-    set_bit(_VCPUF_initialised, &v->vcpu_flags);
+    /* Auto-online VCPU0 when it is initialised. */
+    if ( !test_and_set_bit(_VCPUF_initialised, &v->vcpu_flags) &&
+         (v->vcpu_id == 0) )
+        clear_bit(_VCPUF_down, &v->vcpu_flags);
 
     cpu_init_vcpu(v);
 
diff -r 1721f90e1422 -r f3f5f2756d75 xen/arch/powerpc/domain_build.c
--- a/xen/arch/powerpc/domain_build.c   Mon Mar 12 11:15:56 2007 +0000
+++ b/xen/arch/powerpc/domain_build.c   Mon Mar 12 13:53:43 2007 +0000
@@ -274,6 +274,7 @@ int construct_dom0(struct domain *d,
     ofd_dom0_fixup(d, *ofh_tree + rma, cmdline, shared_info_addr);
 
     set_bit(_VCPUF_initialised, &v->vcpu_flags);
+    clear_bit(_VCPUF_down, &v->vcpu_flags);
 
     rc = 0;
 
diff -r 1721f90e1422 -r f3f5f2756d75 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Mon Mar 12 11:15:56 2007 +0000
+++ b/xen/arch/x86/domain.c     Mon Mar 12 13:53:43 2007 +0000
@@ -601,7 +601,7 @@ int arch_set_info_guest(
     }
 
     if ( test_bit(_VCPUF_initialised, &v->vcpu_flags) )
-        return 0;
+        goto out;
 
     memset(v->arch.guest_context.debugreg, 0,
            sizeof(v->arch.guest_context.debugreg));
@@ -706,6 +706,11 @@ int arch_set_info_guest(
 
     update_cr3(v);
 
+ out:
+    if ( flags & VGCF_online )
+        clear_bit(_VCPUF_down, &v->vcpu_flags);
+    else
+        set_bit(_VCPUF_down, &v->vcpu_flags);
     return 0;
 #undef c
 }
diff -r 1721f90e1422 -r f3f5f2756d75 xen/arch/x86/domain_build.c
--- a/xen/arch/x86/domain_build.c       Mon Mar 12 11:15:56 2007 +0000
+++ b/xen/arch/x86/domain_build.c       Mon Mar 12 13:53:43 2007 +0000
@@ -902,6 +902,7 @@ int construct_dom0(struct domain *d,
     update_domain_wallclock_time(d);
 
     set_bit(_VCPUF_initialised, &v->vcpu_flags);
+    clear_bit(_VCPUF_down, &v->vcpu_flags);
 
     /*
      * Initial register values:
diff -r 1721f90e1422 -r f3f5f2756d75 xen/common/domain.c
--- a/xen/common/domain.c       Mon Mar 12 11:15:56 2007 +0000
+++ b/xen/common/domain.c       Mon Mar 12 13:53:43 2007 +0000
@@ -102,7 +102,7 @@ struct vcpu *alloc_vcpu(
     v->runstate.state = is_idle_vcpu(v) ? RUNSTATE_running : RUNSTATE_offline;
     v->runstate.state_entry_time = NOW();
 
-    if ( (vcpu_id != 0) && !is_idle_domain(d) )
+    if ( !is_idle_domain(d) )
         set_bit(_VCPUF_down, &v->vcpu_flags);
 
     if ( sched_init_vcpu(v, cpu_id) != 0 )
diff -r 1721f90e1422 -r f3f5f2756d75 xen/common/domctl.c
--- a/xen/common/domctl.c       Mon Mar 12 11:15:56 2007 +0000
+++ b/xen/common/domctl.c       Mon Mar 12 13:53:43 2007 +0000
@@ -268,18 +268,14 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
     case XEN_DOMCTL_unpausedomain:
     {
         struct domain *d = rcu_lock_domain_by_id(op->domain);
-        ret = -ESRCH;
-        if ( d != NULL )
-        {
-            ret = -EINVAL;
-            if ( (d != current->domain) && (d->vcpu[0] != NULL) &&
-                 test_bit(_VCPUF_initialised, &d->vcpu[0]->vcpu_flags) )
-            {
-                domain_unpause_by_systemcontroller(d);
-                ret = 0;
-            }
-            rcu_unlock_domain(d);
-        }
+
+        ret = -ESRCH;
+        if ( d == NULL )
+            break;
+
+        domain_unpause_by_systemcontroller(d);
+        rcu_unlock_domain(d);
+        ret = 0;
     }
     break;
 
diff -r 1721f90e1422 -r f3f5f2756d75 xen/include/public/arch-x86/xen.h
--- a/xen/include/public/arch-x86/xen.h Mon Mar 12 11:15:56 2007 +0000
+++ b/xen/include/public/arch-x86/xen.h Mon Mar 12 13:53:43 2007 +0000
@@ -126,6 +126,8 @@ struct vcpu_guest_context {
 #define VGCF_failsafe_disables_events  (1<<_VGCF_failsafe_disables_events)
 #define _VGCF_syscall_disables_events  4
 #define VGCF_syscall_disables_events   (1<<_VGCF_syscall_disables_events)
+#define _VGCF_online                   5
+#define VGCF_online                    (1<<_VGCF_online)
     unsigned long flags;                    /* VGCF_* flags                 */
     struct cpu_user_regs user_regs;         /* User-level CPU registers     */
     struct trap_info trap_ctxt[256];        /* Virtual IDT                  */
diff -r 1721f90e1422 -r f3f5f2756d75 xen/include/public/foreign/structs.py
--- a/xen/include/public/foreign/structs.py     Mon Mar 12 11:15:56 2007 +0000
+++ b/xen/include/public/foreign/structs.py     Mon Mar 12 13:53:43 2007 +0000
@@ -41,6 +41,8 @@ defines = [ "__i386__",
             "VGCF_failsafe_disables_events",
             "_VGCF_syscall_disables_events",
             "VGCF_syscall_disables_events",
+            "_VGCF_online",
+            "VGCF_online",
 
             # ia64
             "VGCF_EXTRA_REGS",

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