From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: linuxppc-dev@ozlabs.org
Subject: [PATCH 14/18] powerpc/pmac/smp: Fix CPU hotplug crashes on some machines
Date: Tue, 8 Mar 2011 17:37:26 +1100 [thread overview]
Message-ID: <1299566250-10516-15-git-send-email-benh@kernel.crashing.org> (raw)
In-Reply-To: <1299566250-10516-1-git-send-email-benh@kernel.crashing.org>
On some machines that use i2c to synchronize the timebases (such
as PowerMac7,2/7,3 G5 machines), hotplug CPU would crash when
putting back a new CPU online due to the underlying i2c bus being
closed.
This uses the newly added bringup_done() callback to move the close
along with other housekeeping calls, and adds a CPU notifier to
re-open the i2c bus around subsequent hotplug operations
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
arch/powerpc/platforms/powermac/smp.c | 71 +++++++++++++++++++++++++-------
1 files changed, 55 insertions(+), 16 deletions(-)
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c
index 837989e..74a43c6 100644
--- a/arch/powerpc/platforms/powermac/smp.c
+++ b/arch/powerpc/platforms/powermac/smp.c
@@ -840,30 +840,68 @@ static void __devinit smp_core99_setup_cpu(int cpu_nr)
/* Setup openpic */
mpic_setup_this_cpu();
+}
- if (cpu_nr == 0) {
-#ifdef CONFIG_PPC64
- extern void g5_phy_disable_cpu1(void);
+#ifdef CONFIG_HOTPLUG_CPU
+static int smp_core99_cpu_notify(struct notifier_block *self,
+ unsigned long action, void *hcpu)
+{
+ int rc;
- /* Close i2c bus if it was used for tb sync */
+ switch(action) {
+ case CPU_UP_PREPARE:
+ case CPU_UP_PREPARE_FROZEN:
+ /* Open i2c bus if it was used for tb sync */
if (pmac_tb_clock_chip_host) {
- pmac_i2c_close(pmac_tb_clock_chip_host);
- pmac_tb_clock_chip_host = NULL;
+ rc = pmac_i2c_open(pmac_tb_clock_chip_host, 1);
+ if (rc) {
+ pr_err("Failed to open i2c bus for time sync\n");
+ return notifier_from_errno(rc);
+ }
}
+ break;
+ case CPU_ONLINE:
+ case CPU_UP_CANCELED:
+ /* Close i2c bus if it was used for tb sync */
+ if (pmac_tb_clock_chip_host)
+ pmac_i2c_close(pmac_tb_clock_chip_host);
+ break;
+ default:
+ break;
+ }
+ return NOTIFY_OK;
+}
- /* If we didn't start the second CPU, we must take
- * it off the bus
- */
- if (of_machine_is_compatible("MacRISC4") &&
- num_online_cpus() < 2)
- g5_phy_disable_cpu1();
-#endif /* CONFIG_PPC64 */
+static struct notifier_block __cpuinitdata smp_core99_cpu_nb = {
+ .notifier_call = smp_core99_cpu_notify,
+};
+#endif /* CONFIG_HOTPLUG_CPU */
- if (ppc_md.progress)
- ppc_md.progress("core99_setup_cpu 0 done", 0x349);
+static void __init smp_core99_bringup_done(void)
+{
+#ifdef CONFIG_PPC64
+ extern void g5_phy_disable_cpu1(void);
+
+ /* Close i2c bus if it was used for tb sync */
+ if (pmac_tb_clock_chip_host)
+ pmac_i2c_close(pmac_tb_clock_chip_host);
+
+ /* If we didn't start the second CPU, we must take
+ * it off the bus.
+ */
+ if (of_machine_is_compatible("MacRISC4") &&
+ num_online_cpus() < 2) {
+ set_cpu_present(1, false);
+ g5_phy_disable_cpu1();
}
-}
+#endif /* CONFIG_PPC64 */
+#ifdef CONFIG_HOTPLUG_CPU
+ register_cpu_notifier(&smp_core99_cpu_nb);
+#endif
+ if (ppc_md.progress)
+ ppc_md.progress("smp_core99_bringup_done", 0x349);
+}
#ifdef CONFIG_HOTPLUG_CPU
@@ -940,6 +978,7 @@ static void pmac_cpu_die(void)
struct smp_ops_t core99_smp_ops = {
.message_pass = smp_mpic_message_pass,
.probe = smp_core99_probe,
+ .bringup_done = smp_core99_bringup_done,
.kick_cpu = smp_core99_kick_cpu,
.setup_cpu = smp_core99_setup_cpu,
.give_timebase = smp_core99_give_timebase,
--
1.7.1
next prev parent reply other threads:[~2011-03-08 6:37 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-08 6:37 [PATCHES] powerpc: Cleanup and fix CPU hotplug Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 01/18] powerpc: Make decrementer interrupt robust against offlined CPUs Benjamin Herrenschmidt
2011-03-10 8:01 ` Michael Ellerman
2011-03-08 6:37 ` [PATCH 02/18] powerpc/smp: soft-replugged CPUs must go back to start_secondary Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 03/18] powerpc/smp: Fix generic_mach_cpu_die() Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 04/18] powerpc/smp: Remove unused generic_cpu_enable() Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 05/18] powerpc/smp: Remove unused smp_ops->cpu_enable() Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 06/18] powerpc/pmac/smp: Fix 32-bit PowerMac cpu_die Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 07/18] powerpc/pmac/smp: Rename fixup_irqs() to migrate_irqs() and use it on ppc32 Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 08/18] powerpc/pmac/smp: Fixup smp_core99_cpu_disable() and use it on 64-bit Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 09/18] powerpc/pmac/smp: Consolidate 32-bit and 64-bit PowerMac cpu_die in one file Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 10/18] powerpc/pmac/smp: Remove HMT changes for PowerMac offline code Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 11/18] powerpc/pmac/smp: Properly NAP offlined CPU on G5 Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 12/18] powerpc/pmac: Rename cpu_state in therm_pm72 to avoid collision Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 13/18] powerpc/smp: Add a smp_ops->bringup_up() done callback Benjamin Herrenschmidt
2011-03-08 6:37 ` Benjamin Herrenschmidt [this message]
2011-03-08 6:37 ` [PATCH 15/18] powerpc/smp: Don't expose per-cpu "cpu_state" array Benjamin Herrenschmidt
2011-03-29 5:37 ` Michael Ellerman
2011-03-29 8:13 ` Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 16/18] powerpc/smp: Create idle threads on demand and properly reset them Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 17/18] powerpc/smp: Increase vdso_data->processorCount, not just decrease it Benjamin Herrenschmidt
2011-03-10 3:41 ` Michael Ellerman
2011-03-10 3:46 ` Benjamin Herrenschmidt
2011-03-08 6:37 ` [PATCH 18/18] powerpc/pmac/smp: Remove no-longer needed preempt workaround Benjamin Herrenschmidt
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=1299566250-10516-15-git-send-email-benh@kernel.crashing.org \
--to=benh@kernel.crashing.org \
--cc=linuxppc-dev@ozlabs.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.