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

[Xen-changelog] [xen-unstable] Add CPU status info and a status call to the CPU on/offline sysctls.



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1237299941 0
# Node ID 821a4a8911f08a922075a7947f905ad53d1d0dee
# Parent  372ec886ad0c9c5d470d95f49fa6f012af533eaa
Add CPU status info and a status call to the CPU on/offline sysctls.

Signed-off-by: Frank van der Linden <frank.vanderlinden@xxxxxxx>
---
 xen/arch/x86/smpboot.c      |    4 +++-
 xen/arch/x86/sysctl.c       |   24 +++++++++++++++++++++++-
 xen/include/public/sysctl.h |    9 +++++++++
 3 files changed, 35 insertions(+), 2 deletions(-)

diff -r 372ec886ad0c -r 821a4a8911f0 xen/arch/x86/smpboot.c
--- a/xen/arch/x86/smpboot.c    Tue Mar 17 14:24:08 2009 +0000
+++ b/xen/arch/x86/smpboot.c    Tue Mar 17 14:25:41 2009 +0000
@@ -1426,8 +1426,10 @@ int __devinit __cpu_up(unsigned int cpu)
         * cpu_callin_map is set during AP kickstart process. Its reset
         * when a cpu is taken offline from cpu_exit_clear().
         */
-       if (!cpu_isset(cpu, cpu_callin_map))
+       if (!cpu_isset(cpu, cpu_callin_map)) {
                ret = __smp_prepare_cpu(cpu);
+               smpboot_restore_warm_reset_vector();
+       }
 
        if (ret)
                return -EIO;
diff -r 372ec886ad0c -r 821a4a8911f0 xen/arch/x86/sysctl.c
--- a/xen/arch/x86/sysctl.c     Tue Mar 17 14:24:08 2009 +0000
+++ b/xen/arch/x86/sysctl.c     Tue Mar 17 14:25:41 2009 +0000
@@ -38,7 +38,7 @@ long arch_do_sysctl(
 long arch_do_sysctl(
     struct xen_sysctl *sysctl, XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl)
 {
-    long ret = 0;
+    long ret = 0, status;
 
     switch ( sysctl->cmd )
     {
@@ -102,19 +102,41 @@ long arch_do_sysctl(
     {
         unsigned int cpu = sysctl->u.cpu_hotplug.cpu;
 
+        if (cpu_present(cpu)) {
+            status = cpu_online(cpu) ? XEN_CPU_HOTPLUG_STATUS_ONLINE :
+                XEN_CPU_HOTPLUG_STATUS_OFFLINE;
+        } else {
+            status = -EINVAL;
+        }
+
         switch ( sysctl->u.cpu_hotplug.op )
         {
         case XEN_SYSCTL_CPU_HOTPLUG_ONLINE:
             ret = cpu_up(cpu);
+            /*
+             * In the case of a true hotplug, this CPU wasn't present
+             * before, so return the 'new' status for it.
+             */
+            if (ret == 0 && status == -EINVAL)
+                status = XEN_CPU_HOTPLUG_STATUS_NEW;
             break;
         case XEN_SYSCTL_CPU_HOTPLUG_OFFLINE:
             ret = continue_hypercall_on_cpu(
                 0, cpu_down_helper, (void *)(unsigned long)cpu);
             break;
+        case XEN_SYSCTL_CPU_HOTPLUG_STATUS:
+            ret = 0;
+            break;
         default:
             ret = -EINVAL;
             break;
         }
+
+        /*
+         * If the operation was successful, return the old status.
+         */
+        if (ret >= 0)
+            ret = status;
     }
     break;
 
diff -r 372ec886ad0c -r 821a4a8911f0 xen/include/public/sysctl.h
--- a/xen/include/public/sysctl.h       Tue Mar 17 14:24:08 2009 +0000
+++ b/xen/include/public/sysctl.h       Tue Mar 17 14:25:41 2009 +0000
@@ -262,12 +262,21 @@ typedef struct xen_sysctl_get_pmstat xen
 typedef struct xen_sysctl_get_pmstat xen_sysctl_get_pmstat_t;
 DEFINE_XEN_GUEST_HANDLE(xen_sysctl_get_pmstat_t);
 
+/*
+ * Status codes. Must be greater than 0 to avoid confusing
+ * sysctl callers that see 0 as a plain successful return.
+ */
+#define XEN_CPU_HOTPLUG_STATUS_OFFLINE 1
+#define XEN_CPU_HOTPLUG_STATUS_ONLINE  2
+#define XEN_CPU_HOTPLUG_STATUS_NEW     3
+
 #define XEN_SYSCTL_cpu_hotplug       11
 struct xen_sysctl_cpu_hotplug {
     /* IN variables */
     uint32_t cpu;   /* Physical cpu. */
 #define XEN_SYSCTL_CPU_HOTPLUG_ONLINE  0
 #define XEN_SYSCTL_CPU_HOTPLUG_OFFLINE 1
+#define XEN_SYSCTL_CPU_HOTPLUG_STATUS 2
     uint32_t op;    /* hotplug opcode */
 };
 typedef struct xen_sysctl_cpu_hotplug xen_sysctl_cpu_hotplug_t;

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