lkml.org 
[lkml]   [2009]   [Mar]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 01/13] [VOYAGER] x86: add {safe,hard}_smp_processor_id to smp_ops
    Date
    Not having apics, Voyager can't use the default apic implementation of
    these, it has to read from a special port in the VIC to get the
    processor ID, so abstract these functions in smp_ops to allow voyager
    to live simultaneously with the apic code.

    Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
    Cc: Jeremy Fitzhardinge <jeremy@goop.org>
    ---
    arch/x86/include/asm/smp.h | 13 +++++++++++--
    arch/x86/kernel/apic/apic.c | 5 -----
    arch/x86/kernel/apic/ipi.c | 2 +-
    arch/x86/kernel/smp.c | 7 +++++++
    arch/x86/xen/smp.c | 7 +++++++
    5 files changed, 26 insertions(+), 8 deletions(-)

    diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h
    index 47d0e21..d11687e 100644
    --- a/arch/x86/include/asm/smp.h
    +++ b/arch/x86/include/asm/smp.h
    @@ -60,6 +60,8 @@ struct smp_ops {

    void (*send_call_func_ipi)(const struct cpumask *mask);
    void (*send_call_func_single_ipi)(int cpu);
    + int (*hard_smp_processor_id)(void);
    + int (*safe_smp_processor_id)(void);
    };

    /* Globals due to paravirt */
    @@ -158,7 +160,11 @@ extern unsigned disabled_cpus __cpuinitdata;
    * so this is correct in the x86 case.
    */
    #define raw_smp_processor_id() (percpu_read(cpu_number))
    -extern int safe_smp_processor_id(void);
    +int apic_safe_smp_processor_id(void);
    +static inline int safe_smp_processor_id(void)
    +{
    + return smp_ops.safe_smp_processor_id();
    +}

    #elif defined(CONFIG_X86_64_SMP)
    #define raw_smp_processor_id() (percpu_read(cpu_number))
    @@ -184,7 +190,10 @@ static inline int logical_smp_processor_id(void)

    #endif

    -extern int hard_smp_processor_id(void);
    +static inline int hard_smp_processor_id(void)
    +{
    + return smp_ops.hard_smp_processor_id();
    +}

    #else /* CONFIG_X86_LOCAL_APIC */

    diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
    index f9cecdf..ee68005 100644
    --- a/arch/x86/kernel/apic/apic.c
    +++ b/arch/x86/kernel/apic/apic.c
    @@ -1856,11 +1856,6 @@ void __cpuinit generic_processor_info(int apicid, int version)
    set_cpu_present(cpu, true);
    }

    -int hard_smp_processor_id(void)
    -{
    - return read_apic_id();
    -}
    -
    void default_init_apic_ldr(void)
    {
    unsigned long val;
    diff --git a/arch/x86/kernel/apic/ipi.c b/arch/x86/kernel/apic/ipi.c
    index dbf5445..90bb775 100644
    --- a/arch/x86/kernel/apic/ipi.c
    +++ b/arch/x86/kernel/apic/ipi.c
    @@ -146,7 +146,7 @@ static int convert_apicid_to_cpu(int apic_id)
    return -1;
    }

    -int safe_smp_processor_id(void)
    +int apic_safe_smp_processor_id(void)
    {
    int apicid, cpuid;

    diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
    index 13f33ea..29d0af7 100644
    --- a/arch/x86/kernel/smp.c
    +++ b/arch/x86/kernel/smp.c
    @@ -192,6 +192,11 @@ void smp_call_function_single_interrupt(struct pt_regs *regs)
    irq_exit();
    }

    +static int native_hard_smp_processor_id(void)
    +{
    + return read_apic_id();
    +}
    +
    struct smp_ops smp_ops = {
    .smp_prepare_boot_cpu = native_smp_prepare_boot_cpu,
    .smp_prepare_cpus = native_smp_prepare_cpus,
    @@ -207,5 +212,7 @@ struct smp_ops smp_ops = {

    .send_call_func_ipi = native_send_call_func_ipi,
    .send_call_func_single_ipi = native_send_call_func_single_ipi,
    + .hard_smp_processor_id = native_hard_smp_processor_id,
    + .safe_smp_processor_id = apic_safe_smp_processor_id,
    };
    EXPORT_SYMBOL_GPL(smp_ops);
    diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
    index 035582a..0dfb8c0 100644
    --- a/arch/x86/xen/smp.c
    +++ b/arch/x86/xen/smp.c
    @@ -450,6 +450,11 @@ static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id)
    return IRQ_HANDLED;
    }

    +static int xen_hard_smp_processor_id(void)
    +{
    + return read_apic_id();
    +}
    +
    static const struct smp_ops xen_smp_ops __initdata = {
    .smp_prepare_boot_cpu = xen_smp_prepare_boot_cpu,
    .smp_prepare_cpus = xen_smp_prepare_cpus,
    @@ -465,6 +470,8 @@ static const struct smp_ops xen_smp_ops __initdata = {

    .send_call_func_ipi = xen_smp_send_call_function_ipi,
    .send_call_func_single_ipi = xen_smp_send_call_function_single_ipi,
    + .hard_smp_processor_id = xen_hard_smp_processor_id,
    + .safe_smp_processor_id = apic_safe_smp_processor_id,
    };

    void __init xen_smp_init(void)
    --
    1.6.1.3


    \
     
     \ /
      Last update: 2009-03-08 17:51    [W:0.024 / U:0.444 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site