# 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
|