Re: [PATCH] x86/platform/uv: Use alternate source for socket to node data
From: Steve Wahl
Date: Mon Aug 28 2023 - 17:24:32 EST
On Mon, Aug 07, 2023 at 09:17:30AM -0500, Steve Wahl wrote:
> 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 an incomplete table and will
> later cause use of a -1 value for some array indexing, and eventual
> kernel page faults.
>
> Switch to using the __apicid_to_node array, which still contains all
> the information mapping apicids to nodes, even for CPUs disabled with
> a reduced nr_cpus setting.
>
> Fixes: 8a50c5851927 ("x86/platform/uv: UV support for sub-NUMA clustering")
> Signed-off-by: Steve Wahl <steve.wahl@xxxxxxx>
> ---
> arch/x86/kernel/apic/x2apic_uv_x.c | 11 +++++------
> 1 file changed, 5 insertions(+), 6 deletions(-)
>
> This is essentially version 2 of "[PATCH] x86/platform/uv: Abort UV
> initialization when reduced nr_cpus requires it". However, the title
> was no longer accurate, aborting UV initialization is no longer needed.
>
> Previous discussion can be found here:
> https://lore.kernel.org/lkml/20230711202618.85562-1-steve.wahl@xxxxxxx/
>
> diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c
> index d9384d5b4b8e..35acc95c6dd5 100644
> --- a/arch/x86/kernel/apic/x2apic_uv_x.c
> +++ b/arch/x86/kernel/apic/x2apic_uv_x.c
> @@ -1571,7 +1571,7 @@ static void __init build_socket_tables(void)
> {
> struct uv_gam_range_entry *gre = uv_gre_table;
> int nums, numn, nump;
> - int cpu, i, lnid;
> + int i, lnid, apicid;
> int minsock = _min_socket;
> int maxsock = _max_socket;
> int minpnode = _min_pnode;
> @@ -1622,15 +1622,14 @@ static void __init build_socket_tables(void)
>
> /* Set socket -> node values: */
> lnid = NUMA_NO_NODE;
> - for_each_possible_cpu(cpu) {
> - int nid = cpu_to_node(cpu);
> - int apicid, sockid;
> + for (apicid = 0; apicid < ARRAY_SIZE(__apicid_to_node); apicid++) {
> + int nid = __apicid_to_node[apicid];
> + int sockid;
>
> - if (lnid == nid)
> + if ((nid == NUMA_NO_NODE) || (lnid == nid))
> continue;
> lnid = nid;
>
> - apicid = per_cpu(x86_cpu_to_apicid, cpu);
> sockid = apicid >> uv_cpuid.socketid_shift;
>
> if (_socket_to_node[sockid - minsock] == SOCK_EMPTY)
> --
> 2.26.2
>
Gentle ping on this patch? Thanks.
--> Steve Wahl
--
Steve Wahl, Hewlett Packard Enterprise