From: Pingfan Liu <kernelfans@gmail.com>
To: kexec@lists.infradead.org
Subject: [PATCH] kexec: disable cpu hotplug until the rebooting cpu is stable
Date: Tue, 25 Jan 2022 11:39:13 +0800 [thread overview]
Message-ID: <20220125033913.15374-1-kernelfans@gmail.com> (raw)
The following identical code piece appears in both
migrate_to_reboot_cpu() and smp_shutdown_nonboot_cpus():
if (!cpu_online(primary_cpu))
primary_cpu = cpumask_first(cpu_online_mask);
Although the kexec-reboot task can get through a cpu_down() on its cpu,
this code looks a little confusing.
Make things straight forward by keep cpu hotplug disabled until
smp_shutdown_nonboot_cpus() holds cpu_add_remove_lock. By this way, the
rebooting cpu can keep unchanged.
Signed-off-by: Pingfan Liu <kernelfans@gmail.com>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Valentin Schneider <valentin.schneider@arm.com>
Cc: Vincent Donnefort <vincent.donnefort@arm.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: YueHaibing <yuehaibing@huawei.com>
Cc: Baokun Li <libaokun1@huawei.com>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: kexec at lists.infradead.org
To: linux-kernel@vger.kernel.org
---
kernel/cpu.c | 16 ++++++++++------
kernel/kexec_core.c | 10 ++++------
2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/kernel/cpu.c b/kernel/cpu.c
index 407a2568f35e..bc687d59ca90 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -1227,20 +1227,24 @@ int remove_cpu(unsigned int cpu)
}
EXPORT_SYMBOL_GPL(remove_cpu);
+/* primary_cpu keeps unchanged after migrate_to_reboot_cpu() */
void smp_shutdown_nonboot_cpus(unsigned int primary_cpu)
{
unsigned int cpu;
int error;
+ /*
+ * Block other cpu hotplug event, so primary_cpu is always online if
+ * it is not touched by us
+ */
cpu_maps_update_begin();
-
/*
- * Make certain the cpu I'm about to reboot on is online.
- *
- * This is inline to what migrate_to_reboot_cpu() already do.
+ * migrate_to_reboot_cpu() disables CPU hotplug assuming that
+ * no further code needs to use CPU hotplug (which is true in
+ * the reboot case). However, the kexec path depends on using
+ * CPU hotplug again; so re-enable it here.
*/
- if (!cpu_online(primary_cpu))
- primary_cpu = cpumask_first(cpu_online_mask);
+ __cpu_hotplug_enable();
for_each_online_cpu(cpu) {
if (cpu == primary_cpu)
diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
index 68480f731192..db4fa6b174e3 100644
--- a/kernel/kexec_core.c
+++ b/kernel/kexec_core.c
@@ -1168,14 +1168,12 @@ int kernel_kexec(void)
kexec_in_progress = true;
kernel_restart_prepare("kexec reboot");
migrate_to_reboot_cpu();
-
/*
- * migrate_to_reboot_cpu() disables CPU hotplug assuming that
- * no further code needs to use CPU hotplug (which is true in
- * the reboot case). However, the kexec path depends on using
- * CPU hotplug again; so re-enable it here.
+ * migrate_to_reboot_cpu() disables CPU hotplug. If an arch
+ * relies on the cpu teardown to achieve reboot, it needs to
+ * re-enable CPU hotplug there.
*/
- cpu_hotplug_enable();
+
pr_notice("Starting new kernel\n");
machine_shutdown();
}
--
2.31.1
next reply other threads:[~2022-01-25 3:39 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-25 3:39 Pingfan Liu [this message]
2022-01-25 16:29 ` [PATCH] kexec: disable cpu hotplug until the rebooting cpu is stable Valentin Schneider
2022-01-26 2:45 ` Pingfan Liu
2022-01-26 15:06 ` Valentin Schneider
2022-01-27 8:44 ` Pingfan Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220125033913.15374-1-kernelfans@gmail.com \
--to=kernelfans@gmail.com \
--cc=kexec@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.