Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

numa: Move numa implementation to common code

ARM64 numa implementation is generic enough that RISC-V can reuse that
implementation with very minor cosmetic changes. This will help both
ARM64 and RISC-V in terms of maintanace and feature improvement

Move the numa implementation code to common directory so that both ISAs
can reuse this. This doesn't introduce any function changes for ARM64.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Tested-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>

authored by

Atish Patra and committed by
Palmer Dabbelt
ae3c107c eb75541f

+61 -48
+1
arch/arm64/Kconfig
··· 995 995 # Common NUMA Features 996 996 config NUMA 997 997 bool "NUMA Memory Allocation and Scheduler Support" 998 + select GENERIC_ARCH_NUMA 998 999 select ACPI_NUMA if ACPI 999 1000 select OF_NUMA 1000 1001 help
+1 -47
arch/arm64/include/asm/numa.h
··· 3 3 #define __ASM_NUMA_H 4 4 5 5 #include <asm/topology.h> 6 - 7 - #ifdef CONFIG_NUMA 8 - 9 - #define NR_NODE_MEMBLKS (MAX_NUMNODES * 2) 10 - 11 - int __node_distance(int from, int to); 12 - #define node_distance(a, b) __node_distance(a, b) 13 - 14 - extern nodemask_t numa_nodes_parsed __initdata; 15 - 16 - extern bool numa_off; 17 - 18 - /* Mappings between node number and cpus on that node. */ 19 - extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES]; 20 - void numa_clear_node(unsigned int cpu); 21 - 22 - #ifdef CONFIG_DEBUG_PER_CPU_MAPS 23 - const struct cpumask *cpumask_of_node(int node); 24 - #else 25 - /* Returns a pointer to the cpumask of CPUs on Node 'node'. */ 26 - static inline const struct cpumask *cpumask_of_node(int node) 27 - { 28 - if (node == NUMA_NO_NODE) 29 - return cpu_all_mask; 30 - 31 - return node_to_cpumask_map[node]; 32 - } 33 - #endif 34 - 35 - void __init arch_numa_init(void); 36 - int __init numa_add_memblk(int nodeid, u64 start, u64 end); 37 - void __init numa_set_distance(int from, int to, int distance); 38 - void __init numa_free_distance(void); 39 - void __init early_map_cpu_to_node(unsigned int cpu, int nid); 40 - void numa_store_cpu_info(unsigned int cpu); 41 - void numa_add_cpu(unsigned int cpu); 42 - void numa_remove_cpu(unsigned int cpu); 43 - 44 - #else /* CONFIG_NUMA */ 45 - 46 - static inline void numa_store_cpu_info(unsigned int cpu) { } 47 - static inline void numa_add_cpu(unsigned int cpu) { } 48 - static inline void numa_remove_cpu(unsigned int cpu) { } 49 - static inline void arch_numa_init(void) { } 50 - static inline void early_map_cpu_to_node(unsigned int cpu, int nid) { } 51 - 52 - #endif /* CONFIG_NUMA */ 6 + #include <asm-generic/numa.h> 53 7 54 8 #endif /* __ASM_NUMA_H */
-1
arch/arm64/mm/Makefile
··· 6 6 obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o 7 7 obj-$(CONFIG_PTDUMP_CORE) += ptdump.o 8 8 obj-$(CONFIG_PTDUMP_DEBUGFS) += ptdump_debugfs.o 9 - obj-$(CONFIG_NUMA) += numa.o 10 9 obj-$(CONFIG_DEBUG_VIRTUAL) += physaddr.o 11 10 obj-$(CONFIG_ARM64_MTE) += mteswap.o 12 11 KASAN_SANITIZE_physaddr.o += n
arch/arm64/mm/numa.c drivers/base/arch_numa.c
+6
drivers/base/Kconfig
··· 213 213 appropriate scaling, sysfs interface for reading capacity values at 214 214 runtime. 215 215 216 + config GENERIC_ARCH_NUMA 217 + bool 218 + help 219 + Enable support for generic NUMA implementation. Currently, RISC-V 220 + and ARM64 use it. 221 + 216 222 endmenu
+1
drivers/base/Makefile
··· 24 24 obj-$(CONFIG_DEV_COREDUMP) += devcoredump.o 25 25 obj-$(CONFIG_GENERIC_MSI_IRQ_DOMAIN) += platform-msi.o 26 26 obj-$(CONFIG_GENERIC_ARCH_TOPOLOGY) += arch_topology.o 27 + obj-$(CONFIG_GENERIC_ARCH_NUMA) += arch_numa.o 27 28 28 29 obj-y += test/ 29 30
+52
include/asm-generic/numa.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + #ifndef __ASM_GENERIC_NUMA_H 3 + #define __ASM_GENERIC_NUMA_H 4 + 5 + #ifdef CONFIG_NUMA 6 + 7 + #define NR_NODE_MEMBLKS (MAX_NUMNODES * 2) 8 + 9 + int __node_distance(int from, int to); 10 + #define node_distance(a, b) __node_distance(a, b) 11 + 12 + extern nodemask_t numa_nodes_parsed __initdata; 13 + 14 + extern bool numa_off; 15 + 16 + /* Mappings between node number and cpus on that node. */ 17 + extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES]; 18 + void numa_clear_node(unsigned int cpu); 19 + 20 + #ifdef CONFIG_DEBUG_PER_CPU_MAPS 21 + const struct cpumask *cpumask_of_node(int node); 22 + #else 23 + /* Returns a pointer to the cpumask of CPUs on Node 'node'. */ 24 + static inline const struct cpumask *cpumask_of_node(int node) 25 + { 26 + if (node == NUMA_NO_NODE) 27 + return cpu_all_mask; 28 + 29 + return node_to_cpumask_map[node]; 30 + } 31 + #endif 32 + 33 + void __init arch_numa_init(void); 34 + int __init numa_add_memblk(int nodeid, u64 start, u64 end); 35 + void __init numa_set_distance(int from, int to, int distance); 36 + void __init numa_free_distance(void); 37 + void __init early_map_cpu_to_node(unsigned int cpu, int nid); 38 + void numa_store_cpu_info(unsigned int cpu); 39 + void numa_add_cpu(unsigned int cpu); 40 + void numa_remove_cpu(unsigned int cpu); 41 + 42 + #else /* CONFIG_NUMA */ 43 + 44 + static inline void numa_store_cpu_info(unsigned int cpu) { } 45 + static inline void numa_add_cpu(unsigned int cpu) { } 46 + static inline void numa_remove_cpu(unsigned int cpu) { } 47 + static inline void arch_numa_init(void) { } 48 + static inline void early_map_cpu_to_node(unsigned int cpu, int nid) { } 49 + 50 + #endif /* CONFIG_NUMA */ 51 + 52 + #endif /* __ASM_GENERIC_NUMA_H */