lkml.org 
[lkml]   [2010]   [Dec]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch] x86, numa: Fix CONFIG_DEBUG_PER_CPU_MAPS without NUMA emulation
    "x86, numa: Fake node-to-cpumask for NUMA emulation" broke the build when
    CONFIG_DEBUG_PER_CPU_MAPS is set and CONFIG_NUMA_EMU is not. This is
    because it is possible to map a cpu to multiple nodes when NUMA emulation
    is used; the patch required a physical node address table to find those
    nodes that was only available when CONFIG_NUMA_EMU was enabled.

    This extracts the common debug functionality to its own function for
    CONFIG_DEBUG_PER_CPU_MAPS and uses it regardless of whether
    CONFIG_NUMA_EMU is set or not.

    NUMA emulation will now iterate over the set of possible nodes for each
    cpu and call the new debug function whereas only the cpu's node will be
    used without NUMA emulation enabled.

    Reported-by: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: David Rientjes <rientjes@google.com>
    ---
    arch/x86/mm/numa_64.c | 48 +++++++++++++++++++++++++++++++++++++-----------
    1 files changed, 37 insertions(+), 11 deletions(-)
    diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c
    --- a/arch/x86/mm/numa_64.c
    +++ b/arch/x86/mm/numa_64.c
    @@ -833,15 +833,48 @@ void __cpuinit numa_remove_cpu(int cpu)
    #endif /* !CONFIG_NUMA_EMU */

    #else /* CONFIG_DEBUG_PER_CPU_MAPS */
    +static struct cpumask __cpuinit *debug_cpumask_set_cpu(int cpu, int enable)
    +{
    + int node = early_cpu_to_node(cpu);
    + struct cpumask *mask;
    + char buf[64];
    +
    + mask = node_to_cpumask_map[node];
    + if (!mask) {
    + pr_err("node_to_cpumask_map[%i] NULL\n", node);
    + dump_stack();
    + return NULL;
    + }
    +
    + cpulist_scnprintf(buf, sizeof(buf), mask);
    + printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",
    + enable ? "numa_add_cpu" : "numa_remove_cpu",
    + cpu, node, buf);
    + return mask;
    +}

    /*
    * --------- debug versions of the numa functions ---------
    */
    +#ifndef CONFIG_NUMA_EMU
    +static void __cpuinit numa_set_cpumask(int cpu, int enable)
    +{
    + struct cpumask *mask;
    +
    + mask = debug_cpumask_set_cpu(cpu, enable);
    + if (!mask)
    + return;
    +
    + if (enable)
    + cpumask_set_cpu(cpu, mask);
    + else
    + cpumask_clear_cpu(cpu, mask);
    +}
    +#else
    static void __cpuinit numa_set_cpumask(int cpu, int enable)
    {
    int node = early_cpu_to_node(cpu);
    struct cpumask *mask;
    - char buf[64];
    int i;

    for_each_online_node(i) {
    @@ -851,24 +884,17 @@ static void __cpuinit numa_set_cpumask(int cpu, int enable)
    if (addr < physnodes[node].start ||
    addr >= physnodes[node].end)
    continue;
    - mask = node_to_cpumask_map[node];
    - if (mask == NULL) {
    - pr_err("node_to_cpumask_map[%i] NULL\n", i);
    - dump_stack();
    + mask = debug_cpumask_set_cpu(cpu, enable);
    + if (!mask)
    return;
    - }

    if (enable)
    cpumask_set_cpu(cpu, mask);
    else
    cpumask_clear_cpu(cpu, mask);
    -
    - cpulist_scnprintf(buf, sizeof(buf), mask);
    - printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",
    - enable ? "numa_add_cpu" : "numa_remove_cpu",
    - cpu, node, buf);
    }
    }
    +#endif /* CONFIG_NUMA_EMU */

    void __cpuinit numa_add_cpu(int cpu)
    {

    \
     
     \ /
      Last update: 2010-12-30 19:57    [from the cache]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean