09 Nov, 2018

1 commit

  • Currently the NUMA distance map parsing does not validate the distance
    table for the distance-matrix rules 1-2 in [1].

    However the arch NUMA code may enforce some of these rules, but not all.
    Such is the case for the arm64 port, which does not enforce the rule that
    the distance between separates nodes cannot equal LOCAL_DISTANCE.

    The patch adds the following rules validation:
    - distance of node to self equals LOCAL_DISTANCE
    - distance of separate nodes > LOCAL_DISTANCE

    This change avoids a yet-unresolved crash reported in [2].

    A note on dealing with symmetrical distances between nodes:

    Validating symmetrical distances between nodes is difficult. If it were
    mandated in the bindings that every distance must be recorded in the
    table, then it would be easy. However, it isn't.

    In addition to this, it is also possible to record [b, a] distance only
    (and not [a, b]). So, when processing the table for [b, a], we cannot
    assert that current distance of [a, b] != [b, a] as invalid, as [a, b]
    distance may not be present in the table and current distance would be
    default at REMOTE_DISTANCE.

    As such, we maintain the policy that we overwrite distance [a, b] = [b, a]
    for b > a. This policy is different to kernel ACPI SLIT validation, which
    allows non-symmetrical distances (ACPI spec SLIT rules allow it). However,
    the distance debug message is dropped as it may be misleading (for a distance
    which is later overwritten).

    Some final notes on semantics:

    - It is implied that it is the responsibility of the arch NUMA code to
    reset the NUMA distance map for an error in distance map parsing.

    - It is the responsibility of the FW NUMA topology parsing (whether OF or
    ACPI) to enforce NUMA distance rules, and not arch NUMA code.

    [1] Documents/devicetree/bindings/numa.txt
    [2] https://www.spinics.net/lists/arm-kernel/msg683304.html

    Cc: stable@vger.kernel.org # 4.7
    Signed-off-by: John Garry
    Acked-by: Will Deacon
    Signed-off-by: Rob Herring

    John Garry
     

29 Sep, 2018

1 commit

  • Use the for_each_of_cpu_node iterator to iterate over cpu nodes. This
    has the side effect of defaulting to iterating using "cpu" node names in
    preference to the deprecated (for FDT) device_type == "cpu".

    Cc: Frank Rowand
    Cc: devicetree@vger.kernel.org
    Reviewed-by: Geert Uytterhoeven
    Signed-off-by: Rob Herring

    Rob Herring
     

08 Sep, 2018

1 commit


18 Apr, 2018

1 commit

  • The "generic" implementation of of_node_to_nid is only used by
    arm64 and only in built-in code, so remove its export. Any
    device with a struct device should be able to use dev_to_node()
    instead. Also, exporting of_node_to_nid doesn't actually work if
    we build a module on an arch that doesn't select OF_NUMA nor provide its
    own of_node_to_nid implementation.

    Cc: Frank Rowand
    Signed-off-by: Rob Herring

    Rob Herring
     

08 Jan, 2018

1 commit

  • Convert remaining DT files to use SPDX-License-Identifier tags.

    Cc: Benjamin Herrenschmidt
    Cc: Guennadi Liakhovetski
    Cc: Paul Mackerras
    Cc: Pantelis Antoniou
    Reviewed-by: Frank Rowand
    Reviewed-by: Philippe Ombredanne
    Signed-off-by: Rob Herring

    Rob Herring
     

19 Apr, 2017

1 commit

  • The call to of_find_node_by_path("/cpus") returns the cpus device_node
    with its reference count incremented. There is no matching of_node_put()
    call in of_numa_parse_cpu_nodes() which results in a leaked reference
    to the "/cpus" node.

    This patch adds an of_node_put() to release the reference.

    fixes: 298535c00a2c ("of, numa: Add NUMA of binding implementation.")
    Signed-off-by: Tyrel Datwyler
    Acked-by: David Daney
    Cc: stable@vger.kernel.org # v4.7+
    Signed-off-by: Rob Herring

    Tyrel Datwyler
     

15 Nov, 2016

1 commit

  • On arm64 NUMA kernels we can pass "numa=off" on the command line to
    disable NUMA. A side effect of this is that kmalloc_node() calls to
    non-zero nodes will crash the system with an OOPS:

    [ 0.000000] ITS@0x0000901000020000: allocated 2097152 Devices @10002000000 (flat, esz 8, psz 64K, shr 1)
    [ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00001680
    [ 0.000000] pgd = fffffc0009470000
    [ 0.000000] [00001680] *pgd=0000010ffff90003, *pud=0000010ffff90003, *pmd=0000010ffff90003, *pte=0000000000000000
    [ 0.000000] Internal error: Oops: 96000006 [#1] SMP
    .
    .
    .
    [ 0.000000] [] __alloc_pages_nodemask+0xa4/0xe68
    [ 0.000000] [] new_slab+0xd0/0x564
    [ 0.000000] [] ___slab_alloc+0x2e4/0x514
    [ 0.000000] [] __slab_alloc+0x48/0x58
    [ 0.000000] [] __kmalloc_node+0xd0/0x2dc
    [ 0.000000] [] __irq_domain_add+0x7c/0x164
    [ 0.000000] [] its_probe+0x784/0x81c
    [ 0.000000] [] its_init+0x48/0x1b0
    [ 0.000000] [] gic_init_bases+0x228/0x360
    [ 0.000000] [] gic_of_init+0x148/0x1cc
    [ 0.000000] [] of_irq_init+0x184/0x298
    [ 0.000000] [] irqchip_init+0x14/0x38
    [ 0.000000] [] init_IRQ+0xc/0x30
    [ 0.000000] [] start_kernel+0x240/0x3b8
    [ 0.000000] [] __primary_switched+0x30/0x6c
    [ 0.000000] Code: 912ec2a0 b9403809 0a0902fb 37b007db (f9400300)
    .
    .
    .

    This is caused by code like this in kernel/irq/irqdomain.c

    domain = kzalloc_node(sizeof(*domain) + (sizeof(unsigned int) * size),
    GFP_KERNEL, of_node_to_nid(of_node));

    When NUMA is disabled, the concept of a node is really undefined, so
    of_node_to_nid() should unconditionally return NUMA_NO_NODE.

    Fix by returning NUMA_NO_NODE when the nid is not in the set of
    possible nodes.

    Reported-by: Gilbert Netzer
    Signed-off-by: David Daney
    Cc: stable@vger.kernel.org # 4.7+
    Signed-off-by: Rob Herring

    David Daney
     

09 Sep, 2016

6 commits


30 May, 2016

1 commit

  • Rework numa_add_memblk() to update the parameter "u64 size" to "u64
    end", this will make it consistent with x86 and simplifies the arm64
    ACPI NUMA code to be added later.

    Signed-off-by: Hanjun Guo
    Signed-off-by: Robert Richter
    Signed-off-by: David Daney
    Acked-by: Catalin Marinas
    Signed-off-by: Rafael J. Wysocki

    Hanjun Guo
     

16 Apr, 2016

1 commit