mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	 f9f67e5adc
			
		
	
	
		f9f67e5adc
		
	
	
	
	
		
			
			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 fd49f99c18 ("ACPI: NUMA: Add a node and memblk for each
    CFMWS not in SRAT")
Suggested-by: Dan Williams <dan.j.williams@intel.com>
Link: https://lore.kernel.org/all/66271b0072317_69102944c@dwillia2-xfh.jf.intel.com.notmuch/
Fixes: 8f10046799 ("ACPI/NUMA: Apply SRAT proximity domain to entire CFMWS window")
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Alison Schofield <alison.schofield@intel.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Robert Richter <rrichter@amd.com>
Acked-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
		
	
			
		
			
				
	
	
		
			43 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #ifndef _ASM_X86_SPARSEMEM_H
 | |
| #define _ASM_X86_SPARSEMEM_H
 | |
| 
 | |
| #include <linux/types.h>
 | |
| 
 | |
| #ifdef CONFIG_SPARSEMEM
 | |
| /*
 | |
|  * generic non-linear memory support:
 | |
|  *
 | |
|  * 1) we will not split memory into more chunks than will fit into the flags
 | |
|  *    field of the struct page
 | |
|  *
 | |
|  * SECTION_SIZE_BITS		2^n: size of each section
 | |
|  * MAX_PHYSMEM_BITS		2^n: max size of physical address space
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifdef CONFIG_X86_32
 | |
| # ifdef CONFIG_X86_PAE
 | |
| #  define SECTION_SIZE_BITS	29
 | |
| #  define MAX_PHYSMEM_BITS	36
 | |
| # else
 | |
| #  define SECTION_SIZE_BITS	26
 | |
| #  define MAX_PHYSMEM_BITS	32
 | |
| # endif
 | |
| #else /* CONFIG_X86_32 */
 | |
| # define SECTION_SIZE_BITS	27 /* matt - 128 is convenient right now */
 | |
| # define MAX_PHYSMEM_BITS	(pgtable_l5_enabled() ? 52 : 46)
 | |
| #endif
 | |
| 
 | |
| #endif /* CONFIG_SPARSEMEM */
 | |
| 
 | |
| #ifndef __ASSEMBLY__
 | |
| #ifdef CONFIG_NUMA_KEEP_MEMINFO
 | |
| 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
 | |
| #endif
 | |
| #endif /* __ASSEMBLY__ */
 | |
| 
 | |
| #endif /* _ASM_X86_SPARSEMEM_H */
 |