|
@@ -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)
|