Re: [PATCH] x86: Factor out common CPU initialization code

2015-03-31 Thread Boris Ostrovsky

On 03/31/2015 11:55 AM, Ingo Molnar wrote:


* Boris Ostrovsky  wrote:


Some of x86 bare-metal and Xen CPU initialization code is common between the two
and therefore can be factored out to avoid code duplication.

As a side effect, doing so will also extend the fix provided by commit
a7fcf28d431e ("x86/asm/entry: Replace this_cpu_sp0() with current_top_of_stack()
to x86_32") to 32-bit Xen PV guests.

Signed-off-by: Boris Ostrovsky 
---
  arch/x86/include/asm/smp.h |  1 +
  arch/x86/kernel/smpboot.c  | 39 +++
  arch/x86/xen/smp.c | 14 +-
  3 files changed, 25 insertions(+), 29 deletions(-)


This does not apply to the latest x86 tree (tip:master).

Thanks,

Ingo




Yes, I was somewhat out-of-date, sorry. Let me re-test this and submit v2.

-boris
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] x86: Factor out common CPU initialization code

2015-03-31 Thread Ingo Molnar

* Boris Ostrovsky  wrote:

> Some of x86 bare-metal and Xen CPU initialization code is common between the 
> two
> and therefore can be factored out to avoid code duplication.
> 
> As a side effect, doing so will also extend the fix provided by commit
> a7fcf28d431e ("x86/asm/entry: Replace this_cpu_sp0() with 
> current_top_of_stack()
> to x86_32") to 32-bit Xen PV guests.
> 
> Signed-off-by: Boris Ostrovsky 
> ---
>  arch/x86/include/asm/smp.h |  1 +
>  arch/x86/kernel/smpboot.c  | 39 +++
>  arch/x86/xen/smp.c | 14 +-
>  3 files changed, 25 insertions(+), 29 deletions(-)

This does not apply to the latest x86 tree (tip:master).

Thanks,

Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] x86: Factor out common CPU initialization code

2015-03-31 Thread Boris Ostrovsky
Some of x86 bare-metal and Xen CPU initialization code is common between the two
and therefore can be factored out to avoid code duplication.

As a side effect, doing so will also extend the fix provided by commit
a7fcf28d431e ("x86/asm/entry: Replace this_cpu_sp0() with current_top_of_stack()
to x86_32") to 32-bit Xen PV guests.

Signed-off-by: Boris Ostrovsky 
---
 arch/x86/include/asm/smp.h |  1 +
 arch/x86/kernel/smpboot.c  | 39 +++
 arch/x86/xen/smp.c | 14 +-
 3 files changed, 25 insertions(+), 29 deletions(-)

diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h
index a5cb4f6..17a8dce 100644
--- a/arch/x86/include/asm/smp.h
+++ b/arch/x86/include/asm/smp.h
@@ -153,6 +153,7 @@ void cpu_disable_common(void);
 void native_smp_prepare_boot_cpu(void);
 void native_smp_prepare_cpus(unsigned int max_cpus);
 void native_smp_cpus_done(unsigned int max_cpus);
+void common_cpu_up(unsigned int cpunum, struct task_struct *tidle);
 int native_cpu_up(unsigned int cpunum, struct task_struct *tidle);
 int native_cpu_disable(void);
 int common_cpu_die(unsigned int cpu);
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index e0e9c26..203aee1 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -776,6 +776,27 @@ out:
return boot_error;
 }
 
+void common_cpu_up(unsigned int cpu, struct task_struct *idle)
+{
+   /* Just in case we booted with a single CPU. */
+   alternatives_enable_smp();
+
+   per_cpu(current_task, cpu) = idle;
+
+#ifdef CONFIG_X86_32
+   /* Stack for startup_32 can be just as for start_secondary onwards */
+   irq_ctx_init(cpu);
+   per_cpu(cpu_current_top_of_stack, cpu) =
+   (unsigned long)task_stack_page(idle) + THREAD_SIZE;
+#else
+   clear_tsk_thread_flag(idle, TIF_FORK);
+   initial_gs = per_cpu_offset(cpu);
+#endif
+   per_cpu(kernel_stack, cpu) =
+   (unsigned long)task_stack_page(idle) -
+   KERNEL_STACK_OFFSET + THREAD_SIZE;
+}
+
 /*
  * NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad
  * (ie clustered apic addressing mode), this is a LOGICAL apic ID.
@@ -793,25 +814,9 @@ static int do_boot_cpu(int apicid, int cpu, struct 
task_struct *idle)
int cpu0_nmi_registered = 0;
unsigned long timeout;
 
-   /* Just in case we booted with a single CPU. */
-   alternatives_enable_smp();
-
idle->thread.sp = (unsigned long) (((struct pt_regs *)
  (THREAD_SIZE +  task_stack_page(idle))) - 1);
-   per_cpu(current_task, cpu) = idle;
 
-#ifdef CONFIG_X86_32
-   /* Stack for startup_32 can be just as for start_secondary onwards */
-   irq_ctx_init(cpu);
-   per_cpu(cpu_current_top_of_stack, cpu) =
-   (unsigned long)task_stack_page(idle) + THREAD_SIZE;
-#else
-   clear_tsk_thread_flag(idle, TIF_FORK);
-   initial_gs = per_cpu_offset(cpu);
-#endif
-   per_cpu(kernel_stack, cpu) =
-   (unsigned long)task_stack_page(idle) -
-   KERNEL_STACK_OFFSET + THREAD_SIZE;
early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu);
initial_code = (unsigned long)start_secondary;
stack_start  = idle->thread.sp;
@@ -955,6 +960,8 @@ int native_cpu_up(unsigned int cpu, struct task_struct 
*tidle)
/* the FPU context is blank, nobody can own it */
__cpu_disable_lazy_restore(cpu);
 
+   common_cpu_up(cpu, tidle);
+
err = do_boot_cpu(apicid, cpu, tidle);
if (err) {
pr_err("do_boot_cpu failed(%d) to wakeup CPU#%u\n", err, cpu);
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index 1c5e760..8648438 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -441,15 +441,7 @@ static int xen_cpu_up(unsigned int cpu, struct task_struct 
*idle)
 {
int rc;
 
-   per_cpu(current_task, cpu) = idle;
-#ifdef CONFIG_X86_32
-   irq_ctx_init(cpu);
-#else
-   clear_tsk_thread_flag(idle, TIF_FORK);
-#endif
-   per_cpu(kernel_stack, cpu) =
-   (unsigned long)task_stack_page(idle) -
-   KERNEL_STACK_OFFSET + THREAD_SIZE;
+   common_cpu_up(cpu, idle);
 
xen_setup_runstate_info(cpu);
xen_setup_timer(cpu);
@@ -470,10 +462,6 @@ static int xen_cpu_up(unsigned int cpu, struct task_struct 
*idle)
if (rc)
return rc;
 
-   if (num_online_cpus() == 1)
-   /* Just in case we booted with a single CPU. */
-   alternatives_enable_smp();
-
rc = xen_smp_intr_init(cpu);
if (rc)
return rc;
-- 
1.8.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/