From e2ac494dde27773f2329ecfb5a747f1bfb2d2b0f Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 6 Dec 2022 17:32:36 +0100 Subject: [PATCH] drop riscv patch from 5.15 and 6.0 --- ...p-crash_smp_send_stop-without-multi-.patch | 310 ----------------- queue-5.15/series | 1 - ...p-crash_smp_send_stop-without-multi-.patch | 314 ------------------ queue-6.0/series | 1 - 4 files changed, 626 deletions(-) delete mode 100644 queue-5.15/riscv-kexec-fixup-crash_smp_send_stop-without-multi-.patch delete mode 100644 queue-6.0/riscv-kexec-fixup-crash_smp_send_stop-without-multi-.patch diff --git a/queue-5.15/riscv-kexec-fixup-crash_smp_send_stop-without-multi-.patch b/queue-5.15/riscv-kexec-fixup-crash_smp_send_stop-without-multi-.patch deleted file mode 100644 index dc3e3690c3e..00000000000 --- a/queue-5.15/riscv-kexec-fixup-crash_smp_send_stop-without-multi-.patch +++ /dev/null @@ -1,310 +0,0 @@ -From 6ebd75a424f9beed695e0aae59ccfe91565c0953 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Thu, 20 Oct 2022 10:16:03 -0400 -Subject: riscv: kexec: Fixup crash_smp_send_stop without multi cores - -From: Guo Ren - -[ Upstream commit 9b932aadfc47de5d70b53ea04b0d1b5f6c82945b ] - -Current crash_smp_send_stop is the same as the generic one in -kernel/panic and misses crash_save_cpu in percpu. This patch is inspired -by 78fd584cdec0 ("arm64: kdump: implement machine_crash_shutdown()") -and adds the same mechanism for riscv. - -Before this patch, test result: -crash> help -r -CPU 0: [OFFLINE] - -CPU 1: -epc : ffffffff80009ff0 ra : ffffffff800b789a sp : ff2000001098bb40 - gp : ffffffff815fca60 tp : ff60000004680000 t0 : 6666666666663c5b - t1 : 0000000000000000 t2 : 666666666666663c s0 : ff2000001098bc90 - s1 : ffffffff81600798 a0 : ff2000001098bb48 a1 : 0000000000000000 - a2 : 0000000000000000 a3 : 0000000000000001 a4 : 0000000000000000 - a5 : ff60000004690800 a6 : 0000000000000000 a7 : 0000000000000000 - s2 : ff2000001098bb48 s3 : ffffffff81093ec8 s4 : ffffffff816004ac - s5 : 0000000000000000 s6 : 0000000000000007 s7 : ffffffff80e7f720 - s8 : 00fffffffffff3f0 s9 : 0000000000000007 s10: 00aaaaaaaab98700 - s11: 0000000000000001 t3 : ffffffff819a8097 t4 : ffffffff819a8097 - t5 : ffffffff819a8098 t6 : ff2000001098b9a8 - -CPU 2: [OFFLINE] - -CPU 3: [OFFLINE] - -After this patch, test result: -crash> help -r -CPU 0: -epc : ffffffff80003f34 ra : ffffffff808caa7c sp : ffffffff81403eb0 - gp : ffffffff815fcb48 tp : ffffffff81413400 t0 : 0000000000000000 - t1 : 0000000000000000 t2 : 0000000000000000 s0 : ffffffff81403ec0 - s1 : 0000000000000000 a0 : 0000000000000000 a1 : 0000000000000000 - a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000 - a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000 - s2 : ffffffff816001c8 s3 : ffffffff81600370 s4 : ffffffff80c32e18 - s5 : ffffffff819d3018 s6 : ffffffff810e2110 s7 : 0000000000000000 - s8 : 0000000000000000 s9 : 0000000080039eac s10: 0000000000000000 - s11: 0000000000000000 t3 : 0000000000000000 t4 : 0000000000000000 - t5 : 0000000000000000 t6 : 0000000000000000 - -CPU 1: -epc : ffffffff80003f34 ra : ffffffff808caa7c sp : ff2000000068bf30 - gp : ffffffff815fcb48 tp : ff6000000240d400 t0 : 0000000000000000 - t1 : 0000000000000000 t2 : 0000000000000000 s0 : ff2000000068bf40 - s1 : 0000000000000001 a0 : 0000000000000000 a1 : 0000000000000000 - a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000 - a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000 - s2 : ffffffff816001c8 s3 : ffffffff81600370 s4 : ffffffff80c32e18 - s5 : ffffffff819d3018 s6 : ffffffff810e2110 s7 : 0000000000000000 - s8 : 0000000000000000 s9 : 0000000080039ea8 s10: 0000000000000000 - s11: 0000000000000000 t3 : 0000000000000000 t4 : 0000000000000000 - t5 : 0000000000000000 t6 : 0000000000000000 - -CPU 2: -epc : ffffffff80003f34 ra : ffffffff808caa7c sp : ff20000000693f30 - gp : ffffffff815fcb48 tp : ff6000000240e900 t0 : 0000000000000000 - t1 : 0000000000000000 t2 : 0000000000000000 s0 : ff20000000693f40 - s1 : 0000000000000002 a0 : 0000000000000000 a1 : 0000000000000000 - a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000 - a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000 - s2 : ffffffff816001c8 s3 : ffffffff81600370 s4 : ffffffff80c32e18 - s5 : ffffffff819d3018 s6 : ffffffff810e2110 s7 : 0000000000000000 - s8 : 0000000000000000 s9 : 0000000080039eb0 s10: 0000000000000000 - s11: 0000000000000000 t3 : 0000000000000000 t4 : 0000000000000000 - t5 : 0000000000000000 t6 : 0000000000000000 - -CPU 3: -epc : ffffffff8000a1e4 ra : ffffffff800b7bba sp : ff200000109bbb40 - gp : ffffffff815fcb48 tp : ff6000000373aa00 t0 : 6666666666663c5b - t1 : 0000000000000000 t2 : 666666666666663c s0 : ff200000109bbc90 - s1 : ffffffff816007a0 a0 : ff200000109bbb48 a1 : 0000000000000000 - a2 : 0000000000000000 a3 : 0000000000000001 a4 : 0000000000000000 - a5 : ff60000002c61c00 a6 : 0000000000000000 a7 : 0000000000000000 - s2 : ff200000109bbb48 s3 : ffffffff810941a8 s4 : ffffffff816004b4 - s5 : 0000000000000000 s6 : 0000000000000007 s7 : ffffffff80e7f7a0 - s8 : 00fffffffffff3f0 s9 : 0000000000000007 s10: 00aaaaaaaab98700 - s11: 0000000000000001 t3 : ffffffff819a8097 t4 : ffffffff819a8097 - t5 : ffffffff819a8098 t6 : ff200000109bb9a8 - -Fixes: ad943893d5f1 ("RISC-V: Fixup schedule out issue in machine_crash_shutdown()") -Reviewed-by: Xianting Tian -Signed-off-by: Guo Ren -Signed-off-by: Guo Ren -Cc: Nick Kossifidis -Link: https://lore.kernel.org/r/20221020141603.2856206-3-guoren@kernel.org -Signed-off-by: Palmer Dabbelt -Signed-off-by: Sasha Levin ---- - arch/riscv/include/asm/smp.h | 3 + - arch/riscv/kernel/machine_kexec.c | 21 ++----- - arch/riscv/kernel/smp.c | 93 ++++++++++++++++++++++++++++++- - 3 files changed, 100 insertions(+), 17 deletions(-) - -diff --git a/arch/riscv/include/asm/smp.h b/arch/riscv/include/asm/smp.h -index 62d0e6e61da8..b29f2a79b636 100644 ---- a/arch/riscv/include/asm/smp.h -+++ b/arch/riscv/include/asm/smp.h -@@ -50,6 +50,9 @@ void riscv_set_ipi_ops(const struct riscv_ipi_ops *ops); - /* Clear IPI for current CPU */ - void riscv_clear_ipi(void); - -+/* Check other CPUs stop or not */ -+bool smp_crash_stop_failed(void); -+ - /* Secondary hart entry */ - asmlinkage void smp_callin(void); - -diff --git a/arch/riscv/kernel/machine_kexec.c b/arch/riscv/kernel/machine_kexec.c -index db41c676e5a2..2d139b724bc8 100644 ---- a/arch/riscv/kernel/machine_kexec.c -+++ b/arch/riscv/kernel/machine_kexec.c -@@ -140,22 +140,6 @@ void machine_shutdown(void) - #endif - } - --/* Override the weak function in kernel/panic.c */ --void crash_smp_send_stop(void) --{ -- static int cpus_stopped; -- -- /* -- * This function can be called twice in panic path, but obviously -- * we execute this only once. -- */ -- if (cpus_stopped) -- return; -- -- smp_send_stop(); -- cpus_stopped = 1; --} -- - static void machine_kexec_mask_interrupts(void) - { - unsigned int i; -@@ -230,6 +214,11 @@ machine_kexec(struct kimage *image) - void *control_code_buffer = page_address(image->control_code_page); - riscv_kexec_method kexec_method = NULL; - -+#ifdef CONFIG_SMP -+ WARN(smp_crash_stop_failed(), -+ "Some CPUs may be stale, kdump will be unreliable.\n"); -+#endif -+ - if (image->type != KEXEC_TYPE_CRASH) - kexec_method = control_code_buffer; - else -diff --git a/arch/riscv/kernel/smp.c b/arch/riscv/kernel/smp.c -index d0147294691d..3155387ca82d 100644 ---- a/arch/riscv/kernel/smp.c -+++ b/arch/riscv/kernel/smp.c -@@ -12,6 +12,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -22,11 +23,13 @@ - #include - #include - #include -+#include - - enum ipi_message_type { - IPI_RESCHEDULE, - IPI_CALL_FUNC, - IPI_CPU_STOP, -+ IPI_CPU_CRASH_STOP, - IPI_IRQ_WORK, - IPI_TIMER, - IPI_MAX -@@ -77,6 +80,32 @@ static void ipi_stop(void) - wait_for_interrupt(); - } - -+#ifdef CONFIG_KEXEC_CORE -+static atomic_t waiting_for_crash_ipi = ATOMIC_INIT(0); -+ -+static inline void ipi_cpu_crash_stop(unsigned int cpu, struct pt_regs *regs) -+{ -+ crash_save_cpu(regs, cpu); -+ -+ atomic_dec(&waiting_for_crash_ipi); -+ -+ local_irq_disable(); -+ -+#ifdef CONFIG_HOTPLUG_CPU -+ if (cpu_has_hotplug(cpu)) -+ cpu_ops[cpu]->cpu_stop(); -+#endif -+ -+ for(;;) -+ wait_for_interrupt(); -+} -+#else -+static inline void ipi_cpu_crash_stop(unsigned int cpu, struct pt_regs *regs) -+{ -+ unreachable(); -+} -+#endif -+ - static const struct riscv_ipi_ops *ipi_ops __ro_after_init; - - void riscv_set_ipi_ops(const struct riscv_ipi_ops *ops) -@@ -130,7 +159,6 @@ void arch_irq_work_raise(void) - - void handle_IPI(struct pt_regs *regs) - { -- struct pt_regs *old_regs = set_irq_regs(regs); - unsigned long *pending_ipis = &ipi_data[smp_processor_id()].bits; - unsigned long *stats = ipi_data[smp_processor_id()].stats; - -@@ -163,6 +191,10 @@ void handle_IPI(struct pt_regs *regs) - ipi_stop(); - } - -+ if (ops & (1 << IPI_CPU_CRASH_STOP)) { -+ ipi_cpu_crash_stop(cpu, get_irq_regs()); -+ } -+ - if (ops & (1 << IPI_IRQ_WORK)) { - stats[IPI_IRQ_WORK]++; - irq_work_run(); -@@ -189,6 +221,7 @@ static const char * const ipi_names[] = { - [IPI_RESCHEDULE] = "Rescheduling interrupts", - [IPI_CALL_FUNC] = "Function call interrupts", - [IPI_CPU_STOP] = "CPU stop interrupts", -+ [IPI_CPU_CRASH_STOP] = "CPU stop (for crash dump) interrupts", - [IPI_IRQ_WORK] = "IRQ work interrupts", - [IPI_TIMER] = "Timer broadcast interrupts", - }; -@@ -248,6 +281,64 @@ void smp_send_stop(void) - cpumask_pr_args(cpu_online_mask)); - } - -+#ifdef CONFIG_KEXEC_CORE -+/* -+ * The number of CPUs online, not counting this CPU (which may not be -+ * fully online and so not counted in num_online_cpus()). -+ */ -+static inline unsigned int num_other_online_cpus(void) -+{ -+ unsigned int this_cpu_online = cpu_online(smp_processor_id()); -+ -+ return num_online_cpus() - this_cpu_online; -+} -+ -+void crash_smp_send_stop(void) -+{ -+ static int cpus_stopped; -+ cpumask_t mask; -+ unsigned long timeout; -+ -+ /* -+ * This function can be called twice in panic path, but obviously -+ * we execute this only once. -+ */ -+ if (cpus_stopped) -+ return; -+ -+ cpus_stopped = 1; -+ -+ /* -+ * If this cpu is the only one alive at this point in time, online or -+ * not, there are no stop messages to be sent around, so just back out. -+ */ -+ if (num_other_online_cpus() == 0) -+ return; -+ -+ cpumask_copy(&mask, cpu_online_mask); -+ cpumask_clear_cpu(smp_processor_id(), &mask); -+ -+ atomic_set(&waiting_for_crash_ipi, num_other_online_cpus()); -+ -+ pr_crit("SMP: stopping secondary CPUs\n"); -+ send_ipi_mask(&mask, IPI_CPU_CRASH_STOP); -+ -+ /* Wait up to one second for other CPUs to stop */ -+ timeout = USEC_PER_SEC; -+ while ((atomic_read(&waiting_for_crash_ipi) > 0) && timeout--) -+ udelay(1); -+ -+ if (atomic_read(&waiting_for_crash_ipi) > 0) -+ pr_warn("SMP: failed to stop secondary CPUs %*pbl\n", -+ cpumask_pr_args(&mask)); -+} -+ -+bool smp_crash_stop_failed(void) -+{ -+ return (atomic_read(&waiting_for_crash_ipi) > 0); -+} -+#endif -+ - void smp_send_reschedule(int cpu) - { - send_ipi_single(cpu, IPI_RESCHEDULE); --- -2.35.1 - diff --git a/queue-5.15/series b/queue-5.15/series index 5f0ac5c0fc5..4e02738f901 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -96,7 +96,6 @@ pinctrl-single-fix-potential-division-by-zero.patch riscv-sync-efi-page-table-s-kernel-mappings-before-s.patch riscv-fix-race-when-vmap-stack-overflow.patch riscv-kexec-fixup-irq-controller-broken-in-kexec-cra.patch -riscv-kexec-fixup-crash_smp_send_stop-without-multi-.patch nvme-fix-srcu-protection-of-nvme_ns_head-list.patch iommu-vt-d-fix-pci-device-refcount-leak-in-has_exter.patch iommu-vt-d-fix-pci-device-refcount-leak-in-dmar_dev_.patch diff --git a/queue-6.0/riscv-kexec-fixup-crash_smp_send_stop-without-multi-.patch b/queue-6.0/riscv-kexec-fixup-crash_smp_send_stop-without-multi-.patch deleted file mode 100644 index b3806ee1eba..00000000000 --- a/queue-6.0/riscv-kexec-fixup-crash_smp_send_stop-without-multi-.patch +++ /dev/null @@ -1,314 +0,0 @@ -From 067905b58e2bdce609e031dc3882039a2482fdac Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Thu, 20 Oct 2022 10:16:03 -0400 -Subject: riscv: kexec: Fixup crash_smp_send_stop without multi cores - -From: Guo Ren - -[ Upstream commit 9b932aadfc47de5d70b53ea04b0d1b5f6c82945b ] - -Current crash_smp_send_stop is the same as the generic one in -kernel/panic and misses crash_save_cpu in percpu. This patch is inspired -by 78fd584cdec0 ("arm64: kdump: implement machine_crash_shutdown()") -and adds the same mechanism for riscv. - -Before this patch, test result: -crash> help -r -CPU 0: [OFFLINE] - -CPU 1: -epc : ffffffff80009ff0 ra : ffffffff800b789a sp : ff2000001098bb40 - gp : ffffffff815fca60 tp : ff60000004680000 t0 : 6666666666663c5b - t1 : 0000000000000000 t2 : 666666666666663c s0 : ff2000001098bc90 - s1 : ffffffff81600798 a0 : ff2000001098bb48 a1 : 0000000000000000 - a2 : 0000000000000000 a3 : 0000000000000001 a4 : 0000000000000000 - a5 : ff60000004690800 a6 : 0000000000000000 a7 : 0000000000000000 - s2 : ff2000001098bb48 s3 : ffffffff81093ec8 s4 : ffffffff816004ac - s5 : 0000000000000000 s6 : 0000000000000007 s7 : ffffffff80e7f720 - s8 : 00fffffffffff3f0 s9 : 0000000000000007 s10: 00aaaaaaaab98700 - s11: 0000000000000001 t3 : ffffffff819a8097 t4 : ffffffff819a8097 - t5 : ffffffff819a8098 t6 : ff2000001098b9a8 - -CPU 2: [OFFLINE] - -CPU 3: [OFFLINE] - -After this patch, test result: -crash> help -r -CPU 0: -epc : ffffffff80003f34 ra : ffffffff808caa7c sp : ffffffff81403eb0 - gp : ffffffff815fcb48 tp : ffffffff81413400 t0 : 0000000000000000 - t1 : 0000000000000000 t2 : 0000000000000000 s0 : ffffffff81403ec0 - s1 : 0000000000000000 a0 : 0000000000000000 a1 : 0000000000000000 - a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000 - a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000 - s2 : ffffffff816001c8 s3 : ffffffff81600370 s4 : ffffffff80c32e18 - s5 : ffffffff819d3018 s6 : ffffffff810e2110 s7 : 0000000000000000 - s8 : 0000000000000000 s9 : 0000000080039eac s10: 0000000000000000 - s11: 0000000000000000 t3 : 0000000000000000 t4 : 0000000000000000 - t5 : 0000000000000000 t6 : 0000000000000000 - -CPU 1: -epc : ffffffff80003f34 ra : ffffffff808caa7c sp : ff2000000068bf30 - gp : ffffffff815fcb48 tp : ff6000000240d400 t0 : 0000000000000000 - t1 : 0000000000000000 t2 : 0000000000000000 s0 : ff2000000068bf40 - s1 : 0000000000000001 a0 : 0000000000000000 a1 : 0000000000000000 - a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000 - a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000 - s2 : ffffffff816001c8 s3 : ffffffff81600370 s4 : ffffffff80c32e18 - s5 : ffffffff819d3018 s6 : ffffffff810e2110 s7 : 0000000000000000 - s8 : 0000000000000000 s9 : 0000000080039ea8 s10: 0000000000000000 - s11: 0000000000000000 t3 : 0000000000000000 t4 : 0000000000000000 - t5 : 0000000000000000 t6 : 0000000000000000 - -CPU 2: -epc : ffffffff80003f34 ra : ffffffff808caa7c sp : ff20000000693f30 - gp : ffffffff815fcb48 tp : ff6000000240e900 t0 : 0000000000000000 - t1 : 0000000000000000 t2 : 0000000000000000 s0 : ff20000000693f40 - s1 : 0000000000000002 a0 : 0000000000000000 a1 : 0000000000000000 - a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000 - a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000000000 - s2 : ffffffff816001c8 s3 : ffffffff81600370 s4 : ffffffff80c32e18 - s5 : ffffffff819d3018 s6 : ffffffff810e2110 s7 : 0000000000000000 - s8 : 0000000000000000 s9 : 0000000080039eb0 s10: 0000000000000000 - s11: 0000000000000000 t3 : 0000000000000000 t4 : 0000000000000000 - t5 : 0000000000000000 t6 : 0000000000000000 - -CPU 3: -epc : ffffffff8000a1e4 ra : ffffffff800b7bba sp : ff200000109bbb40 - gp : ffffffff815fcb48 tp : ff6000000373aa00 t0 : 6666666666663c5b - t1 : 0000000000000000 t2 : 666666666666663c s0 : ff200000109bbc90 - s1 : ffffffff816007a0 a0 : ff200000109bbb48 a1 : 0000000000000000 - a2 : 0000000000000000 a3 : 0000000000000001 a4 : 0000000000000000 - a5 : ff60000002c61c00 a6 : 0000000000000000 a7 : 0000000000000000 - s2 : ff200000109bbb48 s3 : ffffffff810941a8 s4 : ffffffff816004b4 - s5 : 0000000000000000 s6 : 0000000000000007 s7 : ffffffff80e7f7a0 - s8 : 00fffffffffff3f0 s9 : 0000000000000007 s10: 00aaaaaaaab98700 - s11: 0000000000000001 t3 : ffffffff819a8097 t4 : ffffffff819a8097 - t5 : ffffffff819a8098 t6 : ff200000109bb9a8 - -Fixes: ad943893d5f1 ("RISC-V: Fixup schedule out issue in machine_crash_shutdown()") -Reviewed-by: Xianting Tian -Signed-off-by: Guo Ren -Signed-off-by: Guo Ren -Cc: Nick Kossifidis -Link: https://lore.kernel.org/r/20221020141603.2856206-3-guoren@kernel.org -Signed-off-by: Palmer Dabbelt -Signed-off-by: Sasha Levin ---- - arch/riscv/include/asm/smp.h | 3 + - arch/riscv/kernel/machine_kexec.c | 21 ++----- - arch/riscv/kernel/smp.c | 97 ++++++++++++++++++++++++++++++- - 3 files changed, 103 insertions(+), 18 deletions(-) - -diff --git a/arch/riscv/include/asm/smp.h b/arch/riscv/include/asm/smp.h -index d3443be7eedc..3831b638ecab 100644 ---- a/arch/riscv/include/asm/smp.h -+++ b/arch/riscv/include/asm/smp.h -@@ -50,6 +50,9 @@ void riscv_set_ipi_ops(const struct riscv_ipi_ops *ops); - /* Clear IPI for current CPU */ - void riscv_clear_ipi(void); - -+/* Check other CPUs stop or not */ -+bool smp_crash_stop_failed(void); -+ - /* Secondary hart entry */ - asmlinkage void smp_callin(void); - -diff --git a/arch/riscv/kernel/machine_kexec.c b/arch/riscv/kernel/machine_kexec.c -index db41c676e5a2..2d139b724bc8 100644 ---- a/arch/riscv/kernel/machine_kexec.c -+++ b/arch/riscv/kernel/machine_kexec.c -@@ -140,22 +140,6 @@ void machine_shutdown(void) - #endif - } - --/* Override the weak function in kernel/panic.c */ --void crash_smp_send_stop(void) --{ -- static int cpus_stopped; -- -- /* -- * This function can be called twice in panic path, but obviously -- * we execute this only once. -- */ -- if (cpus_stopped) -- return; -- -- smp_send_stop(); -- cpus_stopped = 1; --} -- - static void machine_kexec_mask_interrupts(void) - { - unsigned int i; -@@ -230,6 +214,11 @@ machine_kexec(struct kimage *image) - void *control_code_buffer = page_address(image->control_code_page); - riscv_kexec_method kexec_method = NULL; - -+#ifdef CONFIG_SMP -+ WARN(smp_crash_stop_failed(), -+ "Some CPUs may be stale, kdump will be unreliable.\n"); -+#endif -+ - if (image->type != KEXEC_TYPE_CRASH) - kexec_method = control_code_buffer; - else -diff --git a/arch/riscv/kernel/smp.c b/arch/riscv/kernel/smp.c -index 760a64518c58..8c3b59f1f9b8 100644 ---- a/arch/riscv/kernel/smp.c -+++ b/arch/riscv/kernel/smp.c -@@ -12,6 +12,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -22,11 +23,13 @@ - #include - #include - #include -+#include - - enum ipi_message_type { - IPI_RESCHEDULE, - IPI_CALL_FUNC, - IPI_CPU_STOP, -+ IPI_CPU_CRASH_STOP, - IPI_IRQ_WORK, - IPI_TIMER, - IPI_MAX -@@ -71,6 +74,32 @@ static void ipi_stop(void) - wait_for_interrupt(); - } - -+#ifdef CONFIG_KEXEC_CORE -+static atomic_t waiting_for_crash_ipi = ATOMIC_INIT(0); -+ -+static inline void ipi_cpu_crash_stop(unsigned int cpu, struct pt_regs *regs) -+{ -+ crash_save_cpu(regs, cpu); -+ -+ atomic_dec(&waiting_for_crash_ipi); -+ -+ local_irq_disable(); -+ -+#ifdef CONFIG_HOTPLUG_CPU -+ if (cpu_has_hotplug(cpu)) -+ cpu_ops[cpu]->cpu_stop(); -+#endif -+ -+ for(;;) -+ wait_for_interrupt(); -+} -+#else -+static inline void ipi_cpu_crash_stop(unsigned int cpu, struct pt_regs *regs) -+{ -+ unreachable(); -+} -+#endif -+ - static const struct riscv_ipi_ops *ipi_ops __ro_after_init; - - void riscv_set_ipi_ops(const struct riscv_ipi_ops *ops) -@@ -124,8 +153,9 @@ void arch_irq_work_raise(void) - - void handle_IPI(struct pt_regs *regs) - { -- unsigned long *pending_ipis = &ipi_data[smp_processor_id()].bits; -- unsigned long *stats = ipi_data[smp_processor_id()].stats; -+ unsigned int cpu = smp_processor_id(); -+ unsigned long *pending_ipis = &ipi_data[cpu].bits; -+ unsigned long *stats = ipi_data[cpu].stats; - - riscv_clear_ipi(); - -@@ -154,6 +184,10 @@ void handle_IPI(struct pt_regs *regs) - ipi_stop(); - } - -+ if (ops & (1 << IPI_CPU_CRASH_STOP)) { -+ ipi_cpu_crash_stop(cpu, get_irq_regs()); -+ } -+ - if (ops & (1 << IPI_IRQ_WORK)) { - stats[IPI_IRQ_WORK]++; - irq_work_run(); -@@ -176,6 +210,7 @@ static const char * const ipi_names[] = { - [IPI_RESCHEDULE] = "Rescheduling interrupts", - [IPI_CALL_FUNC] = "Function call interrupts", - [IPI_CPU_STOP] = "CPU stop interrupts", -+ [IPI_CPU_CRASH_STOP] = "CPU stop (for crash dump) interrupts", - [IPI_IRQ_WORK] = "IRQ work interrupts", - [IPI_TIMER] = "Timer broadcast interrupts", - }; -@@ -235,6 +270,64 @@ void smp_send_stop(void) - cpumask_pr_args(cpu_online_mask)); - } - -+#ifdef CONFIG_KEXEC_CORE -+/* -+ * The number of CPUs online, not counting this CPU (which may not be -+ * fully online and so not counted in num_online_cpus()). -+ */ -+static inline unsigned int num_other_online_cpus(void) -+{ -+ unsigned int this_cpu_online = cpu_online(smp_processor_id()); -+ -+ return num_online_cpus() - this_cpu_online; -+} -+ -+void crash_smp_send_stop(void) -+{ -+ static int cpus_stopped; -+ cpumask_t mask; -+ unsigned long timeout; -+ -+ /* -+ * This function can be called twice in panic path, but obviously -+ * we execute this only once. -+ */ -+ if (cpus_stopped) -+ return; -+ -+ cpus_stopped = 1; -+ -+ /* -+ * If this cpu is the only one alive at this point in time, online or -+ * not, there are no stop messages to be sent around, so just back out. -+ */ -+ if (num_other_online_cpus() == 0) -+ return; -+ -+ cpumask_copy(&mask, cpu_online_mask); -+ cpumask_clear_cpu(smp_processor_id(), &mask); -+ -+ atomic_set(&waiting_for_crash_ipi, num_other_online_cpus()); -+ -+ pr_crit("SMP: stopping secondary CPUs\n"); -+ send_ipi_mask(&mask, IPI_CPU_CRASH_STOP); -+ -+ /* Wait up to one second for other CPUs to stop */ -+ timeout = USEC_PER_SEC; -+ while ((atomic_read(&waiting_for_crash_ipi) > 0) && timeout--) -+ udelay(1); -+ -+ if (atomic_read(&waiting_for_crash_ipi) > 0) -+ pr_warn("SMP: failed to stop secondary CPUs %*pbl\n", -+ cpumask_pr_args(&mask)); -+} -+ -+bool smp_crash_stop_failed(void) -+{ -+ return (atomic_read(&waiting_for_crash_ipi) > 0); -+} -+#endif -+ - void smp_send_reschedule(int cpu) - { - send_ipi_single(cpu, IPI_RESCHEDULE); --- -2.35.1 - diff --git a/queue-6.0/series b/queue-6.0/series index 704f88b0f4b..658ce722426 100644 --- a/queue-6.0/series +++ b/queue-6.0/series @@ -104,7 +104,6 @@ pinctrl-single-fix-potential-division-by-zero.patch riscv-sync-efi-page-table-s-kernel-mappings-before-s.patch riscv-fix-race-when-vmap-stack-overflow.patch riscv-kexec-fixup-irq-controller-broken-in-kexec-cra.patch -riscv-kexec-fixup-crash_smp_send_stop-without-multi-.patch nvme-fix-srcu-protection-of-nvme_ns_head-list.patch iommu-vt-d-fix-pci-device-refcount-leak-in-has_exter.patch iommu-vt-d-fix-pci-device-refcount-leak-in-dmar_dev_.patch -- 2.47.3