From: Johannes Berg <johannes@sipsolutions.net>
To: linuxppc-dev@ozlabs.org
Cc: linux-pm@lists.osdl.org
Subject: [PATCH 02/12] powermac: support G5 CPU hotplug
Date: Wed, 07 Feb 2007 13:45:38 +0100 [thread overview]
Message-ID: <20070207124610.392302000@sipsolutions.net> (raw)
In-Reply-To: 20070207124536.963531000@sipsolutions.net
[-- Attachment #1: powermac-g5-cpu-offline.patch --]
[-- Type: text/plain, Size: 3807 bytes --]
This patch allows "hotplugging" of CPUs on G5 machines. CPUs that are
disabled are put into an idle loop with interrupts hard-disabled, to wake
them up again we kick them just like when bringing them up.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
Except for the in-irq count hack I'm happy with this. I still haven't found
where the in-hard-irq count is set to 1 in the down path during suspend or
resume and other platforms do similar things so I'm inclined to leave this.
--- linux-2.6-git.orig/arch/powerpc/platforms/powermac/smp.c 2007-02-07 02:55:05.657884289 +0100
+++ linux-2.6-git/arch/powerpc/platforms/powermac/smp.c 2007-02-07 02:55:27.352884289 +0100
@@ -898,7 +898,7 @@ void smp_core99_cpu_die(unsigned int cpu
cpu_dead[cpu] = 0;
}
-#endif
+#endif /* CONFIG_HOTPLUG_CPU && CONFIG_PP32 */
/* Core99 Macs (dual G4s and G5s) */
struct smp_ops_t core99_smp_ops = {
@@ -908,8 +908,16 @@ struct smp_ops_t core99_smp_ops = {
.setup_cpu = smp_core99_setup_cpu,
.give_timebase = smp_core99_give_timebase,
.take_timebase = smp_core99_take_timebase,
-#if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PPC32)
+#if defined(CONFIG_HOTPLUG_CPU)
+# if defined(CONFIG_PPC32)
.cpu_disable = smp_core99_cpu_disable,
.cpu_die = smp_core99_cpu_die,
+# endif
+# if defined(CONFIG_PPC64)
+ .cpu_disable = generic_cpu_disable,
+ .cpu_die = generic_cpu_die,
+ /* intentionally do *NOT* assign cpu_enable,
+ * the generic code will use kick_cpu then! */
+# endif
#endif
};
--- linux-2.6-git.orig/arch/powerpc/platforms/powermac/setup.c 2007-02-07 02:55:23.435884289 +0100
+++ linux-2.6-git/arch/powerpc/platforms/powermac/setup.c 2007-02-07 02:55:27.388884289 +0100
@@ -490,6 +490,9 @@ static int pmac_late_init(void)
#ifdef CONFIG_SOFTWARE_SUSPEND
pm_set_ops(&pmac_pm_ops);
#endif /* CONFIG_SOFTWARE_SUSPEND */
+ /* this is udbg (which is __init) and we can later use it during
+ * cpu hotplug (in smp_core99_kick_cpu) */
+ ppc_md.progress = NULL;
return 0;
}
@@ -716,6 +719,39 @@ static int pmac_pci_probe_mode(struct pc
return PCI_PROBE_NORMAL;
return PCI_PROBE_DEVTREE;
}
+
+#ifdef CONFIG_HOTPLUG_CPU
+/* access per cpu vars from generic smp.c */
+DECLARE_PER_CPU(int, cpu_state);
+
+static void pmac_cpu_die(void)
+{
+ /* turn off as much as possible, we'll be
+ * kicked out as this will only be invoked
+ * on core99 platforms for now ... */
+ hard_irq_disable();
+
+ printk(KERN_INFO "CPU#%d offline\n", smp_processor_id());
+ __get_cpu_var(cpu_state) = CPU_DEAD;
+ smp_wmb();
+
+ /* during the path that leads here preemption is disabled,
+ * reenable it now so that when coming up preempt count is
+ * zero correctly */
+ preempt_enable();
+
+ while (1) {
+ ppc64_runlatch_off();
+ if (ppc_md.power_save) {
+ ppc_md.power_save();
+ } else {
+ HMT_low();
+ HMT_very_low();
+ }
+ }
+}
+#endif
+
#endif
static void __init pmac_init_irq(void)
@@ -769,6 +805,6 @@ define_machine(powermac) {
.phys_mem_access_prot = pci_phys_mem_access_prot,
#endif
#if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PPC64)
- .cpu_die = generic_mach_cpu_die,
+ .cpu_die = pmac_cpu_die,
#endif
};
--- linux-2.6-git.orig/arch/powerpc/kernel/smp.c 2007-02-07 02:55:06.111884289 +0100
+++ linux-2.6-git/arch/powerpc/kernel/smp.c 2007-02-07 02:55:27.439884289 +0100
@@ -558,6 +558,11 @@ int __devinit start_secondary(void *unus
local_irq_enable();
+ /* it seems to be possible that we died from within
+ * an interrupt ... reset the in-irq counts */
+ task_thread_info(paca[cpu].__current)->preempt_count &=
+ ~(SOFTIRQ_MASK|HARDIRQ_MASK);
+
cpu_idle();
return 0;
}
--
WARNING: multiple messages have this Message-ID (diff)
From: Johannes Berg <johannes@sipsolutions.net>
To: linuxppc-dev@ozlabs.org
Cc: linux-pm@lists.osdl.org
Subject: [PATCH 02/12] powermac: support G5 CPU hotplug
Date: Wed, 07 Feb 2007 13:45:38 +0100 [thread overview]
Message-ID: <20070207124610.392302000@sipsolutions.net> (raw)
In-Reply-To: 20070207124536.963531000@sipsolutions.net
This patch allows "hotplugging" of CPUs on G5 machines. CPUs that are
disabled are put into an idle loop with interrupts hard-disabled, to wake
them up again we kick them just like when bringing them up.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
Except for the in-irq count hack I'm happy with this. I still haven't found
where the in-hard-irq count is set to 1 in the down path during suspend or
resume and other platforms do similar things so I'm inclined to leave this.
--- linux-2.6-git.orig/arch/powerpc/platforms/powermac/smp.c 2007-02-07 02:55:05.657884289 +0100
+++ linux-2.6-git/arch/powerpc/platforms/powermac/smp.c 2007-02-07 02:55:27.352884289 +0100
@@ -898,7 +898,7 @@ void smp_core99_cpu_die(unsigned int cpu
cpu_dead[cpu] = 0;
}
-#endif
+#endif /* CONFIG_HOTPLUG_CPU && CONFIG_PP32 */
/* Core99 Macs (dual G4s and G5s) */
struct smp_ops_t core99_smp_ops = {
@@ -908,8 +908,16 @@ struct smp_ops_t core99_smp_ops = {
.setup_cpu = smp_core99_setup_cpu,
.give_timebase = smp_core99_give_timebase,
.take_timebase = smp_core99_take_timebase,
-#if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PPC32)
+#if defined(CONFIG_HOTPLUG_CPU)
+# if defined(CONFIG_PPC32)
.cpu_disable = smp_core99_cpu_disable,
.cpu_die = smp_core99_cpu_die,
+# endif
+# if defined(CONFIG_PPC64)
+ .cpu_disable = generic_cpu_disable,
+ .cpu_die = generic_cpu_die,
+ /* intentionally do *NOT* assign cpu_enable,
+ * the generic code will use kick_cpu then! */
+# endif
#endif
};
--- linux-2.6-git.orig/arch/powerpc/platforms/powermac/setup.c 2007-02-07 02:55:23.435884289 +0100
+++ linux-2.6-git/arch/powerpc/platforms/powermac/setup.c 2007-02-07 02:55:27.388884289 +0100
@@ -490,6 +490,9 @@ static int pmac_late_init(void)
#ifdef CONFIG_SOFTWARE_SUSPEND
pm_set_ops(&pmac_pm_ops);
#endif /* CONFIG_SOFTWARE_SUSPEND */
+ /* this is udbg (which is __init) and we can later use it during
+ * cpu hotplug (in smp_core99_kick_cpu) */
+ ppc_md.progress = NULL;
return 0;
}
@@ -716,6 +719,39 @@ static int pmac_pci_probe_mode(struct pc
return PCI_PROBE_NORMAL;
return PCI_PROBE_DEVTREE;
}
+
+#ifdef CONFIG_HOTPLUG_CPU
+/* access per cpu vars from generic smp.c */
+DECLARE_PER_CPU(int, cpu_state);
+
+static void pmac_cpu_die(void)
+{
+ /* turn off as much as possible, we'll be
+ * kicked out as this will only be invoked
+ * on core99 platforms for now ... */
+ hard_irq_disable();
+
+ printk(KERN_INFO "CPU#%d offline\n", smp_processor_id());
+ __get_cpu_var(cpu_state) = CPU_DEAD;
+ smp_wmb();
+
+ /* during the path that leads here preemption is disabled,
+ * reenable it now so that when coming up preempt count is
+ * zero correctly */
+ preempt_enable();
+
+ while (1) {
+ ppc64_runlatch_off();
+ if (ppc_md.power_save) {
+ ppc_md.power_save();
+ } else {
+ HMT_low();
+ HMT_very_low();
+ }
+ }
+}
+#endif
+
#endif
static void __init pmac_init_irq(void)
@@ -769,6 +805,6 @@ define_machine(powermac) {
.phys_mem_access_prot = pci_phys_mem_access_prot,
#endif
#if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PPC64)
- .cpu_die = generic_mach_cpu_die,
+ .cpu_die = pmac_cpu_die,
#endif
};
--- linux-2.6-git.orig/arch/powerpc/kernel/smp.c 2007-02-07 02:55:06.111884289 +0100
+++ linux-2.6-git/arch/powerpc/kernel/smp.c 2007-02-07 02:55:27.439884289 +0100
@@ -558,6 +558,11 @@ int __devinit start_secondary(void *unus
local_irq_enable();
+ /* it seems to be possible that we died from within
+ * an interrupt ... reset the in-irq counts */
+ task_thread_info(paca[cpu].__current)->preempt_count &=
+ ~(SOFTIRQ_MASK|HARDIRQ_MASK);
+
cpu_idle();
return 0;
}
--
next prev parent reply other threads:[~2007-02-07 12:45 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-07 12:45 [PATCH 00/12] powerpc/powermac power management patches Johannes Berg
2007-02-07 12:45 ` [PATCH 01/12] powerpc: MPIC sys_device & suspend/resume Johannes Berg
2007-02-07 12:45 ` Johannes Berg
2007-02-07 12:45 ` Johannes Berg [this message]
2007-02-07 12:45 ` [PATCH 02/12] powermac: support G5 CPU hotplug Johannes Berg
2007-02-08 13:14 ` Johannes Berg
2007-02-08 13:14 ` Johannes Berg
2007-02-08 13:28 ` Johannes Berg
2007-02-08 15:38 ` Johannes Berg
2007-02-08 15:38 ` Johannes Berg
2007-02-08 21:59 ` Paul Mackerras
2007-02-08 21:59 ` [linux-pm] " Paul Mackerras
2007-02-08 22:33 ` Benjamin Herrenschmidt
2007-02-08 22:33 ` [linux-pm] " Benjamin Herrenschmidt
2007-02-09 15:39 ` Johannes Berg
2007-02-09 15:39 ` [linux-pm] " Johannes Berg
2007-02-08 22:24 ` Benjamin Herrenschmidt
2007-02-08 22:24 ` Benjamin Herrenschmidt
2007-02-09 15:36 ` Johannes Berg
2007-02-09 15:36 ` Johannes Berg
2007-02-12 15:15 ` Johannes Berg
2007-02-15 3:44 ` Paul Mackerras
2007-02-15 15:08 ` Johannes Berg
2007-02-15 15:08 ` Johannes Berg
2007-02-15 19:43 ` Johannes Berg
2007-02-14 14:45 ` Pavel Machek
2007-02-14 14:45 ` [linux-pm] " Pavel Machek
2007-02-14 19:11 ` Johannes Berg
2007-02-14 19:11 ` [linux-pm] " Johannes Berg
2007-02-14 21:27 ` Benjamin Herrenschmidt
2007-02-14 21:27 ` [linux-pm] " Benjamin Herrenschmidt
2007-02-07 12:45 ` [PATCH 03/12] powerpc: dart iommu suspend Johannes Berg
2007-02-07 12:45 ` Johannes Berg
2007-02-07 12:45 ` [PATCH 04/12] powerpc: mark pages that dont exist as Nosave Johannes Berg
2007-02-07 12:45 ` Johannes Berg
2007-02-07 12:45 ` [PATCH 05/12] power management: no valid states w/o pm_ops + docs Johannes Berg
2007-02-07 12:45 ` Johannes Berg
2007-02-13 12:12 ` Pavel Machek
2007-02-13 12:12 ` Pavel Machek
2007-02-13 16:08 ` Johannes Berg
2007-02-13 16:08 ` Johannes Berg
2007-02-13 16:14 ` Pavel Machek
2007-02-13 16:14 ` Pavel Machek
2007-02-07 12:45 ` [PATCH 06/12] powerpc: fix suspend states again Johannes Berg
2007-02-07 12:45 ` Johannes Berg
2007-02-07 12:45 ` [PATCH 07/12] powermac: suspend to disk on G5 Johannes Berg
2007-02-07 12:45 ` Johannes Berg
2007-02-07 12:45 ` [PATCH 08/12] powermac: fix G5-cpufreq for cpu on/offline Johannes Berg
2007-02-07 12:45 ` Johannes Berg
2007-02-07 12:45 ` [PATCH 09/12] powerpc: remove bogus comment about page_is_ram Johannes Berg
2007-02-07 12:45 ` Johannes Berg
2007-02-07 12:45 ` [PATCH 10/12] powerpc: remove unneeded exports in mem.c Johannes Berg
2007-02-07 12:45 ` Johannes Berg
2007-02-08 4:25 ` Paul Mackerras
2007-02-08 13:10 ` Johannes Berg
2007-02-08 13:10 ` Johannes Berg
2007-02-08 13:27 ` [PATCH 10/12] powerpc: remove unneeded page_is_ram export Johannes Berg
2007-02-07 12:45 ` [PATCH 11/12] powermac: disallow pmu sleep notifiers from aborting sleep Johannes Berg
2007-02-07 12:45 ` Johannes Berg
2007-02-07 22:52 ` Andreas Schwab
2007-02-08 13:08 ` Johannes Berg
2007-02-08 13:08 ` Johannes Berg
2007-02-08 13:16 ` Johannes Berg
2007-02-08 13:16 ` Johannes Berg
2007-02-07 12:45 ` [PATCH 12/12] powermac: proper sleep management Johannes Berg
2007-02-07 12:45 ` Johannes Berg
2007-02-08 13:16 ` [PATCH 13/12] mpic: add affinity callback for IPI "chip" Johannes Berg
2007-02-08 21:14 ` Benjamin Herrenschmidt
2007-02-09 15:41 ` Johannes Berg
2007-02-09 15:41 ` Johannes Berg
2007-02-12 15:20 ` [PATCH 13/12] mpic: set IPIs to be per-CPU Johannes Berg
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=20070207124610.392302000@sipsolutions.net \
--to=johannes@sipsolutions.net \
--cc=linux-pm@lists.osdl.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.