Message ID | 20230419155341.v8.3.I6d7f7d5fa0aa293c8c3374194947254b93114d37@changeid (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v8,01/10] arm64: Add framework to turn IPI as NMI | expand |
Hi, On Wed, Apr 19, 2023 at 3:57 PM Douglas Anderson <dianders@chromium.org> wrote: > > From: Sumit Garg <sumit.garg@linaro.org> > > Assign an unused IPI which can be turned as NMI using ipi_nmi framework. > Also, invoke corresponding dynamic IPI setup/teardown APIs. > > Signed-off-by: Sumit Garg <sumit.garg@linaro.org> > Reviewed-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com> > Tested-by: Chen-Yu Tsai <wens@csie.org> > Signed-off-by: Douglas Anderson <dianders@chromium.org> > --- > > Changes in v8: > - dynamic_ipi_setup() and dynamic_ipi_teardown() no longer take cpu param > > arch/arm64/kernel/smp.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c > index 4e8327264255..94ff063527c6 100644 > --- a/arch/arm64/kernel/smp.c > +++ b/arch/arm64/kernel/smp.c > @@ -43,6 +43,7 @@ > #include <asm/daifflags.h> > #include <asm/kvm_mmu.h> > #include <asm/mmu_context.h> > +#include <asm/nmi.h> > #include <asm/numa.h> > #include <asm/processor.h> > #include <asm/smp_plat.h> > @@ -938,6 +939,8 @@ static void ipi_setup(int cpu) > > for (i = 0; i < nr_ipi; i++) > enable_percpu_irq(ipi_irq_base + i, 0); > + > + dynamic_ipi_setup(); > } > > #ifdef CONFIG_HOTPLUG_CPU > @@ -950,6 +953,8 @@ static void ipi_teardown(int cpu) > > for (i = 0; i < nr_ipi; i++) > disable_percpu_irq(ipi_irq_base + i); > + > + dynamic_ipi_teardown(); > } > #endif > > @@ -971,6 +976,9 @@ void __init set_smp_ipi_range(int ipi_base, int n) > irq_set_status_flags(ipi_base + i, IRQ_HIDDEN); > } > > + if (n > nr_ipi) > + set_smp_dynamic_ipi(ipi_base + nr_ipi); From thinking about this patch more, I'm guessing that the biggest objection someone could have is that this uses up the "last" IPI slot in any systems that are stuck with only 8. Is that the reason that this patch series stagnated in the past, or was it something else? If this is truly the concern that people have, it doesn't look like it would be terribly hard to combine the existing IPI_CPU_STOP and IPI_CPU_CRASH_STOP. Presumably we could just get rid of the "crash stop" IPI and have the normal "stop" IPI do the crash if "waiting_for_crash_ipi" is non-zero. If that's the thing blocking the series from moving forward then I can add that to the series, or we could just wait until someone actually needs another IPI. ;-) -Doug
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c index 4e8327264255..94ff063527c6 100644 --- a/arch/arm64/kernel/smp.c +++ b/arch/arm64/kernel/smp.c @@ -43,6 +43,7 @@ #include <asm/daifflags.h> #include <asm/kvm_mmu.h> #include <asm/mmu_context.h> +#include <asm/nmi.h> #include <asm/numa.h> #include <asm/processor.h> #include <asm/smp_plat.h> @@ -938,6 +939,8 @@ static void ipi_setup(int cpu) for (i = 0; i < nr_ipi; i++) enable_percpu_irq(ipi_irq_base + i, 0); + + dynamic_ipi_setup(); } #ifdef CONFIG_HOTPLUG_CPU @@ -950,6 +953,8 @@ static void ipi_teardown(int cpu) for (i = 0; i < nr_ipi; i++) disable_percpu_irq(ipi_irq_base + i); + + dynamic_ipi_teardown(); } #endif @@ -971,6 +976,9 @@ void __init set_smp_ipi_range(int ipi_base, int n) irq_set_status_flags(ipi_base + i, IRQ_HIDDEN); } + if (n > nr_ipi) + set_smp_dynamic_ipi(ipi_base + nr_ipi); + ipi_irq_base = ipi_base; /* Setup the boot CPU immediately */