On 09/10/23 5:00 pm, Pingfan Liu wrote:
If the boot_cpuid is smaller than nr_cpus, it requires extra effort to
ensure the boot_cpu is in cpu_present_mask. This can be achieved by
reserving the last quota for the boot cpu.

Note: the restriction on nr_cpus will be lifted with more effort in the
successive patches

Signed-off-by: Pingfan Liu <pi...@redhat.com>
Cc: Michael Ellerman <m...@ellerman.id.au>
Cc: Nicholas Piggin <npig...@gmail.com>
Cc: Christophe Leroy <christophe.le...@csgroup.eu>
Cc: Mahesh Salgaonkar <mah...@linux.ibm.com>
Cc: Wen Xiong <wenxi...@linux.ibm.com>
Cc: Baoquan He <b...@redhat.com>
Cc: Ming Lei <ming....@redhat.com>
Cc: kexec@lists.infradead.org
To: linuxppc-...@lists.ozlabs.org
---
  arch/powerpc/kernel/setup-common.c | 25 ++++++++++++++++++++++---
  1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kernel/setup-common.c 
b/arch/powerpc/kernel/setup-common.c
index 81291e13dec0..f9ef0a2666b0 100644
--- a/arch/powerpc/kernel/setup-common.c
+++ b/arch/powerpc/kernel/setup-common.c
@@ -454,8 +454,8 @@ struct interrupt_server_node {
  void __init smp_setup_cpu_maps(void)
  {
        struct device_node *dn;
-       int shift = 0, cpu = 0;
-       int j, nthreads = 1;
+       int terminate, shift = 0, cpu = 0;
+       int j, bt_thread = 0, nthreads = 1;
        int len;
        struct interrupt_server_node *intserv_node, *n;
        struct list_head *bt_node, head;
@@ -518,6 +518,7 @@ void __init smp_setup_cpu_maps(void)
                        for (j = 0 ; j < nthreads; j++) {
                                if (be32_to_cpu(intserv[j]) == boot_cpu_hwid) {
                                        bt_node = &intserv_node->node;
+                                       bt_thread = j;
                                        found_boot_cpu = true;
                                        /*
                                         * Record the round-shift between dt
@@ -537,11 +538,21 @@ void __init smp_setup_cpu_maps(void)
        /* Select the primary thread, the boot cpu's slibing, as the logic 0 */
        list_add_tail(&head, bt_node);
        pr_info("the round shift between dt seq and the cpu logic number: 
%d\n", shift);
+       terminate = nr_cpu_ids;
        list_for_each_entry(intserv_node, &head, node) {
+ j = 0;

+               /* Choose a start point to cover the boot cpu */
+               if (nr_cpu_ids - 1 < bt_thread) {
+                       /*
+                        * The processor core puts assumption on the thread id,
+                        * not to breach the assumption.
+                        */
+                       terminate = nr_cpu_ids - 1;

nthreads is anyway assumed to be same for all cores. So, enforcing
nr_cpu_ids to a minimum of nthreads (and multiple of nthreads) should
make the code much simpler without the need for above check and the
other complexities addressed in the subsequent patches...

Thanks
Hari

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to