diff options
| author | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2009-04-07 13:16:04 -0700 | 
|---|---|---|
| committer | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2009-04-07 13:16:04 -0700 | 
| commit | a811454027352c762e0d5bba1b1d8f7d26bf96ae (patch) | |
| tree | 4b00859051e2c308f33a3554654e5862ed306da7 /drivers/xen | |
| parent | 1943689c47acaad7fc7f3dae8d35ef82de5d48f4 (diff) | |
| parent | 53152f957d4a5dfd537d17c823afeb1a2c03753e (diff) | |
| download | linux-a811454027352c762e0d5bba1b1d8f7d26bf96ae.tar.bz2 | |
Merge branch 'for-linus/xen/core' into for-linus/xen/master
* for-linus/xen/core:
  xen: honour VCPU availability on boot
Diffstat (limited to 'drivers/xen')
| -rw-r--r-- | drivers/xen/cpu_hotplug.c | 40 | 
1 files changed, 30 insertions, 10 deletions
diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c index 974f56d1ebe1..411cb1fc9279 100644 --- a/drivers/xen/cpu_hotplug.c +++ b/drivers/xen/cpu_hotplug.c @@ -21,29 +21,41 @@ static void disable_hotplug_cpu(int cpu)  	cpu_clear(cpu, cpu_present_map);  } -static void vcpu_hotplug(unsigned int cpu) +static int vcpu_online(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; +		return err;  	} -	if (strcmp(state, "online") == 0) { +	if (strcmp(state, "online") == 0) +		return 1; +	else if (strcmp(state, "offline") == 0) +		return 0; + +	printk(KERN_ERR "XENBUS: unknown state(%s) on CPU%d\n", state, cpu); +	return -EINVAL; +} +static void vcpu_hotplug(unsigned int cpu) +{ +	if (!cpu_possible(cpu)) +		return; + +	switch (vcpu_online(cpu)) { +	case 1:  		enable_hotplug_cpu(cpu); -	} else if (strcmp(state, "offline") == 0) { +		break; +	case 0:  		(void)cpu_down(cpu);  		disable_hotplug_cpu(cpu); -	} else { -		printk(KERN_ERR "XENBUS: unknown state(%s) on CPU%d\n", -		       state, cpu); +		break; +	default: +		break;  	}  } @@ -64,12 +76,20 @@ static void handle_vcpu_hotplug_event(struct xenbus_watch *watch,  static int setup_cpu_watcher(struct notifier_block *notifier,  			      unsigned long event, void *data)  { +	int cpu;  	static struct xenbus_watch cpu_watch = {  		.node = "cpu",  		.callback = handle_vcpu_hotplug_event};  	(void)register_xenbus_watch(&cpu_watch); +	for_each_possible_cpu(cpu) { +		if (vcpu_online(cpu) == 0) { +			(void)cpu_down(cpu); +			cpu_clear(cpu, cpu_present_map); +		} +	} +  	return NOTIFY_DONE;  }  |