Skip to content

Commit

Permalink
xen: initialize cpu masks for pv guests in xen_smp_init
Browse files Browse the repository at this point in the history
Pv guests don't have ACPI and need the cpu masks to be set
correctly as early as possible so we call xen_fill_possible_map from
xen_smp_init.
On the other hand the initial domain supports ACPI so in this case we skip
xen_fill_possible_map and rely on it. However Xen might limit the number
of cpus usable by the domain, so we filter those masks during smp
initialization using the VCPUOP_is_up hypercall.
It is important that the filtering is done before
xen_setup_vcpu_info_placement.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
  • Loading branch information
Stefano Stabellini committed Oct 26, 2010
1 parent 0e058e5 commit ea5b8f7
Showing 1 changed file with 22 additions and 2 deletions.
24 changes: 22 additions & 2 deletions arch/x86/xen/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <asm/xen/interface.h>
#include <asm/xen/hypercall.h>

#include <xen/xen.h>
#include <xen/page.h>
#include <xen/events.h>

Expand Down Expand Up @@ -156,6 +157,25 @@ static void __init xen_fill_possible_map(void)
{
int i, rc;

if (xen_initial_domain())
return;

for (i = 0; i < nr_cpu_ids; i++) {
rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL);
if (rc >= 0) {
num_processors++;
set_cpu_possible(i, true);
}
}
}

static void __init xen_filter_cpu_maps(void)
{
int i, rc;

if (!xen_initial_domain())
return;

num_processors = 0;
disabled_cpus = 0;
for (i = 0; i < nr_cpu_ids; i++) {
Expand All @@ -179,6 +199,7 @@ static void __init xen_smp_prepare_boot_cpu(void)
old memory can be recycled */
make_lowmem_page_readwrite(xen_initial_gdt);

xen_filter_cpu_maps();
xen_setup_vcpu_info_placement();
}

Expand All @@ -195,8 +216,6 @@ static void __init xen_smp_prepare_cpus(unsigned int max_cpus)
if (xen_smp_intr_init(0))
BUG();

xen_fill_possible_map();

if (!alloc_cpumask_var(&xen_cpu_initialized_map, GFP_KERNEL))
panic("could not allocate xen_cpu_initialized_map\n");

Expand Down Expand Up @@ -487,5 +506,6 @@ static const struct smp_ops xen_smp_ops __initdata = {
void __init xen_smp_init(void)
{
smp_ops = xen_smp_ops;
xen_fill_possible_map();
xen_init_spinlocks();
}

0 comments on commit ea5b8f7

Please sign in to comment.