-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Note the changes from 2.6.18-xen CPU hotplugging: A vcpu_down request from the remote admin via Xenbus both hotunplugs the CPU, and disables it by removing it from the cpu_present map, and removing its entry in /sys. A vcpu_up request from the remote admin only re-enables the CPU, and does not immediately bring the CPU up. A udev event is emitted, which can be caught by the user if he wishes to automatically re-up CPUs when available, or implement a more complex policy. Signed-off-by: Alex Nixon <alex.nixon@citrix.com> Acked-by: Jeremy Fitzhardinge <jeremy@goop.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
- Loading branch information
Alex Nixon
authored and
Ingo Molnar
committed
Aug 25, 2008
1 parent
8227dce
commit d68d82a
Showing
7 changed files
with
162 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
obj-y += grant-table.o features.o events.o manage.o | ||
obj-y += grant-table.o features.o events.o manage.o cpu_hotplug.o | ||
obj-y += xenbus/ | ||
obj-$(CONFIG_XEN_XENCOMM) += xencomm.o | ||
obj-$(CONFIG_XEN_BALLOON) += balloon.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
#include <linux/notifier.h> | ||
|
||
#include <xen/xenbus.h> | ||
|
||
#include <asm-x86/xen/hypervisor.h> | ||
#include <asm/cpu.h> | ||
|
||
static void enable_hotplug_cpu(int cpu) | ||
{ | ||
if (!cpu_present(cpu)) | ||
arch_register_cpu(cpu); | ||
|
||
cpu_set(cpu, cpu_present_map); | ||
} | ||
|
||
static void disable_hotplug_cpu(int cpu) | ||
{ | ||
if (cpu_present(cpu)) | ||
arch_unregister_cpu(cpu); | ||
|
||
cpu_clear(cpu, cpu_present_map); | ||
} | ||
|
||
static void vcpu_hotplug(unsigned int cpu) | ||
{ | ||
int err; | ||
char dir[32], state[32]; | ||
|
||
if (!cpu_possible(cpu)) | ||
return; | ||
|
||
sprintf(dir, "cpu/%u", cpu); | ||
err = xenbus_scanf(XBT_NIL, dir, "availability", "%s", state); | ||
if (err != 1) { | ||
printk(KERN_ERR "XENBUS: Unable to read cpu state\n"); | ||
return; | ||
} | ||
|
||
if (strcmp(state, "online") == 0) { | ||
enable_hotplug_cpu(cpu); | ||
} else if (strcmp(state, "offline") == 0) { | ||
(void)cpu_down(cpu); | ||
disable_hotplug_cpu(cpu); | ||
} else { | ||
printk(KERN_ERR "XENBUS: unknown state(%s) on CPU%d\n", | ||
state, cpu); | ||
} | ||
} | ||
|
||
static void handle_vcpu_hotplug_event(struct xenbus_watch *watch, | ||
const char **vec, unsigned int len) | ||
{ | ||
unsigned int cpu; | ||
char *cpustr; | ||
const char *node = vec[XS_WATCH_PATH]; | ||
|
||
cpustr = strstr(node, "cpu/"); | ||
if (cpustr != NULL) { | ||
sscanf(cpustr, "cpu/%u", &cpu); | ||
vcpu_hotplug(cpu); | ||
} | ||
} | ||
|
||
static int setup_cpu_watcher(struct notifier_block *notifier, | ||
unsigned long event, void *data) | ||
{ | ||
static struct xenbus_watch cpu_watch = { | ||
.node = "cpu", | ||
.callback = handle_vcpu_hotplug_event}; | ||
|
||
(void)register_xenbus_watch(&cpu_watch); | ||
|
||
return NOTIFY_DONE; | ||
} | ||
|
||
static int __init setup_vcpu_hotplug_event(void) | ||
{ | ||
static struct notifier_block xsn_cpu = { | ||
.notifier_call = setup_cpu_watcher }; | ||
|
||
if (!is_running_on_xen()) | ||
return -ENODEV; | ||
|
||
register_xenstore_notifier(&xsn_cpu); | ||
|
||
return 0; | ||
} | ||
|
||
arch_initcall(setup_vcpu_hotplug_event); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters