lkml.org 
[lkml]   [2012]   [Jun]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 24/27] parisc, smpboot: Use generic SMP booting infrastructure
    Date
    Convert parisc to use the generic framework to boot secondary CPUs.

    Notes:
    1. The secondary cpu was being set in the cpu_online_mask way too early
    when things aren't initialized fully yet. Postpone that.

    Cc: "James E.J. Bottomley" <jejb@parisc-linux.org>
    Cc: Helge Deller <deller@gmx.de>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Mike Frysinger <vapier@gentoo.org>
    Cc: David Howells <dhowells@redhat.com>
    Cc: linux-parisc@vger.kernel.org
    Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
    ---

    arch/parisc/kernel/smp.c | 30 ++++++++++++++----------------
    1 files changed, 14 insertions(+), 16 deletions(-)

    diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c
    index 6266730..a6199e2 100644
    --- a/arch/parisc/kernel/smp.c
    +++ b/arch/parisc/kernel/smp.c
    @@ -32,6 +32,7 @@
    #include <linux/bitops.h>
    #include <linux/ftrace.h>
    #include <linux/cpu.h>
    +#include <linux/smpboot.h>

    #include <linux/atomic.h>
    #include <asm/current.h>
    @@ -280,8 +281,6 @@ static void __init
    smp_cpu_init(int cpunum)
    {
    extern int init_per_cpu(int); /* arch/parisc/kernel/processor.c */
    - extern void init_IRQ(void); /* arch/parisc/kernel/irq.c */
    - extern void start_cpu_itimer(void); /* arch/parisc/kernel/time.c */

    /* Set modes and Enable floating point coprocessor */
    (void) init_per_cpu(cpunum);
    @@ -297,10 +296,12 @@ smp_cpu_init(int cpunum)
    printk(KERN_CRIT "CPU#%d already initialized!\n", cpunum);
    machine_halt();
    }
    +}

    - notify_cpu_starting(cpunum);
    -
    - set_cpu_online(cpunum, true);
    +void __cpuinit __cpu_pre_online(void *unused)
    +{
    + extern void init_IRQ(void); /* arch/parisc/kernel/irq.c */
    + extern void start_cpu_itimer(void); /* arch/parisc/kernel/time.c */

    /* Initialise the idle task for this CPU */
    atomic_inc(&init_mm.mm_count);
    @@ -310,6 +311,9 @@ smp_cpu_init(int cpunum)

    init_IRQ(); /* make sure no IRQs are enabled or pending */
    start_cpu_itimer();
    +
    + flush_cache_all_local(); /* start with known state */
    + flush_tlb_all_local(NULL);
    }


    @@ -319,20 +323,14 @@ smp_cpu_init(int cpunum)
    */
    void __init smp_callin(void)
    {
    + smpboot_start_secondary(NULL);
    +}
    +
    +void __cpuinit __cpu_pre_starting(void *unused)
    +{
    int slave_id = cpu_now_booting;

    smp_cpu_init(slave_id);
    - preempt_disable();
    -
    - flush_cache_all_local(); /* start with known state */
    - flush_tlb_all_local(NULL);
    -
    - local_irq_enable(); /* Interrupts have been off until now */
    -
    - cpu_idle(); /* Wait for timer to schedule some work */
    -
    - /* NOTREACHED */
    - panic("smp_callin() AAAAaaaaahhhh....\n");
    }

    /*


    \
     
     \ /
      Last update: 2012-06-01 12:41    [W:2.441 / U:0.156 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site