The addition of support to read the NUMA node for a PCI card specified by _PXM resulted in Martin's system not booting. Looking at the ACPI tables it seems that there are _PXM entries for the root ports, but no SRAT table. The absence of the SRAT table results in dummy_numa_init() being called. However, unlike on arm64, this doesn't result in numa_off being set. When the PCI code later comes along and calls acpi_get_node() for any PCI card below the root port, it navigates up the ACPI tree until it finds the _PXM value in the root port. This value is then passed to acpi_map_pxm_to_node(). As numa_off has not been set on x86 it tries to allocate a NUMA node, from the unused set, without setting up all the infrastructure that would normally accompany such a call. We have not identified exactly which driver is causing the subsequent hang for Martin. If numa_off had been set, as it is in the equivalent flow on arm64, then acpi_map_pxm_to_node() would return NUMA_NO_NODE, which is what we want to happen. It is invalid under the ACPI spec to specify new NUMA nodes using _PXM if they have no presence in SRAT. Thus the simplest fix is to set numa_off when NUMA support is disabled due to an invalid SRAT (here not present at all). I do not have easy access to appropriate x86 NUMA systems so would appreciate some testing of this one! Known problem boards setups: AMD Ryzen Threadripper 2950X on ASROCK X399 TAICHI MSI X399 SLI PLUS (probably - not confirmed yet) The PCI patch has been reverted, so this fix is not critical. Reported-by: Martin Hundebøll <martin@xxxxxxxxxx> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> Fixes: bad7dcd94f39 ("ACPI/PCI: Pay attention to device-specific _PXM node values") --- Changes since V1: * Update commit message as suggested by Bjorn Helgaas. * No functional changes. arch/x86/mm/numa.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c index 1308f5408bf7..ce1182f953ff 100644 --- a/arch/x86/mm/numa.c +++ b/arch/x86/mm/numa.c @@ -695,6 +695,8 @@ static int __init dummy_numa_init(void) node_set(0, numa_nodes_parsed); numa_add_memblk(0, 0, PFN_PHYS(max_pfn)); + numa_off = true; + return 0; } -- 2.19.1