From 49571f74cbb03e101dc5d2bf96c46f2c23630f13 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 22 Sep 2008 16:07:04 +0100 Subject: [PATCH] x86: Add sysctl for cpu online/offline Signed-off-by: Shan Haitao --- xen/arch/x86/sysctl.c | 25 +++++++++++++++++++++++++ xen/include/public/sysctl.h | 13 +++++++++++++ 2 files changed, 38 insertions(+) diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c index 2fc125d4b9..dbb54ede09 100644 --- a/xen/arch/x86/sysctl.c +++ b/xen/arch/x86/sysctl.c @@ -29,6 +29,12 @@ #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; diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h index 76998c946f..6b10954a53 100644 --- a/xen/include/public/sysctl.h +++ b/xen/include/public/sysctl.h @@ -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; }; -- 2.30.2