lkml.org 
[lkml]   [2012]   [Apr]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] vsmp: Fix number of CPUs when vsmp is disabled
    Date
    From: Shai Fultheim <shai@scalemp.com>

    In case CONFIG_X86_VSMP is not set, limit the number of CPUs to the
    number of CPUs of the first board.

    Signed-off-by: Shai Fultheim <shai@scalemp.com>
    [ido@wizery.com: rebased, fixed minor coding-style issues]
    Signed-off-by: Ido Yariv <ido@wizery.com>
    ---
    arch/x86/kernel/vsmp_64.c | 48 +++++++++++++++++++++++++++++++++++++++++++++
    1 files changed, 48 insertions(+), 0 deletions(-)

    diff --git a/arch/x86/kernel/vsmp_64.c b/arch/x86/kernel/vsmp_64.c
    index a1d804b..61571fd 100644
    --- a/arch/x86/kernel/vsmp_64.c
    +++ b/arch/x86/kernel/vsmp_64.c
    @@ -15,6 +15,7 @@
    #include <linux/init.h>
    #include <linux/pci_ids.h>
    #include <linux/pci_regs.h>
    +#include <linux/smp.h>

    #include <asm/apic.h>
    #include <asm/pci-direct.h>
    @@ -22,6 +23,8 @@
    #include <asm/paravirt.h>
    #include <asm/setup.h>

    +#define TOPOLOGY_REGISTER_OFFSET 0x10
    +
    #if defined CONFIG_PCI && defined CONFIG_PARAVIRT
    /*
    * Interrupt control on vSMPowered systems:
    @@ -149,12 +152,57 @@ int is_vsmp_box(void)
    return 0;
    }
    #endif
    +
    +#ifdef CONFIG_X86_VSMP
    +
    +static void __init vsmp_cap_cpus(void)
    +{
    + /* VSMP is enabled, no need to cap cpus */
    +}
    +
    +#else
    +
    +static void __init vsmp_cap_cpus(void)
    +{
    + /*
    + * CONFIG_X86_VSMP is not configured, so limit the number CPUs to the
    + * ones present in the first board, unless explicitly overridden by
    + * setup_max_cpus
    + */
    + if (setup_max_cpus == NR_CPUS) {
    + void __iomem *address;
    + unsigned int cfg, topology, node_shift, maxcpus;
    +
    + /* Read the vSMP Foundation topology register */
    + cfg = read_pci_config(0, 0x1f, 0, PCI_BASE_ADDRESS_0);
    + address = early_ioremap(cfg + TOPOLOGY_REGISTER_OFFSET, 4);
    + if (WARN_ON(!address))
    + return;
    +
    + topology = readl(address);
    + node_shift = (topology >> 16) & 0x7;
    + if (!node_shift)
    + /* The value 0 should be decoded as 8 */
    + node_shift = 8;
    + maxcpus = (topology & ((1 << node_shift) - 1)) + 1;
    +
    + printk(KERN_INFO "vSMP CTL: Capping CPUs to %d "
    + "(CONFIG_X86_VSMP is unset)\n", maxcpus);
    + setup_max_cpus = maxcpus;
    + early_iounmap(address, 4);
    + }
    +}
    +
    +#endif
    +
    void __init vsmp_init(void)
    {
    detect_vsmp_box();
    if (!is_vsmp_box())
    return;

    + vsmp_cap_cpus();
    +
    set_vsmp_pv_ops();
    return;
    }
    --
    1.7.7.6


    \
     
     \ /
      Last update: 2012-04-06 14:43    [W:3.158 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site