2019-11-25 11:48:32

by Qais Yousef

[permalink] [raw]
Subject: [PATCH v2 04/14] arm64: hibernate.c: Create a new function to handle cpu_up(sleep_cpu)

In preparation to make cpu_up/down private - move the user in arm64
hibernate.c to use a new generic function that provides what arm64
needs.

Signed-off-by: Qais Yousef <[email protected]>
CC: Catalin Marinas <[email protected]>
CC: Will Deacon <[email protected]>
CC: Steve Capper <[email protected]>
CC: Richard Fontana <[email protected]>
CC: James Morse <[email protected]>
CC: Mark Rutland <[email protected]>
CC: Thomas Gleixner <[email protected]>
CC: Josh Poimboeuf <[email protected]>
CC: Ingo Molnar <[email protected]>
CC: "Peter Zijlstra (Intel)" <[email protected]>
CC: Nicholas Piggin <[email protected]>
CC: Daniel Lezcano <[email protected]>
CC: Jiri Kosina <[email protected]>
CC: Pavankumar Kondeti <[email protected]>
CC: Zhenzhong Duan <[email protected]>
CC: [email protected]
CC: [email protected]
---
arch/arm64/kernel/hibernate.c | 13 +++++--------
include/linux/cpu.h | 1 +
kernel/cpu.c | 24 ++++++++++++++++++++++++
3 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c
index a96b2921d22c..8ae348107f97 100644
--- a/arch/arm64/kernel/hibernate.c
+++ b/arch/arm64/kernel/hibernate.c
@@ -166,14 +166,11 @@ int arch_hibernation_header_restore(void *addr)
sleep_cpu = -EINVAL;
return -EINVAL;
}
- if (!cpu_online(sleep_cpu)) {
- pr_info("Hibernated on a CPU that is offline! Bringing CPU up.\n");
- ret = cpu_up(sleep_cpu);
- if (ret) {
- pr_err("Failed to bring hibernate-CPU up!\n");
- sleep_cpu = -EINVAL;
- return ret;
- }
+
+ ret = bringup_hibernate_cpu(sleep_cpu);
+ if (ret) {
+ sleep_cpu = -EINVAL;
+ return ret;
}

resume_hdr = *hdr;
diff --git a/include/linux/cpu.h b/include/linux/cpu.h
index 8229932fb053..f05168b49fab 100644
--- a/include/linux/cpu.h
+++ b/include/linux/cpu.h
@@ -92,6 +92,7 @@ int cpu_up(unsigned int cpu);
void notify_cpu_starting(unsigned int cpu);
extern void cpu_maps_update_begin(void);
extern void cpu_maps_update_done(void);
+extern int bringup_hibernate_cpu(unsigned int sleep_cpu);

#else /* CONFIG_SMP */
#define cpuhp_tasks_frozen 0
diff --git a/kernel/cpu.c b/kernel/cpu.c
index 94055a0d989e..9610442c8dbc 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -1221,6 +1221,30 @@ int cpu_up(unsigned int cpu)
}
EXPORT_SYMBOL_GPL(cpu_up);

+/**
+ * bringup_hibernate_cpu - Bring up the CPU that we hibernated on
+ * @sleep_cpu: The cpu we hibernated on and should be brought up.
+ *
+ * On some archs like arm64, we can hibernate on any CPU, but on wake up the
+ * CPU we hibernated on might be offline as a side effect of using maxcpus= for
+ * example.
+ */
+int bringup_hibernate_cpu(unsigned int sleep_cpu)
+{
+ int ret;
+
+ if (!cpu_online(sleep_cpu)) {
+ pr_info("Hibernated on a CPU that is offline! Bringing CPU up.\n");
+ ret = cpu_up(sleep_cpu);
+ if (ret) {
+ pr_err("Failed to bring hibernate-CPU up!\n");
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
#ifdef CONFIG_PM_SLEEP_SMP
static cpumask_var_t frozen_cpus;

--
2.17.1