diff mbox series

[04/10] MIPS: Move mips_smp_ipi_init call after prepare_cpus

Message ID 20240616-b4-mips-ipi-improvements-v1-4-e332687f1692@flygoat.com (mailing list archive)
State New
Headers show
Series MIPS: IPI Improvements | expand

Commit Message

Jiaxun Yang June 16, 2024, 9:03 p.m. UTC
This will give platform code a genuine chance to setup
IPI IRQ in prepare_cpus.

This is the best place for platforms to setup IPI as smp_setup
is too early for IRQ subsystem.

Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
---
 arch/mips/kernel/smp.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Comments

Huacai Chen June 17, 2024, 1:53 p.m. UTC | #1
Hi, Jiaxun

On Mon, Jun 17, 2024 at 5:03 AM Jiaxun Yang <jiaxun.yang@flygoat.com> wrote:
>
> This will give platform code a genuine chance to setup
> IPI IRQ in prepare_cpus.
>
> This is the best place for platforms to setup IPI as smp_setup
> is too early for IRQ subsystem.
mips_smp_ipi_init() is an early_initcall() function, why do you say it
is in smp_setup()?


Huacai
>
> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
> ---
>  arch/mips/kernel/smp.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
> index fe053fe52147..ddf96c28e2f0 100644
> --- a/arch/mips/kernel/smp.c
> +++ b/arch/mips/kernel/smp.c
> @@ -375,7 +375,6 @@ static int __init mips_smp_ipi_init(void)
>
>         return 0;
>  }
> -early_initcall(mips_smp_ipi_init);
>  #endif
>
>  /*
> @@ -460,12 +459,22 @@ void __init smp_cpus_done(unsigned int max_cpus)
>  /* called from main before smp_init() */
>  void __init smp_prepare_cpus(unsigned int max_cpus)
>  {
> +       int rc;
> +
>         init_new_context(current, &init_mm);
>         current_thread_info()->cpu = 0;
>         mp_ops->prepare_cpus(max_cpus);
>         set_cpu_sibling_map(0);
>         set_cpu_core_map(0);
>         calculate_cpu_foreign_map();
> +#ifdef CONFIG_GENERIC_IRQ_IPI
> +       rc = mips_smp_ipi_init();
> +       if (rc) {
> +               pr_err("Failed to initialize IPI - disabling SMP");
> +               init_cpu_present(cpumask_of(0));
> +               return;
> +       }
> +#endif
>  #ifndef CONFIG_HOTPLUG_CPU
>         init_cpu_present(cpu_possible_mask);
>  #endif
>
> --
> 2.43.0
>
Jiaxun Yang June 17, 2024, 10:10 p.m. UTC | #2
在2024年6月17日六月 下午2:53,Huacai Chen写道:
> Hi, Jiaxun
>
> On Mon, Jun 17, 2024 at 5:03 AM Jiaxun Yang <jiaxun.yang@flygoat.com> wrote:
>>
>> This will give platform code a genuine chance to setup
>> IPI IRQ in prepare_cpus.
>>
>> This is the best place for platforms to setup IPI as smp_setup
>> is too early for IRQ subsystem.
> mips_smp_ipi_init() is an early_initcall() function, why do you say it
> is in smp_setup()?

Sorry, I was trying to say that smp_setup is not a good point so we should
go prepare_cpus.

The intention of this patch is to move mips_smp_ipi_init to a certain point
so platform would gain control over it.

Thanks
- Jiaxun

>
>
> Huacai
>>
>> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
>> ---
>>  arch/mips/kernel/smp.c | 11 ++++++++++-
>>  1 file changed, 10 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
>> index fe053fe52147..ddf96c28e2f0 100644
>> --- a/arch/mips/kernel/smp.c
>> +++ b/arch/mips/kernel/smp.c
>> @@ -375,7 +375,6 @@ static int __init mips_smp_ipi_init(void)
>>
>>         return 0;
>>  }
>> -early_initcall(mips_smp_ipi_init);
>>  #endif
>>
>>  /*
>> @@ -460,12 +459,22 @@ void __init smp_cpus_done(unsigned int max_cpus)
>>  /* called from main before smp_init() */
>>  void __init smp_prepare_cpus(unsigned int max_cpus)
>>  {
>> +       int rc;
>> +
>>         init_new_context(current, &init_mm);
>>         current_thread_info()->cpu = 0;
>>         mp_ops->prepare_cpus(max_cpus);
>>         set_cpu_sibling_map(0);
>>         set_cpu_core_map(0);
>>         calculate_cpu_foreign_map();
>> +#ifdef CONFIG_GENERIC_IRQ_IPI
>> +       rc = mips_smp_ipi_init();
>> +       if (rc) {
>> +               pr_err("Failed to initialize IPI - disabling SMP");
>> +               init_cpu_present(cpumask_of(0));
>> +               return;
>> +       }
>> +#endif
>>  #ifndef CONFIG_HOTPLUG_CPU
>>         init_cpu_present(cpu_possible_mask);
>>  #endif
>>
>> --
>> 2.43.0
>>
Huacai Chen June 18, 2024, 3:51 a.m. UTC | #3
On Tue, Jun 18, 2024 at 6:10 AM Jiaxun Yang <jiaxun.yang@flygoat.com> wrote:
>
>
>
> 在2024年6月17日六月 下午2:53,Huacai Chen写道:
> > Hi, Jiaxun
> >
> > On Mon, Jun 17, 2024 at 5:03 AM Jiaxun Yang <jiaxun.yang@flygoat.com> wrote:
> >>
> >> This will give platform code a genuine chance to setup
> >> IPI IRQ in prepare_cpus.
> >>
> >> This is the best place for platforms to setup IPI as smp_setup
> >> is too early for IRQ subsystem.
> > mips_smp_ipi_init() is an early_initcall() function, why do you say it
> > is in smp_setup()?
>
> Sorry, I was trying to say that smp_setup is not a good point so we should
> go prepare_cpus.
It is not in smp_setup() now, then how do you move it from smp_setup()?

Huacai

>
> The intention of this patch is to move mips_smp_ipi_init to a certain point
> so platform would gain control over it.
>
> Thanks
> - Jiaxun
>
> >
> >
> > Huacai
> >>
> >> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
> >> ---
> >>  arch/mips/kernel/smp.c | 11 ++++++++++-
> >>  1 file changed, 10 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
> >> index fe053fe52147..ddf96c28e2f0 100644
> >> --- a/arch/mips/kernel/smp.c
> >> +++ b/arch/mips/kernel/smp.c
> >> @@ -375,7 +375,6 @@ static int __init mips_smp_ipi_init(void)
> >>
> >>         return 0;
> >>  }
> >> -early_initcall(mips_smp_ipi_init);
> >>  #endif
> >>
> >>  /*
> >> @@ -460,12 +459,22 @@ void __init smp_cpus_done(unsigned int max_cpus)
> >>  /* called from main before smp_init() */
> >>  void __init smp_prepare_cpus(unsigned int max_cpus)
> >>  {
> >> +       int rc;
> >> +
> >>         init_new_context(current, &init_mm);
> >>         current_thread_info()->cpu = 0;
> >>         mp_ops->prepare_cpus(max_cpus);
> >>         set_cpu_sibling_map(0);
> >>         set_cpu_core_map(0);
> >>         calculate_cpu_foreign_map();
> >> +#ifdef CONFIG_GENERIC_IRQ_IPI
> >> +       rc = mips_smp_ipi_init();
> >> +       if (rc) {
> >> +               pr_err("Failed to initialize IPI - disabling SMP");
> >> +               init_cpu_present(cpumask_of(0));
> >> +               return;
> >> +       }
> >> +#endif
> >>  #ifndef CONFIG_HOTPLUG_CPU
> >>         init_cpu_present(cpu_possible_mask);
> >>  #endif
> >>
> >> --
> >> 2.43.0
> >>
>
> --
> - Jiaxun
Jiaxun Yang June 18, 2024, 2:50 p.m. UTC | #4
在2024年6月18日六月 上午4:51,Huacai Chen写道:
> On Tue, Jun 18, 2024 at 6:10 AM Jiaxun Yang <jiaxun.yang@flygoat.com> wrote:
>>
>>
>>
>> 在2024年6月17日六月 下午2:53,Huacai Chen写道:
>> > Hi, Jiaxun
>> >
>> > On Mon, Jun 17, 2024 at 5:03 AM Jiaxun Yang <jiaxun.yang@flygoat.com> wrote:
>> >>
>> >> This will give platform code a genuine chance to setup
>> >> IPI IRQ in prepare_cpus.
>> >>
>> >> This is the best place for platforms to setup IPI as smp_setup
>> >> is too early for IRQ subsystem.
>> > mips_smp_ipi_init() is an early_initcall() function, why do you say it
>> > is in smp_setup()?
>>
>> Sorry, I was trying to say that smp_setup is not a good point so we should
>> go prepare_cpus.
> It is not in smp_setup() now, then how do you move it from smp_setup()?
[...]

Well I was trying to justify where should I move it to, not where
does it from.

I should improve the commit message to justify the reason first.

Thanks
- Jiaxun
>
> Huacai
>
>>
>> The intention of this patch is to move mips_smp_ipi_init to a certain point
>> so platform would gain control over it.
>>
>> Thanks
>> - Jiaxun
>>
>> >
>> >
>> > Huacai
>> >>
>> >> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
>> >> ---
>> >>  arch/mips/kernel/smp.c | 11 ++++++++++-
>> >>  1 file changed, 10 insertions(+), 1 deletion(-)
>> >>
>> >> diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
>> >> index fe053fe52147..ddf96c28e2f0 100644
>> >> --- a/arch/mips/kernel/smp.c
>> >> +++ b/arch/mips/kernel/smp.c
>> >> @@ -375,7 +375,6 @@ static int __init mips_smp_ipi_init(void)
>> >>
>> >>         return 0;
>> >>  }
>> >> -early_initcall(mips_smp_ipi_init);
>> >>  #endif
>> >>
>> >>  /*
>> >> @@ -460,12 +459,22 @@ void __init smp_cpus_done(unsigned int max_cpus)
>> >>  /* called from main before smp_init() */
>> >>  void __init smp_prepare_cpus(unsigned int max_cpus)
>> >>  {
>> >> +       int rc;
>> >> +
>> >>         init_new_context(current, &init_mm);
>> >>         current_thread_info()->cpu = 0;
>> >>         mp_ops->prepare_cpus(max_cpus);
>> >>         set_cpu_sibling_map(0);
>> >>         set_cpu_core_map(0);
>> >>         calculate_cpu_foreign_map();
>> >> +#ifdef CONFIG_GENERIC_IRQ_IPI
>> >> +       rc = mips_smp_ipi_init();
>> >> +       if (rc) {
>> >> +               pr_err("Failed to initialize IPI - disabling SMP");
>> >> +               init_cpu_present(cpumask_of(0));
>> >> +               return;
>> >> +       }
>> >> +#endif
>> >>  #ifndef CONFIG_HOTPLUG_CPU
>> >>         init_cpu_present(cpu_possible_mask);
>> >>  #endif
>> >>
>> >> --
>> >> 2.43.0
>> >>
>>
>> --
>> - Jiaxun
diff mbox series

Patch

diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
index fe053fe52147..ddf96c28e2f0 100644
--- a/arch/mips/kernel/smp.c
+++ b/arch/mips/kernel/smp.c
@@ -375,7 +375,6 @@  static int __init mips_smp_ipi_init(void)
 
 	return 0;
 }
-early_initcall(mips_smp_ipi_init);
 #endif
 
 /*
@@ -460,12 +459,22 @@  void __init smp_cpus_done(unsigned int max_cpus)
 /* called from main before smp_init() */
 void __init smp_prepare_cpus(unsigned int max_cpus)
 {
+	int rc;
+
 	init_new_context(current, &init_mm);
 	current_thread_info()->cpu = 0;
 	mp_ops->prepare_cpus(max_cpus);
 	set_cpu_sibling_map(0);
 	set_cpu_core_map(0);
 	calculate_cpu_foreign_map();
+#ifdef CONFIG_GENERIC_IRQ_IPI
+	rc = mips_smp_ipi_init();
+	if (rc) {
+		pr_err("Failed to initialize IPI - disabling SMP");
+		init_cpu_present(cpumask_of(0));
+		return;
+	}
+#endif
 #ifndef CONFIG_HOTPLUG_CPU
 	init_cpu_present(cpu_possible_mask);
 #endif