| From b22a8f7b4bde4e4ab73b64908ffd5d90ecdcdbfd Mon Sep 17 00:00:00 2001 |
| From: Valentin Schneider <valentin.schneider@arm.com> |
| Date: Thu, 29 Apr 2021 22:53:27 -0700 |
| Subject: ia64: ensure proper NUMA distance and possible map initialization |
| |
| From: Valentin Schneider <valentin.schneider@arm.com> |
| |
| commit b22a8f7b4bde4e4ab73b64908ffd5d90ecdcdbfd upstream. |
| |
| John Paul reported a warning about bogus NUMA distance values spurred by |
| commit: |
| |
| 620a6dc40754 ("sched/topology: Make sched_init_numa() use a set for the deduplicating sort") |
| |
| In this case, the afflicted machine comes up with a reported 256 possible |
| nodes, all of which are 0 distance away from one another. This was |
| previously silently ignored, but is now caught by the aforementioned |
| commit. |
| |
| The culprit is ia64's node_possible_map which remains unchanged from its |
| initialization value of NODE_MASK_ALL. In John's case, the machine |
| doesn't have any SRAT nor SLIT table, but AIUI the possible map remains |
| untouched regardless of what ACPI tables end up being parsed. Thus, |
| !online && possible nodes remain with a bogus distance of 0 (distances \in |
| [0, 9] are "reserved and have no meaning" as per the ACPI spec). |
| |
| Follow x86 / drivers/base/arch_numa's example and set the possible map to |
| the parsed map, which in this case seems to be the online map. |
| |
| Link: http://lore.kernel.org/r/255d6b5d-194e-eb0e-ecdd-97477a534441@physik.fu-berlin.de |
| Link: https://lkml.kernel.org/r/20210318130617.896309-1-valentin.schneider@arm.com |
| Fixes: 620a6dc40754 ("sched/topology: Make sched_init_numa() use a set for the deduplicating sort") |
| Signed-off-by: Valentin Schneider <valentin.schneider@arm.com> |
| Reported-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> |
| Tested-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> |
| Tested-by: Sergei Trofimovich <slyfox@gentoo.org> |
| Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org> |
| Cc: Ingo Molnar <mingo@kernel.org> |
| Cc: Vincent Guittot <vincent.guittot@linaro.org> |
| Cc: Dietmar Eggemann <dietmar.eggemann@arm.com> |
| Cc: Anatoly Pugachev <matorola@gmail.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| [ dannf: Use node_distance instead of slit_distance since this is before |
| the rename that occurred in commit ef78e5ec9214 ("ia64: export |
| node_distance function"), plus a minor context adjustment ] |
| Signed-off-by: dann frazier <dann.frazier@canonical.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/ia64/kernel/acpi.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/arch/ia64/kernel/acpi.c |
| +++ b/arch/ia64/kernel/acpi.c |
| @@ -537,7 +537,8 @@ void __init acpi_numa_fixup(void) |
| if (srat_num_cpus == 0) { |
| node_set_online(0); |
| node_cpuid[0].phys_id = hard_smp_processor_id(); |
| - return; |
| + node_distance(0, 0) = LOCAL_DISTANCE; |
| + goto out; |
| } |
| |
| /* |
| @@ -580,7 +581,7 @@ void __init acpi_numa_fixup(void) |
| for (j = 0; j < MAX_NUMNODES; j++) |
| node_distance(i, j) = i == j ? LOCAL_DISTANCE : |
| REMOTE_DISTANCE; |
| - return; |
| + goto out; |
| } |
| |
| memset(numa_slit, -1, sizeof(numa_slit)); |
| @@ -605,6 +606,8 @@ void __init acpi_numa_fixup(void) |
| printk("\n"); |
| } |
| #endif |
| +out: |
| + node_possible_map = node_online_map; |
| } |
| #endif /* CONFIG_ACPI_NUMA */ |
| |