From: Pingfan Liu <kernelfans@gmail.com> To: linuxppc-dev@lists.ozlabs.org Cc: Pingfan Liu <piliu@redhat.com>, Michael Ellerman <mpe@ellerman.id.au>, Nicholas Piggin <npiggin@gmail.com>, Christophe Leroy <christophe.leroy@csgroup.eu>, Mahesh Salgaonkar <mahesh@linux.ibm.com>, Wen Xiong <wenxiong@us.ibm.com>, Baoquan He <bhe@redhat.com>, Ming Lei <ming.lei@redhat.com>, Sourabh Jain <sourabhjain@linux.ibm.com>, Hari Bathini <hbathini@linux.ibm.com>, kexec@lists.infradead.org Subject: [PATCHv10 3/3] powerpc/smp: Allow hole in paca_ptrs to accommodate boot_cpu Date: Wed, 27 Dec 2023 10:41:47 +0800 [thread overview] Message-ID: <20231227024147.12485-1-kernelfans@gmail.com> (raw) In-Reply-To: <20231227023934.12299-1-kernelfans@gmail.com> From: Pingfan Liu <piliu@redhat.com> This patch always forces the first core onlined due to some subsystem needs cpu0. After core0, a hole may follow, then comes the crashed core. Signed-off-by: Pingfan Liu <piliu@redhat.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: Mahesh Salgaonkar <mahesh@linux.ibm.com> Cc: Wen Xiong <wenxiong@us.ibm.com> Cc: Baoquan He <bhe@redhat.com> Cc: Ming Lei <ming.lei@redhat.com> Cc: Sourabh Jain <sourabhjain@linux.ibm.com> Cc: Hari Bathini <hbathini@linux.ibm.com> Cc: kexec@lists.infradead.org To: linuxppc-dev@lists.ozlabs.org --- arch/powerpc/include/asm/smp.h | 1 + arch/powerpc/kernel/paca.c | 7 +++++-- arch/powerpc/kernel/prom.c | 6 ++++++ arch/powerpc/kernel/setup-common.c | 24 ++++++++++++++++++++---- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index aaaa576d0e15..f01c7891b0d7 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h @@ -27,6 +27,7 @@ extern int boot_cpuid; extern int boot_cpu_hwid; /* PPC64 only */ +extern int threads_in_core; extern int spinning_secondaries; extern u32 *cpu_to_phys_id; extern bool coregroup_enabled; diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c index 840c74dd17d6..1fe0fd2a6021 100644 --- a/arch/powerpc/kernel/paca.c +++ b/arch/powerpc/kernel/paca.c @@ -242,9 +242,12 @@ static int __initdata paca_struct_size; void __init allocate_paca_ptrs(void) { - paca_last_cpu_num = nr_cpu_ids; + unsigned int cnt; - paca_ptrs_size = sizeof(struct paca_struct *) * paca_last_cpu_num; + /* paca_ptrs should be big enough to hold boot cpu */ + cnt = max((unsigned int)ALIGN(boot_cpuid + 1, threads_in_core), nr_cpu_ids); + paca_last_cpu_num = cnt; + paca_ptrs_size = sizeof(struct paca_struct *) * cnt; paca_ptrs = memblock_alloc_raw(paca_ptrs_size, SMP_CACHE_BYTES); if (!paca_ptrs) panic("Failed to allocate %d bytes for paca pointers\n", diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 0b5878c3125b..e1a671156941 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c @@ -371,9 +371,15 @@ static int __init early_init_dt_scan_cpus(unsigned long node, DBG("boot cpu: logical %d physical %d\n", found, be32_to_cpu(intserv[found_thread])); boot_cpuid = found; + /* This forces all threads in a core to be onlined */ + set_nr_cpu_ids(ALIGN(nr_cpu_ids, nthreads)); + /* Core 0 is always onlined and assure enough room for boot core */ + if (nthreads -1 < boot_cpuid && nr_cpu_ids < 2 * nthreads) + set_nr_cpu_ids(2 * nthreads); if (IS_ENABLED(CONFIG_PPC64)) boot_cpu_hwid = be32_to_cpu(intserv[found_thread]); + threads_in_core = nthreads; /* * PAPR defines "logical" PVR values for cpus that diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index f9f5f313abf0..b70474e1b5fe 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c @@ -86,6 +86,7 @@ EXPORT_SYMBOL(machine_id); int boot_cpuid = -1; EXPORT_SYMBOL_GPL(boot_cpuid); +int __initdata threads_in_core = 1; #ifdef CONFIG_PPC64 int boot_cpu_hwid = -1; @@ -448,8 +449,9 @@ u32 *cpu_to_phys_id = NULL; void __init smp_setup_cpu_maps(void) { struct device_node *dn; - int cpu = 0; + int cpu_onlined = 0, cpu = 0; int nthreads = 1; + bool bootcpu_covered = false; DBG("smp_setup_cpu_maps()\n"); @@ -484,7 +486,19 @@ void __init smp_setup_cpu_maps(void) nthreads = len / sizeof(int); - for (j = 0; j < nthreads && cpu < nr_cpu_ids; j++) { + if (!bootcpu_covered) { + if (cpu == ALIGN_DOWN(boot_cpuid, nthreads)) { + bootcpu_covered = true; + goto scan; + + /* Reserve the last online slot for boot core */ + } else if (cpu >= nr_cpu_ids - nthreads && !bootcpu_covered) { + cpu += nthreads; + continue; + } + } +scan: + for (j = 0; j < nthreads && cpu_onlined < nr_cpu_ids; j++) { bool avail; DBG(" thread %d -> cpu %d (hard id %d)\n", @@ -499,9 +513,10 @@ void __init smp_setup_cpu_maps(void) set_cpu_possible(cpu, true); cpu_to_phys_id[cpu] = be32_to_cpu(intserv[j]); cpu++; + cpu_onlined++; } - if (cpu >= nr_cpu_ids) { + if (cpu_onlined >= nr_cpu_ids) { of_node_put(dn); break; } @@ -547,7 +562,8 @@ void __init smp_setup_cpu_maps(void) printk(KERN_INFO "Partition configured for %d cpus.\n", maxcpus); - for (cpu = 0; cpu < maxcpus; cpu++) + /* Bits below #cpu have been set */ + for (; cpu < maxcpus; cpu++) set_cpu_possible(cpu, true); out: of_node_put(dn); -- 2.31.1 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec
WARNING: multiple messages have this Message-ID (diff)
From: Pingfan Liu <kernelfans@gmail.com> To: linuxppc-dev@lists.ozlabs.org Cc: Baoquan He <bhe@redhat.com>, Pingfan Liu <piliu@redhat.com>, kexec@lists.infradead.org, Mahesh Salgaonkar <mahesh@linux.ibm.com>, Ming Lei <ming.lei@redhat.com>, Nicholas Piggin <npiggin@gmail.com>, Sourabh Jain <sourabhjain@linux.ibm.com>, Hari Bathini <hbathini@linux.ibm.com>, Wen Xiong <wenxiong@us.ibm.com> Subject: [PATCHv10 3/3] powerpc/smp: Allow hole in paca_ptrs to accommodate boot_cpu Date: Wed, 27 Dec 2023 10:41:47 +0800 [thread overview] Message-ID: <20231227024147.12485-1-kernelfans@gmail.com> (raw) In-Reply-To: <20231227023934.12299-1-kernelfans@gmail.com> From: Pingfan Liu <piliu@redhat.com> This patch always forces the first core onlined due to some subsystem needs cpu0. After core0, a hole may follow, then comes the crashed core. Signed-off-by: Pingfan Liu <piliu@redhat.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: Mahesh Salgaonkar <mahesh@linux.ibm.com> Cc: Wen Xiong <wenxiong@us.ibm.com> Cc: Baoquan He <bhe@redhat.com> Cc: Ming Lei <ming.lei@redhat.com> Cc: Sourabh Jain <sourabhjain@linux.ibm.com> Cc: Hari Bathini <hbathini@linux.ibm.com> Cc: kexec@lists.infradead.org To: linuxppc-dev@lists.ozlabs.org --- arch/powerpc/include/asm/smp.h | 1 + arch/powerpc/kernel/paca.c | 7 +++++-- arch/powerpc/kernel/prom.c | 6 ++++++ arch/powerpc/kernel/setup-common.c | 24 ++++++++++++++++++++---- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index aaaa576d0e15..f01c7891b0d7 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h @@ -27,6 +27,7 @@ extern int boot_cpuid; extern int boot_cpu_hwid; /* PPC64 only */ +extern int threads_in_core; extern int spinning_secondaries; extern u32 *cpu_to_phys_id; extern bool coregroup_enabled; diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c index 840c74dd17d6..1fe0fd2a6021 100644 --- a/arch/powerpc/kernel/paca.c +++ b/arch/powerpc/kernel/paca.c @@ -242,9 +242,12 @@ static int __initdata paca_struct_size; void __init allocate_paca_ptrs(void) { - paca_last_cpu_num = nr_cpu_ids; + unsigned int cnt; - paca_ptrs_size = sizeof(struct paca_struct *) * paca_last_cpu_num; + /* paca_ptrs should be big enough to hold boot cpu */ + cnt = max((unsigned int)ALIGN(boot_cpuid + 1, threads_in_core), nr_cpu_ids); + paca_last_cpu_num = cnt; + paca_ptrs_size = sizeof(struct paca_struct *) * cnt; paca_ptrs = memblock_alloc_raw(paca_ptrs_size, SMP_CACHE_BYTES); if (!paca_ptrs) panic("Failed to allocate %d bytes for paca pointers\n", diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 0b5878c3125b..e1a671156941 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c @@ -371,9 +371,15 @@ static int __init early_init_dt_scan_cpus(unsigned long node, DBG("boot cpu: logical %d physical %d\n", found, be32_to_cpu(intserv[found_thread])); boot_cpuid = found; + /* This forces all threads in a core to be onlined */ + set_nr_cpu_ids(ALIGN(nr_cpu_ids, nthreads)); + /* Core 0 is always onlined and assure enough room for boot core */ + if (nthreads -1 < boot_cpuid && nr_cpu_ids < 2 * nthreads) + set_nr_cpu_ids(2 * nthreads); if (IS_ENABLED(CONFIG_PPC64)) boot_cpu_hwid = be32_to_cpu(intserv[found_thread]); + threads_in_core = nthreads; /* * PAPR defines "logical" PVR values for cpus that diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index f9f5f313abf0..b70474e1b5fe 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c @@ -86,6 +86,7 @@ EXPORT_SYMBOL(machine_id); int boot_cpuid = -1; EXPORT_SYMBOL_GPL(boot_cpuid); +int __initdata threads_in_core = 1; #ifdef CONFIG_PPC64 int boot_cpu_hwid = -1; @@ -448,8 +449,9 @@ u32 *cpu_to_phys_id = NULL; void __init smp_setup_cpu_maps(void) { struct device_node *dn; - int cpu = 0; + int cpu_onlined = 0, cpu = 0; int nthreads = 1; + bool bootcpu_covered = false; DBG("smp_setup_cpu_maps()\n"); @@ -484,7 +486,19 @@ void __init smp_setup_cpu_maps(void) nthreads = len / sizeof(int); - for (j = 0; j < nthreads && cpu < nr_cpu_ids; j++) { + if (!bootcpu_covered) { + if (cpu == ALIGN_DOWN(boot_cpuid, nthreads)) { + bootcpu_covered = true; + goto scan; + + /* Reserve the last online slot for boot core */ + } else if (cpu >= nr_cpu_ids - nthreads && !bootcpu_covered) { + cpu += nthreads; + continue; + } + } +scan: + for (j = 0; j < nthreads && cpu_onlined < nr_cpu_ids; j++) { bool avail; DBG(" thread %d -> cpu %d (hard id %d)\n", @@ -499,9 +513,10 @@ void __init smp_setup_cpu_maps(void) set_cpu_possible(cpu, true); cpu_to_phys_id[cpu] = be32_to_cpu(intserv[j]); cpu++; + cpu_onlined++; } - if (cpu >= nr_cpu_ids) { + if (cpu_onlined >= nr_cpu_ids) { of_node_put(dn); break; } @@ -547,7 +562,8 @@ void __init smp_setup_cpu_maps(void) printk(KERN_INFO "Partition configured for %d cpus.\n", maxcpus); - for (cpu = 0; cpu < maxcpus; cpu++) + /* Bits below #cpu have been set */ + for (; cpu < maxcpus; cpu++) set_cpu_possible(cpu, true); out: of_node_put(dn); -- 2.31.1
next prev parent reply other threads:[~2023-12-27 2:42 UTC|newest] Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-12-27 2:39 [PATCHv10 0/3] enable nr_cpus for powerpc without re-ordering cpu number Pingfan Liu 2023-12-27 2:39 ` Pingfan Liu 2023-12-27 2:39 ` [PATCHv10 1/3] powerpc/kernel: Remove check on paca_ptrs_size Pingfan Liu 2023-12-27 2:39 ` Pingfan Liu 2023-12-27 2:41 ` [PATCHv10 2/3] powerpc/kernel: Extend arrays' size to make room for a hole in cpu_possible_mask Pingfan Liu 2023-12-27 2:41 ` Pingfan Liu 2023-12-27 19:52 ` kernel test robot 2023-12-27 19:52 ` kernel test robot 2023-12-27 19:52 ` kernel test robot 2023-12-27 2:41 ` Pingfan Liu [this message] 2023-12-27 2:41 ` [PATCHv10 3/3] powerpc/smp: Allow hole in paca_ptrs to accommodate boot_cpu Pingfan Liu 2023-12-27 20:45 ` kernel test robot 2023-12-27 20:45 ` kernel test robot 2023-12-27 20:45 ` kernel test robot 2023-12-28 4:07 ` kernel test robot 2023-12-28 4:07 ` kernel test robot 2023-12-28 4:07 ` kernel test robot
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20231227024147.12485-1-kernelfans@gmail.com \ --to=kernelfans@gmail.com \ --cc=bhe@redhat.com \ --cc=christophe.leroy@csgroup.eu \ --cc=hbathini@linux.ibm.com \ --cc=kexec@lists.infradead.org \ --cc=linuxppc-dev@lists.ozlabs.org \ --cc=mahesh@linux.ibm.com \ --cc=ming.lei@redhat.com \ --cc=mpe@ellerman.id.au \ --cc=npiggin@gmail.com \ --cc=piliu@redhat.com \ --cc=sourabhjain@linux.ibm.com \ --cc=wenxiong@us.ibm.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.