• Steve Wahl's avatar
    x86/platform/uv: Use alternate source for socket to node data · 5290e88b
    Steve Wahl authored
    The UV code attempts to build a set of tables to allow it to do
    bidirectional socket<=>node lookups.
    
    But when nr_cpus is set to a smaller number than actually present, the
    cpu_to_node() mapping information for unused CPUs is not available to
    build_socket_tables(). This results in skipping some nodes or sockets
    when creating the tables and leaving some -1's for later code to trip.
    over, causing oopses.
    
    The problem is that the socket<=>node lookups are created by doing a
    loop over all CPUs, then looking up the CPU's APICID and socket. But
    if a CPU is not present, there is no way to start this lookup.
    
    Instead of looping over all CPUs, take CPUs out of the equation
    entirely. Loop over all APICIDs which are mapped to a valid NUMA node.
    Then just extract the socket-id from the APICID.
    
    This avoid tripping over disabled CPUs.
    
    Fixes: 8a50c585 ("x86/platform/uv: UV support for sub-NUMA clustering")
    Signed-off-by: default avatarSteve Wahl <steve.wahl@hpe.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/all/20230807141730.1117278-1-steve.wahl%40hpe.com
    5290e88b
x2apic_uv_x.c 48.6 KB