lkml.org 
[lkml]   [2013]   [Dec]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/2] powerpc: Add debug checks to catch invalid cpu-to-node mappings
    Date
    There have been some weird bugs in the past where the kernel tried to associate
    threads of the same core to different NUMA nodes, and things went haywire after
    that point (as expected).

    But unfortunately, root-causing such issues have been quite challenging, due to
    the lack of appropriate debug checks in the kernel. These bugs usually lead to
    some odd soft-lockups in the scheduler's build-sched-domain code in the CPU
    hotplug path, which makes it very hard to trace it back to the incorrect
    cpu-to-node mappings.

    So add appropriate debug checks to catch such invalid cpu-to-node mappings
    as early as possible.

    Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
    ---

    arch/powerpc/mm/numa.c | 26 ++++++++++++++++++++++++--
    1 file changed, 24 insertions(+), 2 deletions(-)

    diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
    index 6847d50..4f50c6a 100644
    --- a/arch/powerpc/mm/numa.c
    +++ b/arch/powerpc/mm/numa.c
    @@ -570,16 +570,38 @@ out:
    return nid;
    }

    +static void verify_cpu_node_mapping(int cpu, int node)
    +{
    + int base, sibling, i;
    +
    + /* Verify that all the threads in the core belong to the same node */
    + base = cpu_first_thread_sibling(cpu);
    +
    + for (i = 0; i < threads_per_core; i++) {
    + sibling = base + i;
    +
    + if (sibling == cpu || cpu_is_offline(sibling))
    + continue;
    +
    + if (cpu_to_node(sibling) != node) {
    + WARN(1, "CPU thread siblings %d and %d don't belong"
    + " to the same node!\n", cpu, sibling);
    + break;
    + }
    + }
    +}
    +
    static int cpu_numa_callback(struct notifier_block *nfb, unsigned long action,
    void *hcpu)
    {
    unsigned long lcpu = (unsigned long)hcpu;
    - int ret = NOTIFY_DONE;
    + int ret = NOTIFY_DONE, nid;

    switch (action) {
    case CPU_UP_PREPARE:
    case CPU_UP_PREPARE_FROZEN:
    - numa_setup_cpu(lcpu);
    + nid = numa_setup_cpu(lcpu);
    + verify_cpu_node_mapping((int)lcpu, nid);
    ret = NOTIFY_OK;
    break;
    #ifdef CONFIG_HOTPLUG_CPU


    \
     
     \ /
      Last update: 2013-12-30 13:21    [W:4.287 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site