diff options
Diffstat (limited to 'arch/x86/xen/smp.c')
| -rw-r--r-- | arch/x86/xen/smp.c | 15 | 
1 files changed, 15 insertions, 0 deletions
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 5fac6919b95..0503c0c493a 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c @@ -178,6 +178,7 @@ static void __init xen_fill_possible_map(void)  static void __init xen_filter_cpu_maps(void)  {  	int i, rc; +	unsigned int subtract = 0;  	if (!xen_initial_domain())  		return; @@ -192,8 +193,22 @@ static void __init xen_filter_cpu_maps(void)  		} else {  			set_cpu_possible(i, false);  			set_cpu_present(i, false); +			subtract++;  		}  	} +#ifdef CONFIG_HOTPLUG_CPU +	/* This is akin to using 'nr_cpus' on the Linux command line. +	 * Which is OK as when we use 'dom0_max_vcpus=X' we can only +	 * have up to X, while nr_cpu_ids is greater than X. This +	 * normally is not a problem, except when CPU hotplugging +	 * is involved and then there might be more than X CPUs +	 * in the guest - which will not work as there is no +	 * hypercall to expand the max number of VCPUs an already +	 * running guest has. So cap it up to X. */ +	if (subtract) +		nr_cpu_ids = nr_cpu_ids - subtract; +#endif +  }  static void __init xen_smp_prepare_boot_cpu(void)  |