Message ID | 20231114091643.59530-1-shijie@os.amperecomputing.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm64: irq: set the correct node for VMAP stack | expand |
Hi Huang, kernel test robot noticed the following build errors: [auto build test ERROR on arm64/for-next/core] [also build test ERROR on driver-core/driver-core-testing driver-core/driver-core-next driver-core/driver-core-linus arnd-asm-generic/master linus/master v6.7-rc1 next-20231115] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Huang-Shijie/arm64-irq-set-the-correct-node-for-VMAP-stack/20231114-171932 base: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/core patch link: https://lore.kernel.org/r/20231114091643.59530-1-shijie%40os.amperecomputing.com patch subject: [PATCH] arm64: irq: set the correct node for VMAP stack config: arm64-randconfig-001-20231115 (https://download.01.org/0day-ci/archive/20231115/202311152250.ozO781vZ-lkp@intel.com/config) compiler: aarch64-linux-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231115/202311152250.ozO781vZ-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202311152250.ozO781vZ-lkp@intel.com/ All errors (new ones prefixed by >>): arch/arm64/kernel/irq.c: In function 'init_irq_stacks': >> arch/arm64/kernel/irq.c:60:59: error: implicit declaration of function 'early_cpu_to_node'; did you mean 'early_pfn_to_nid'? [-Werror=implicit-function-declaration] 60 | p = arch_alloc_vmap_stack(IRQ_STACK_SIZE, early_cpu_to_node(cpu)); | ^~~~~~~~~~~~~~~~~ | early_pfn_to_nid cc1: some warnings being treated as errors vim +60 arch/arm64/kernel/irq.c 52 53 #ifdef CONFIG_VMAP_STACK 54 static void init_irq_stacks(void) 55 { 56 int cpu; 57 unsigned long *p; 58 59 for_each_possible_cpu(cpu) { > 60 p = arch_alloc_vmap_stack(IRQ_STACK_SIZE, early_cpu_to_node(cpu)); 61 per_cpu(irq_stack_ptr, cpu) = p; 62 } 63 } 64 #else 65 /* irq stack only needs to be 16 byte aligned - not IRQ_STACK_SIZE aligned. */ 66 DEFINE_PER_CPU_ALIGNED(unsigned long [IRQ_STACK_SIZE/sizeof(long)], irq_stack); 67
On Tue, Nov 14, 2023 at 05:16:43PM +0800, Huang Shijie wrote: > diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c > index 6ad5c6ef5329..e62d3cb3f74c 100644 > --- a/arch/arm64/kernel/irq.c > +++ b/arch/arm64/kernel/irq.c > @@ -57,7 +57,7 @@ static void init_irq_stacks(void) > unsigned long *p; > > for_each_possible_cpu(cpu) { > - p = arch_alloc_vmap_stack(IRQ_STACK_SIZE, cpu_to_node(cpu)); > + p = arch_alloc_vmap_stack(IRQ_STACK_SIZE, early_cpu_to_node(cpu)); > per_cpu(irq_stack_ptr, cpu) = p; > } > } This looks alright to me, I don't have a better suggestion. The generic code already has the cpu_to_node_map[] array populated by early_map_cpu_to_node(), so let's reuse it. > diff --git a/drivers/base/arch_numa.c b/drivers/base/arch_numa.c > index eaa31e567d1e..90519d981471 100644 > --- a/drivers/base/arch_numa.c > +++ b/drivers/base/arch_numa.c > @@ -144,7 +144,7 @@ void __init early_map_cpu_to_node(unsigned int cpu, int nid) > unsigned long __per_cpu_offset[NR_CPUS] __read_mostly; > EXPORT_SYMBOL(__per_cpu_offset); > > -static int __init early_cpu_to_node(int cpu) > +int early_cpu_to_node(int cpu) > { > return cpu_to_node_map[cpu]; > } > diff --git a/include/asm-generic/numa.h b/include/asm-generic/numa.h > index 1a3ad6d29833..fc8a9bd6a444 100644 > --- a/include/asm-generic/numa.h > +++ b/include/asm-generic/numa.h > @@ -38,6 +38,7 @@ void __init early_map_cpu_to_node(unsigned int cpu, int nid); > void numa_store_cpu_info(unsigned int cpu); > void numa_add_cpu(unsigned int cpu); > void numa_remove_cpu(unsigned int cpu); > +int early_cpu_to_node(int cpu); Here I'd move this just below early_map_cpu_to_node() and, for completeness, also add the dummy static inline for the !NUMA case.
Hi Catalin, 在 2023/11/17 1:18, Catalin Marinas 写道: > On Tue, Nov 14, 2023 at 05:16:43PM +0800, Huang Shijie wrote: >> diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c >> index 6ad5c6ef5329..e62d3cb3f74c 100644 >> --- a/arch/arm64/kernel/irq.c >> +++ b/arch/arm64/kernel/irq.c >> @@ -57,7 +57,7 @@ static void init_irq_stacks(void) >> unsigned long *p; >> >> for_each_possible_cpu(cpu) { >> - p = arch_alloc_vmap_stack(IRQ_STACK_SIZE, cpu_to_node(cpu)); >> + p = arch_alloc_vmap_stack(IRQ_STACK_SIZE, early_cpu_to_node(cpu)); >> per_cpu(irq_stack_ptr, cpu) = p; >> } >> } > This looks alright to me, I don't have a better suggestion. The generic > code already has the cpu_to_node_map[] array populated by > early_map_cpu_to_node(), so let's reuse it. > >> diff --git a/drivers/base/arch_numa.c b/drivers/base/arch_numa.c >> index eaa31e567d1e..90519d981471 100644 >> --- a/drivers/base/arch_numa.c >> +++ b/drivers/base/arch_numa.c >> @@ -144,7 +144,7 @@ void __init early_map_cpu_to_node(unsigned int cpu, int nid) >> unsigned long __per_cpu_offset[NR_CPUS] __read_mostly; >> EXPORT_SYMBOL(__per_cpu_offset); >> >> -static int __init early_cpu_to_node(int cpu) >> +int early_cpu_to_node(int cpu) >> { >> return cpu_to_node_map[cpu]; >> } >> diff --git a/include/asm-generic/numa.h b/include/asm-generic/numa.h >> index 1a3ad6d29833..fc8a9bd6a444 100644 >> --- a/include/asm-generic/numa.h >> +++ b/include/asm-generic/numa.h >> @@ -38,6 +38,7 @@ void __init early_map_cpu_to_node(unsigned int cpu, int nid); >> void numa_store_cpu_info(unsigned int cpu); >> void numa_add_cpu(unsigned int cpu); >> void numa_remove_cpu(unsigned int cpu); >> +int early_cpu_to_node(int cpu); > Here I'd move this just below early_map_cpu_to_node() and, for > completeness, also add the dummy static inline for the !NUMA case. Thanks a lot. It seems there is no need for me to send the V2 for this. Thanks Huang Shijie
diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c index 6ad5c6ef5329..e62d3cb3f74c 100644 --- a/arch/arm64/kernel/irq.c +++ b/arch/arm64/kernel/irq.c @@ -57,7 +57,7 @@ static void init_irq_stacks(void) unsigned long *p; for_each_possible_cpu(cpu) { - p = arch_alloc_vmap_stack(IRQ_STACK_SIZE, cpu_to_node(cpu)); + p = arch_alloc_vmap_stack(IRQ_STACK_SIZE, early_cpu_to_node(cpu)); per_cpu(irq_stack_ptr, cpu) = p; } } diff --git a/drivers/base/arch_numa.c b/drivers/base/arch_numa.c index eaa31e567d1e..90519d981471 100644 --- a/drivers/base/arch_numa.c +++ b/drivers/base/arch_numa.c @@ -144,7 +144,7 @@ void __init early_map_cpu_to_node(unsigned int cpu, int nid) unsigned long __per_cpu_offset[NR_CPUS] __read_mostly; EXPORT_SYMBOL(__per_cpu_offset); -static int __init early_cpu_to_node(int cpu) +int early_cpu_to_node(int cpu) { return cpu_to_node_map[cpu]; } diff --git a/include/asm-generic/numa.h b/include/asm-generic/numa.h index 1a3ad6d29833..fc8a9bd6a444 100644 --- a/include/asm-generic/numa.h +++ b/include/asm-generic/numa.h @@ -38,6 +38,7 @@ void __init early_map_cpu_to_node(unsigned int cpu, int nid); void numa_store_cpu_info(unsigned int cpu); void numa_add_cpu(unsigned int cpu); void numa_remove_cpu(unsigned int cpu); +int early_cpu_to_node(int cpu); #else /* CONFIG_NUMA */
In current code, init_irq_stacks() will call cpu_to_node(). The cpu_to_node() depends on percpu "numa_node" which is initialized in: arch_call_rest_init() --> rest_init() -- kernel_init() --> kernel_init_freeable() --> smp_prepare_cpus() But init_irq_stacks() is called in init_IRQ() which is before arch_call_rest_init(). So in init_irq_stacks(), the cpu_to_node() does not work, it always return 0. In NUMA, it makes the node 1 cpu accesses the IRQ stack which is in the node 0. This patch fixes it by exporting the early_cpu_to_node(), and use it in the init_irq_stacks(). Signed-off-by: Huang Shijie <shijie@os.amperecomputing.com> --- arch/arm64/kernel/irq.c | 2 +- drivers/base/arch_numa.c | 2 +- include/asm-generic/numa.h | 1 + 3 files changed, 3 insertions(+), 2 deletions(-)