|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 08/11] xen: arm: rewrite start of day page table and cpu bring up
On 09/27/2013 11:20 AM, Ian Campbell wrote:
[..]
> -static void __init init_cpus_maps(void)
> +static void __init smp_init_cpus(void)
> {
> register_t mpidr;
> struct dt_device_node *cpus = dt_find_node_by_path("/cpus");
> @@ -530,6 +530,14 @@ static void __init init_cpus_maps(void)
> [0 ... NR_CPUS - 1] = MPIDR_INVALID
> };
> bool_t bootcpu_valid = 0;
> + int rc;
> +
> + if ( (rc = arch_smp_init()) < 0 )
> + {
> + printk(XENLOG_WARNING "SMP init failed (%d)\n"
> + "Using only 1 CPU\n", rc);
> + return;
> + }
>
> mpidr = boot_cpu_data.mpidr.bits & MPIDR_HWID_MASK;
>
> @@ -581,6 +589,12 @@ static void __init init_cpus_maps(void)
> }
> }
>
> + if ( (rc = arch_cpu_init(hwid, cpu)) < 0 )
As I understand your patch #6, arch_cpu_init take a logical cpu id (on
ARM64 it's used as an index in an array).
So you should used j here.
Also, do we really need to call arch_cpu_init on the boot CPU?
> + {
> + printk("cpu init failed (hwid %x): %d\n", hwid, rc);
> + continue;
> + }
> +
> /*
> * Build a stashed array of MPIDR values. Numbering scheme requires
> * that if detected the boot CPU must be assigned logical id 0. Other
> @@ -599,7 +613,8 @@ static void __init init_cpus_maps(void)
>
> if ( cpuidx > NR_CPUS )
> {
> - printk(XENLOG_WARNING "DT /cpu %u node greater than max cores
> %u, capping them\n",
> + printk(XENLOG_WARNING
> + "DT /cpu %u node greater than max cores %u, capping
> them\n",
> cpuidx, NR_CPUS);
> cpuidx = NR_CPUS;
> break;
> @@ -657,15 +672,14 @@ void __init start_xen(unsigned long boot_phys_offset,
>
> processor_id();
>
> - init_cpus_maps();
> - cpus = smp_get_max_cpus();
> -
> platform_init();
>
> + smp_init_cpus();
> + cpus = smp_get_max_cpus();
> +
> init_xen_time();
>
> gic_init();
> - make_cpus_ready(cpus, boot_phys_offset);
>
> set_current((struct vcpu *)0xfffff000); /* debug sanity */
> idle_vcpu[0] = current;
> diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c
> index 234748e..7b4ad8a 100644
> --- a/xen/arch/arm/smpboot.c
> +++ b/xen/arch/arm/smpboot.c
> @@ -56,12 +56,10 @@ struct init_info __initdata init_data =
> };
>
> /* Shared state for coordinating CPU bringup */
> -unsigned long smp_up_cpu = 0;
> +unsigned long smp_up_cpu = ~0UL;
MPIDR_INVALID?
[..]
> /* Boot the current CPU */
> void __cpuinit start_secondary(unsigned long boot_phys_offset,
> unsigned long fdt_paddr,
> @@ -176,6 +147,7 @@ void __cpuinit start_secondary(unsigned long
> boot_phys_offset,
> wmb();
>
> /* Now report this CPU is up */
> + smp_up_cpu = ~0UL;
smp_up_cpu = MPIDR_INVALID?
Also, perhaps a dsb is needed here to ensure to update smp_up_cpu before
cpumask_set_cpu is updated.
> cpumask_set_cpu(cpuid, &cpu_online_map);
> wmb();
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |