[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XenPPC] [PATCH] SMP support
Enable secondary processors as schedulable entities and allow domU's to run on them. Tested extensively on JS20 and JS21 with up to ten domains at a time. Note that this patch relies on the hdec storm patch just posted. Signed-off-by: Amos Waterland <apw@xxxxxxxxxx> --- setup.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff -r c94df1e4e62c xen/arch/powerpc/setup.c --- a/xen/arch/powerpc/setup.c Thu Sep 14 15:43:38 2006 -0500 +++ b/xen/arch/powerpc/setup.c Thu Sep 14 18:37:30 2006 -0400 @@ -89,6 +89,8 @@ extern char __per_cpu_start[], __per_cpu /* move us to a header file */ extern void initialize_keytable(void); +static struct domain *idle_domain; + volatile struct processor_area * volatile global_cpu_table[NR_CPUS]; int is_kernel_text(unsigned long addr) @@ -152,8 +154,6 @@ static void percpu_free_unused_areas(voi static void __init start_of_day(void) { - struct domain *idle_domain; - init_IRQ(); scheduler_init(); @@ -167,23 +167,6 @@ static void __init start_of_day(void) /* for some reason we need to set our own bit in the thread map */ cpu_set(0, cpu_sibling_map[0]); - - percpu_free_unused_areas(); - - { - /* FIXME: Xen assumes that an online CPU is a schedualable - * CPU, but we just are not there yet. Remove this fragment when - * scheduling processors actually works. */ - int cpuid; - - printk("WARNING!: Taking all secondary CPUs offline\n"); - - for_each_online_cpu(cpuid) { - if (cpuid == 0) - continue; - cpu_clear(cpuid, cpu_online_map); - } - } initialize_keytable(); /* Register another key that will allow for the the Harware Probe @@ -257,9 +240,19 @@ static int kick_secondary_cpus(int maxcp /* This is the first C code that secondary processors invoke. */ int secondary_cpu_init(int cpuid, unsigned long r4) { + struct vcpu *vcpu; + cpu_initialize(cpuid); smp_generic_take_timebase(); cpu_set(cpuid, cpu_online_map); + + vcpu = alloc_vcpu(idle_domain, cpuid, cpuid); + BUG_ON(vcpu == NULL); + + set_current(idle_domain->vcpu[cpuid]); + idle_vcpu[cpuid] = current; + startup_cpu_idle_loop(); + while(1); } @@ -332,6 +325,8 @@ static void __init __start_xen(multiboot debugger_trap_immediate(); #endif + start_of_day(); + /* Deal with secondary processors. */ if (opt_nosmp || ofd_boot_cpu == -1) { printk("nosmp: leaving secondary processors spinning forever\n"); @@ -340,7 +335,8 @@ static void __init __start_xen(multiboot kick_secondary_cpus(max_cpus); } - start_of_day(); + /* This cannot be called before secondary cpus are marked online. */ + percpu_free_unused_areas(); /* Create initial domain 0. */ dom0 = domain_create(0); _______________________________________________ Xen-ppc-devel mailing list Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ppc-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |