diff mbox

[v17,02/13] arm64: Add cpus_are_stuck_in_kernel

Message ID d4f8c7961adc4b0afe733306fbc21e5bb7c8f6ee.1464974516.git.geoff@infradead.org (mailing list archive)
State New, archived
Headers show

Commit Message

Geoff Levand June 3, 2016, 6:13 p.m. UTC
From: James Morse <james.morse@arm.com>

kernel/smp.c has a fancy counter that keeps track of the number of CPUs
it marked as not-present and left in cpu_park_loop(). If there are any
CPUs spinning in here, kexec will release them once the memory is re-used
by the new kernel.

We can't return an error once we reach machine_kexec(), so as a sanity check
we forbid kexec images to be loaded if there are already cpus stuck in the
kernel, or we have multiple cpus and no way of disabling them.

Signed-off-by: James Morse <james.morse@arm.com>
[Split off from a larger patch]
Signed-off-by: Geoff Levand <geoff@infradead.org>
---
 arch/arm64/include/asm/smp.h | 10 ++++++++++
 arch/arm64/kernel/smp.c      |  5 +++++
 2 files changed, 15 insertions(+)

Comments

James Morse June 9, 2016, 2:51 p.m. UTC | #1
Hi Geoff,

On 03/06/16 19:13, Geoff Levand wrote:
> From: James Morse <james.morse@arm.com>
> 
> kernel/smp.c has a fancy counter that keeps track of the number of CPUs
> it marked as not-present and left in cpu_park_loop(). If there are any
> CPUs spinning in here, kexec will release them once the memory is re-used
> by the new kernel.
> 
> We can't return an error once we reach machine_kexec(), so as a sanity check
> we forbid kexec images to be loaded if there are already cpus stuck in the
> kernel, or we have multiple cpus and no way of disabling them.
> 
> Signed-off-by: James Morse <james.morse@arm.com>
> [Split off from a larger patch]
> Signed-off-by: Geoff Levand <geoff@infradead.org>

Post-split, the second paragraph of the commit message is out of place, and
doesn't describe what the patch does. Can I suggest replacing it with:

> Provide a function to expose whether this counter is non-zero, so we can use >
this when loading a new kexec image, and when calling machine_kexec().


Thanks,

James
Geoff Levand June 9, 2016, 6:38 p.m. UTC | #2
On Thu, 2016-06-09 at 15:51 +0100, James Morse wrote:

> Post-split, the second paragraph of the commit message is out of
> place, and
> doesn't describe what the patch does. Can I suggest replacing it
> with:

Changed, thanks.

-Geoff
diff mbox

Patch

diff --git a/arch/arm64/include/asm/smp.h b/arch/arm64/include/asm/smp.h
index 433e504..38712f4 100644
--- a/arch/arm64/include/asm/smp.h
+++ b/arch/arm64/include/asm/smp.h
@@ -124,6 +124,16 @@  static inline void cpu_panic_kernel(void)
 	cpu_park_loop();
 }
 
+/*
+ * If a secondary CPU fails to come online, (e.g. due to mismatched features),
+ * it will try to call cpu_die(). If this fails, it updates
+ * cpus_stuck_in_kernel and sits in cpu_park_loop().
+ *
+ * Kexec checks this counter and refuses to load/kexec if it is non-zero, as
+ * cpu_park_loop() would be overwritten releasing the parked cpus.
+ */
+bool cpus_are_stuck_in_kernel(void);
+
 #endif /* ifndef __ASSEMBLY__ */
 
 #endif /* ifndef __ASM_SMP_H */
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index 678e084..d0bcd55 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -909,3 +909,8 @@  int setup_profiling_timer(unsigned int multiplier)
 {
 	return -EINVAL;
 }
+
+bool cpus_are_stuck_in_kernel(void)
+{
+	return !!cpus_stuck_in_kernel;
+}