Patch "x86/numa: Fix SRAT lookup of CFMWS ranges with numa_fill_memblks()" has been added to the 6.9-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    x86/numa: Fix SRAT lookup of CFMWS ranges with numa_fill_memblks()

to the 6.9-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     x86-numa-fix-srat-lookup-of-cfmws-ranges-with-numa_f.patch
and it can be found in the queue-6.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 42786d3fb7556de41bc827877ba2f6d8d267bb0d
Author: Robert Richter <rrichter@xxxxxxx>
Date:   Thu May 2 15:10:09 2024 +0200

    x86/numa: Fix SRAT lookup of CFMWS ranges with numa_fill_memblks()
    
    [ Upstream commit f9f67e5adc8dc2e1cc51ab2d3d6382fa97f074d4 ]
    
    For configurations that have the kconfig option NUMA_KEEP_MEMINFO
    disabled, numa_fill_memblks() only returns with NUMA_NO_MEMBLK (-1).
    SRAT lookup fails then because an existing SRAT memory range cannot be
    found for a CFMWS address range. This causes the addition of a
    duplicate numa_memblk with a different node id and a subsequent page
    fault and kernel crash during boot.
    
    Fix this by making numa_fill_memblks() always available regardless of
    NUMA_KEEP_MEMINFO.
    
    As Dan suggested, the fix is implemented to remove numa_fill_memblks()
    from sparsemem.h and alos using __weak for the function.
    
    Note that the issue was initially introduced with [1]. But since
    phys_to_target_node() was originally used that returned the valid node
    0, an additional numa_memblk was not added. Though, the node id was
    wrong too, a message is seen then in the logs:
    
     kernel/numa.c:  pr_info_once("Unknown target node for memory at 0x%llx, assuming node 0\n",
    
    [1] commit fd49f99c1809 ("ACPI: NUMA: Add a node and memblk for each
        CFMWS not in SRAT")
    
    Suggested-by: Dan Williams <dan.j.williams@xxxxxxxxx>
    Link: https://lore.kernel.org/all/66271b0072317_69102944c@xxxxxxxxxxxxxxxxxxxxxxxxx.notmuch/
    Fixes: 8f1004679987 ("ACPI/NUMA: Apply SRAT proximity domain to entire CFMWS window")
    Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
    Reviewed-by: Alison Schofield <alison.schofield@xxxxxxxxx>
    Reviewed-by: Dan Williams <dan.j.williams@xxxxxxxxx>
    Signed-off-by: Robert Richter <rrichter@xxxxxxx>
    Acked-by: Borislav Petkov (AMD) <bp@xxxxxxxxx>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/include/asm/sparsemem.h b/arch/x86/include/asm/sparsemem.h
index 1be13b2dfe8bf..64df897c0ee30 100644
--- a/arch/x86/include/asm/sparsemem.h
+++ b/arch/x86/include/asm/sparsemem.h
@@ -37,8 +37,6 @@ extern int phys_to_target_node(phys_addr_t start);
 #define phys_to_target_node phys_to_target_node
 extern int memory_add_physaddr_to_nid(u64 start);
 #define memory_add_physaddr_to_nid memory_add_physaddr_to_nid
-extern int numa_fill_memblks(u64 start, u64 end);
-#define numa_fill_memblks numa_fill_memblks
 #endif
 #endif /* __ASSEMBLY__ */
 
diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c
index 65e9a6e391c04..ce84ba86e69e9 100644
--- a/arch/x86/mm/numa.c
+++ b/arch/x86/mm/numa.c
@@ -929,6 +929,8 @@ int memory_add_physaddr_to_nid(u64 start)
 }
 EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid);
 
+#endif
+
 static int __init cmp_memblk(const void *a, const void *b)
 {
 	const struct numa_memblk *ma = *(const struct numa_memblk **)a;
@@ -1001,5 +1003,3 @@ int __init numa_fill_memblks(u64 start, u64 end)
 	}
 	return 0;
 }
-
-#endif
diff --git a/drivers/acpi/numa/srat.c b/drivers/acpi/numa/srat.c
index e45e64993c504..3b09fd39eeb4f 100644
--- a/drivers/acpi/numa/srat.c
+++ b/drivers/acpi/numa/srat.c
@@ -208,6 +208,11 @@ int __init srat_disabled(void)
 	return acpi_numa < 0;
 }
 
+__weak int __init numa_fill_memblks(u64 start, u64 end)
+{
+	return NUMA_NO_MEMBLK;
+}
+
 #if defined(CONFIG_X86) || defined(CONFIG_ARM64) || defined(CONFIG_LOONGARCH)
 /*
  * Callback for SLIT parsing.  pxm_to_node() returns NUMA_NO_NODE for
diff --git a/include/linux/numa.h b/include/linux/numa.h
index 915033a757315..1d43371fafd2f 100644
--- a/include/linux/numa.h
+++ b/include/linux/numa.h
@@ -36,12 +36,7 @@ int memory_add_physaddr_to_nid(u64 start);
 int phys_to_target_node(u64 start);
 #endif
 
-#ifndef numa_fill_memblks
-static inline int __init numa_fill_memblks(u64 start, u64 end)
-{
-	return NUMA_NO_MEMBLK;
-}
-#endif
+int numa_fill_memblks(u64 start, u64 end);
 
 #else /* !CONFIG_NUMA */
 static inline int numa_nearest_node(int node, unsigned int state)




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux