Message ID | 20231227024126.12424-1-kernelfans@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | enable nr_cpus for powerpc without re-ordering cpu number | expand |
Hi Pingfan, kernel test robot noticed the following build errors: [auto build test ERROR on powerpc/next] [also build test ERROR on powerpc/fixes linus/master v6.7-rc7 next-20231222] [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/Pingfan-Liu/powerpc-kernel-Remove-check-on-paca_ptrs_size/20231227-104412 base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next patch link: https://lore.kernel.org/r/20231227024126.12424-1-kernelfans%40gmail.com patch subject: [PATCHv10 2/3] powerpc/kernel: Extend arrays' size to make room for a hole in cpu_possible_mask config: powerpc-iss476-smp_defconfig (https://download.01.org/0day-ci/archive/20231228/202312280350.GpyKSrB6-lkp@intel.com/config) compiler: powerpc-linux-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231228/202312280350.GpyKSrB6-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/202312280350.GpyKSrB6-lkp@intel.com/ All errors (new ones prefixed by >>): powerpc-linux-ld: arch/powerpc/kernel/setup-common.o: in function `smp_setup_cpu_maps': >> arch/powerpc/kernel/setup-common.c:440:(.init.text+0x6a): undefined reference to `paca_last_cpu_num' >> powerpc-linux-ld: arch/powerpc/kernel/setup-common.c:440:(.init.text+0x72): undefined reference to `paca_last_cpu_num' Kconfig warnings: (for reference only) WARNING: unmet direct dependencies detected for HOTPLUG_CPU Depends on [n]: SMP [=y] && (PPC_PSERIES [=n] || PPC_PMAC [=n] || PPC_POWERNV [=n] || FSL_SOC_BOOKE [=n]) Selected by [y]: - PM_SLEEP_SMP [=y] && SMP [=y] && (ARCH_SUSPEND_POSSIBLE [=y] || ARCH_HIBERNATION_POSSIBLE [=y]) && PM_SLEEP [=y] vim +440 arch/powerpc/kernel/setup-common.c 413 414 /** 415 * setup_cpu_maps - initialize the following cpu maps: 416 * cpu_possible_mask 417 * cpu_present_mask 418 * 419 * Having the possible map set up early allows us to restrict allocations 420 * of things like irqstacks to nr_cpu_ids rather than NR_CPUS. 421 * 422 * We do not initialize the online map here; cpus set their own bits in 423 * cpu_online_mask as they come up. 424 * 425 * This function is valid only for Open Firmware systems. finish_device_tree 426 * must be called before using this. 427 * 428 * While we're here, we may as well set the "physical" cpu ids in the paca. 429 * 430 * NOTE: This must match the parsing done in early_init_dt_scan_cpus. 431 */ 432 void __init smp_setup_cpu_maps(void) 433 { 434 struct device_node *dn; 435 int cpu = 0; 436 int nthreads = 1; 437 438 DBG("smp_setup_cpu_maps()\n"); 439 > 440 cpu_to_phys_id = memblock_alloc(paca_last_cpu_num * sizeof(u32), 441 __alignof__(u32)); 442 if (!cpu_to_phys_id) 443 panic("%s: Failed to allocate %zu bytes align=0x%zx\n", 444 __func__, nr_cpu_ids * sizeof(u32), __alignof__(u32)); 445 446 for_each_node_by_type(dn, "cpu") { 447 const __be32 *intserv; 448 __be32 cpu_be; 449 int j, len; 450 451 DBG(" * %pOF...\n", dn); 452 453 intserv = of_get_property(dn, "ibm,ppc-interrupt-server#s", 454 &len); 455 if (intserv) { 456 DBG(" ibm,ppc-interrupt-server#s -> %lu threads\n", 457 (len / sizeof(int))); 458 } else { 459 DBG(" no ibm,ppc-interrupt-server#s -> 1 thread\n"); 460 intserv = of_get_property(dn, "reg", &len); 461 if (!intserv) { 462 cpu_be = cpu_to_be32(cpu); 463 /* XXX: what is this? uninitialized?? */ 464 intserv = &cpu_be; /* assume logical == phys */ 465 len = 4; 466 } 467 } 468 469 nthreads = len / sizeof(int); 470 471 for (j = 0; j < nthreads && cpu < nr_cpu_ids; j++) { 472 bool avail; 473 474 DBG(" thread %d -> cpu %d (hard id %d)\n", 475 j, cpu, be32_to_cpu(intserv[j])); 476 477 avail = of_device_is_available(dn); 478 if (!avail) 479 avail = !of_property_match_string(dn, 480 "enable-method", "spin-table"); 481 482 set_cpu_present(cpu, avail); 483 set_cpu_possible(cpu, true); 484 cpu_to_phys_id[cpu] = be32_to_cpu(intserv[j]); 485 cpu++; 486 } 487 488 if (cpu >= nr_cpu_ids) { 489 of_node_put(dn); 490 break; 491 } 492 } 493 494 /* If no SMT supported, nthreads is forced to 1 */ 495 if (!cpu_has_feature(CPU_FTR_SMT)) { 496 DBG(" SMT disabled ! nthreads forced to 1\n"); 497 nthreads = 1; 498 } 499
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h index e667d455ecb4..a577d98dd0d8 100644 --- a/arch/powerpc/include/asm/paca.h +++ b/arch/powerpc/include/asm/paca.h @@ -299,5 +299,7 @@ static inline void free_unused_pacas(void) { } #endif /* CONFIG_PPC64 */ +extern int paca_last_cpu_num; + #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_PACA_H */ diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c index 760f371cf096..840c74dd17d6 100644 --- a/arch/powerpc/kernel/paca.c +++ b/arch/powerpc/kernel/paca.c @@ -236,15 +236,15 @@ void setup_paca(struct paca_struct *new_paca) } -static int __initdata paca_nr_cpu_ids; +int __initdata paca_last_cpu_num; static int __initdata paca_ptrs_size; static int __initdata paca_struct_size; void __init allocate_paca_ptrs(void) { - paca_nr_cpu_ids = nr_cpu_ids; + paca_last_cpu_num = nr_cpu_ids; - paca_ptrs_size = sizeof(struct paca_struct *) * nr_cpu_ids; + paca_ptrs_size = sizeof(struct paca_struct *) * paca_last_cpu_num; paca_ptrs = memblock_alloc_raw(paca_ptrs_size, SMP_CACHE_BYTES); if (!paca_ptrs) panic("Failed to allocate %d bytes for paca pointers\n", @@ -258,7 +258,7 @@ void __init allocate_paca(int cpu) u64 limit; struct paca_struct *paca; - BUG_ON(cpu >= paca_nr_cpu_ids); + BUG_ON(cpu >= paca_last_cpu_num); #ifdef CONFIG_PPC_BOOK3S_64 /* diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index 2f1026fba00d..f9f5f313abf0 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c @@ -453,7 +453,7 @@ void __init smp_setup_cpu_maps(void) DBG("smp_setup_cpu_maps()\n"); - cpu_to_phys_id = memblock_alloc(nr_cpu_ids * sizeof(u32), + cpu_to_phys_id = memblock_alloc(paca_last_cpu_num * sizeof(u32), __alignof__(u32)); if (!cpu_to_phys_id) panic("%s: Failed to allocate %zu bytes align=0x%zx\n", diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 5826f5108a12..6fefe22fd118 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c @@ -1140,7 +1140,8 @@ void __init smp_prepare_cpus(unsigned int max_cpus) } if (cpu_to_chip_id(boot_cpuid) != -1) { - int idx = DIV_ROUND_UP(num_possible_cpus(), threads_per_core); + int idx = DIV_ROUND_UP(cpumask_last(cpu_possible_mask), + threads_per_core); /* * All threads of a core will all belong to the same core,