lkml.org 
[lkml]   [2013]   [May]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 086/136 ] powerpc: fix numa distance for form0 device tree
    3.6.11.4 stable review patch.
    If anyone has any objections, please let me know.

    ------------------

    From: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>

    [ Upstream commit 7122beeee7bc1757682049780179d7c216dd1c83 ]

    The following commit breaks numa distance setup for old powerpc
    systems that use form0 encoding in device tree.

    commit 41eab6f88f24124df89e38067b3766b7bef06ddb
    powerpc/numa: Use form 1 affinity to setup node distance

    Device tree node /rtas/ibm,associativity-reference-points would
    index into /cpus/PowerPCxxxx/ibm,associativity based on form0 or
    form1 encoding detected by ibm,architecture-vec-5 property.

    All modern systems use form1 and current kernel code is correct.
    However, on older systems with form0 encoding, the numa distance
    will get hard coded as LOCAL_DISTANCE for all nodes. This causes
    task scheduling anomaly since scheduler will skip building numa
    level domain (topmost domain with all cpus) if all numa distances
    are same. (value of 'level' in sched_init_numa() will remain 0)

    Prior to the above commit:
    ((from) == (to) ? LOCAL_DISTANCE : REMOTE_DISTANCE)

    Restoring compatible behavior with this patch for old powerpc systems
    with device tree where numa distance are encoded as form0.

    Signed-off-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>
    Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    arch/powerpc/mm/numa.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
    index 59213cf..d53fa78 100644
    --- a/arch/powerpc/mm/numa.c
    +++ b/arch/powerpc/mm/numa.c
    @@ -201,7 +201,7 @@ int __node_distance(int a, int b)
    int distance = LOCAL_DISTANCE;

    if (!form1_affinity)
    - return distance;
    + return ((a == b) ? LOCAL_DISTANCE : REMOTE_DISTANCE);

    for (i = 0; i < distance_ref_points_depth; i++) {
    if (distance_lookup_table[a][i] == distance_lookup_table[b][i])
    --
    1.7.10.4



    \
     
     \ /
      Last update: 2013-05-18 05:21    [W:4.112 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site