x86: Add sysctl for cpu online/offline
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 22 Sep 2008 15:07:04 +0000 (16:07 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 22 Sep 2008 15:07:04 +0000 (16:07 +0100)
Signed-off-by: Shan Haitao <haitao.shan@intel.com>
xen/arch/x86/sysctl.c
xen/include/public/sysctl.h

index 2fc125d4b9924494d6e75ca93bf8954002d947a5..dbb54ede0985f2a8781ebd1d3aeb073b5c8e736f 100644 (file)
 
 #define get_xen_guest_handle(val, hnd)  do { val = (hnd).p; } while (0)
 
+static long cpu_down_helper(void *data)
+{
+    int cpu = (unsigned long)data;
+    return cpu_down(cpu);
+}
+
 long arch_do_sysctl(
     struct xen_sysctl *sysctl, XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl)
 {
@@ -92,6 +98,25 @@ long arch_do_sysctl(
     }
     break;
     
+    case XEN_SYSCTL_cpu_hotplug:
+    {
+        unsigned int cpu = sysctl->u.cpu_hotplug.cpu;
+
+        switch ( sysctl->u.cpu_hotplug.op )
+        {
+        case XEN_SYSCTL_CPU_HOTPLUG_ONLINE:
+            ret = cpu_up(cpu);
+            break;
+        case XEN_SYSCTL_CPU_HOTPLUG_OFFLINE:
+            ret = continue_hypercall_on_cpu(
+                0, cpu_down_helper, (void *)(unsigned long)cpu);
+            break;
+        default:
+            ret = -EINVAL;
+            break;
+        }
+    }
+    break;
 
     default:
         ret = -ENOSYS;
index 76998c946f524cd9251cb68157db4012ff417063..6b10954a53e1d5fa7b5ebbd90fcdb92228af82c4 100644 (file)
@@ -262,6 +262,18 @@ struct xen_sysctl_get_pmstat {
 typedef struct xen_sysctl_get_pmstat xen_sysctl_get_pmstat_t;
 DEFINE_XEN_GUEST_HANDLE(xen_sysctl_get_pmstat_t);
 
+#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
+    uint32_t op;    /* hotplug opcode */
+};
+typedef struct xen_sysctl_cpu_hotplug xen_sysctl_cpu_hotplug_t;
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpu_hotplug_t);
+
+
 struct xen_sysctl {
     uint32_t cmd;
     uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
@@ -276,6 +288,7 @@ struct xen_sysctl {
         struct xen_sysctl_getcpuinfo        getcpuinfo;
         struct xen_sysctl_availheap         availheap;
         struct xen_sysctl_get_pmstat        get_pmstat;
+        struct xen_sysctl_cpu_hotplug       cpu_hotplug;
         uint8_t                             pad[128];
     } u;
 };