[patch 3/4] Rework secondary SMT thread setup at boot
Anton Blanchard
anton at samba.org
Sun Aug 1 13:26:16 EST 2004
Hi Nathan,
> Our (ab)use of cpu_possible_map in setup_system to start secondary SMT
> threads bothers me. Mark such threads in cpu_possible_map during
> early boot; let RTAS tell us which present cpus are still offline
> later so we can start them.
I worry that some machines may not have a query-cpu-stopped-state rtas
call... just checked and the s7a doesnt. If we fix query_cpu_stopped to
not BUG and instead return error when it doesnt exist that should work.
> I'm not totally sure about this one, it might be better to set up
> cpu_sibling_map in prom_hold_cpus and use that in setup_system.
>
> Signed-off-by: Nathan Lynch <nathanl at austin.ibm.com>
>
>
> ---
>
>
> diff -puN arch/ppc64/kernel/setup.c~ppc64-fix-secondary-smt-thread-setup arch/ppc64/kernel/setup.c
> --- 2.6.8-rc2-mm1/arch/ppc64/kernel/setup.c~ppc64-fix-secondary-smt-thread-setup 2004-07-30 16:32:16.000000000 -0500
> +++ 2.6.8-rc2-mm1-nathanl/arch/ppc64/kernel/setup.c 2004-07-30 16:32:16.000000000 -0500
> @@ -232,16 +232,17 @@ void setup_system(unsigned long r3, unsi
> chrp_init(r3, r4, r5, r6, r7);
>
> #ifdef CONFIG_SMP
> - /* Start secondary threads on SMT systems */
> - for (i = 0; i < NR_CPUS; i++) {
> - if (cpu_available(i) && !cpu_possible(i)) {
> + /* Start secondary threads on SMT systems; primary threads
> + * are already in the running state.
> + */
> + for_each_present_cpu(i) {
> + if (query_cpu_stopped
> + (get_hard_smp_processor_id(i)) == 0) {
> printk("%16.16x : starting thread\n", i);
> rtas_call(rtas_token("start-cpu"), 3, 1, &ret,
> get_hard_smp_processor_id(i),
> (u32)*((unsigned long *)pseries_secondary_smp_init),
> i);
> - cpu_set(i, cpu_possible_map);
> - systemcfg->processorCount++;
> }
> }
> #endif /* CONFIG_SMP */
> diff -puN arch/ppc64/kernel/prom.c~ppc64-fix-secondary-smt-thread-setup arch/ppc64/kernel/prom.c
> --- 2.6.8-rc2-mm1/arch/ppc64/kernel/prom.c~ppc64-fix-secondary-smt-thread-setup 2004-07-30 16:32:16.000000000 -0500
> +++ 2.6.8-rc2-mm1-nathanl/arch/ppc64/kernel/prom.c 2004-07-30 16:32:16.000000000 -0500
> @@ -1076,6 +1076,8 @@ next:
> cpu_set(cpuid, RELOC(cpu_available_map));
> cpu_set(cpuid, RELOC(cpu_present_at_boot));
> cpu_set(cpuid, RELOC(cpu_present_map));
> + cpu_set(cpuid, RELOC(cpu_possible_map));
> + _systemcfg->processorCount++;
> prom_printf("available\n");
> } else {
> prom_printf("not available\n");
> diff -puN arch/ppc64/kernel/smp.c~ppc64-fix-secondary-smt-thread-setup arch/ppc64/kernel/smp.c
> --- 2.6.8-rc2-mm1/arch/ppc64/kernel/smp.c~ppc64-fix-secondary-smt-thread-setup 2004-07-30 16:32:16.000000000 -0500
> +++ 2.6.8-rc2-mm1-nathanl/arch/ppc64/kernel/smp.c 2004-07-30 16:32:16.000000000 -0500
> @@ -228,7 +228,6 @@ static void __devinit smp_openpic_setup_
> do_openpic_setup_cpu();
> }
>
> -#ifdef CONFIG_HOTPLUG_CPU
> /* Get state of physical CPU.
> * Return codes:
> * 0 - The processor is in the RTAS stopped state
> @@ -237,7 +236,7 @@ static void __devinit smp_openpic_setup_
> * -1 - Hardware Error
> * -2 - Hardware Busy, Try again later.
> */
> -static int query_cpu_stopped(unsigned int pcpu)
> +int query_cpu_stopped(unsigned int pcpu)
> {
> int cpu_status;
> int status, qcss_tok;
> @@ -254,6 +253,8 @@ static int query_cpu_stopped(unsigned in
> return cpu_status;
> }
>
> +#ifdef CONFIG_HOTPLUG_CPU
> +
> int __cpu_disable(void)
> {
> /* FIXME: go put this in a header somewhere */
> diff -puN include/asm-ppc64/smp.h~ppc64-fix-secondary-smt-thread-setup include/asm-ppc64/smp.h
> --- 2.6.8-rc2-mm1/include/asm-ppc64/smp.h~ppc64-fix-secondary-smt-thread-setup 2004-07-30 16:32:16.000000000 -0500
> +++ 2.6.8-rc2-mm1-nathanl/include/asm-ppc64/smp.h 2004-07-30 16:32:16.000000000 -0500
> @@ -73,6 +73,7 @@ void smp_init_pSeries(void);
> extern int __cpu_disable(void);
> extern void __cpu_die(unsigned int cpu);
> extern void cpu_die(void) __attribute__((noreturn));
> +extern int query_cpu_stopped(unsigned int pcpu);
> #ifdef CONFIG_SCHED_SMT
> extern cpumask_t cpu_sibling_map[NR_CPUS];
> #endif
>
> _
** Sent via the linuxppc64-dev mail list. See http://lists.linuxppc.org/
More information about the Linuxppc64-dev
mailing list