From: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
To: linux-ia64@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Vivek Goyal <vgoyal@redhat.com>, Haren Myneni <hbabu@us.ibm.com>,
kexec@lists.infradead.org
Subject: [PATCH 5/7] ia64, kdump: Mask INIT first in panic-kdump path
Date: Thu, 18 Jun 2009 15:50:49 +0900 [thread overview]
Message-ID: <4A39E3C9.2040906@jp.fujitsu.com> (raw)
In-Reply-To: <4A39E247.4030908@jp.fujitsu.com>
This is a fix for races on Panic and INIT.
Asserting INIT might not invoke 2nd kdump if the system is going to start
1st kdump via panic and some of cpus are already playing dead with INIT
masked. It can be assumed that an internal agent decides to panic the
unstable system while another external agent decides to send an INIT to
the system at same time.
So mask INIT first in panic path to take the initiative on kdump.
All INITs later should be used only for freezing all other cpus.
Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Haren Myneni <hbabu@us.ibm.com>
Cc: kexec@lists.infradead.org
---
arch/ia64/kernel/crash.c | 47 ++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 41 insertions(+), 6 deletions(-)
diff --git a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c
index eacedfc..1440445 100644
--- a/arch/ia64/kernel/crash.c
+++ b/arch/ia64/kernel/crash.c
@@ -23,6 +23,7 @@
int kdump_status[NR_CPUS];
static atomic_t kdump_cpu_frozen;
atomic_t kdump_in_progress;
+static int kdump_freeze_monarch;
static int kdump_on_init = 1;
static int kdump_on_fatal_mca = 1;
@@ -110,6 +111,33 @@ machine_crash_shutdown(struct pt_regs *pt)
*/
kexec_disable_iosapic();
#ifdef CONFIG_SMP
+ /*
+ * If kdump_on_init is set and an INIT is assered here, kdump will
+ * be started again via INIT monarch.
+ */
+ local_irq_disable();
+ ia64_set_psr_mc(); /* mask MCA/INIT */
+ if (atomic_inc_return(&kdump_in_progress) != 1)
+ unw_init_running(kdump_cpu_freeze, NULL);
+
+ /*
+ * Now this cpu is ready for kdump.
+ * Stop all others by IPI or INIT. They could receive INIT from
+ * outside and might be INIT monarch, but only thing they have to
+ * do is falling into kdump_cpu_freeze().
+ *
+ * If an INIT is asserted here:
+ * - All receivers might be slaves, since some of cpus could already
+ * be frozen and INIT might be masked on monarch. In this case,
+ * all slaves will park in while (monarch_cpu == -1) loop before
+ * DIE_INIT_SLAVE_ENTER that for waiting monarch enters.
+ * => TBD: freeze all slaves
+ * - One might be a monarch, but INIT rendezvous will fail since
+ * at least this cpu already have INIT masked so it never join
+ * to the rendezvous. In this case, all slaves and monarch will
+ * be frozen after timeout of the INIT rendezvous.
+ * => TBD: freeze them without waiting timeout
+ */
kdump_smp_send_stop();
/* not all cpu response to IPI, send INIT to freeze them */
if (kdump_wait_cpu_freeze() && kdump_on_init) {
@@ -179,13 +207,18 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
switch (val) {
case DIE_INIT_MONARCH_PROCESS:
if (kdump_on_init) {
- atomic_set(&kdump_in_progress, 1);
+ if (atomic_inc_return(&kdump_in_progress) != 1)
+ kdump_freeze_monarch = 1;
*(nd->monarch_cpu) = -1;
}
break;
case DIE_INIT_MONARCH_LEAVE:
- if (kdump_on_init)
- machine_kdump_on_init();
+ if (kdump_on_init) {
+ if (kdump_freeze_monarch)
+ unw_init_running(kdump_cpu_freeze, NULL);
+ else
+ machine_kdump_on_init();
+ }
break;
case DIE_INIT_SLAVE_LEAVE:
if (atomic_read(&kdump_in_progress))
@@ -198,9 +231,11 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
case DIE_MCA_MONARCH_LEAVE:
/* *(nd->data) indicate if MCA is recoverable */
if (kdump_on_fatal_mca && !(*(nd->data))) {
- atomic_set(&kdump_in_progress, 1);
- *(nd->monarch_cpu) = -1;
- machine_kdump_on_init();
+ if (atomic_inc_return(&kdump_in_progress) == 1) {
+ *(nd->monarch_cpu) = -1;
+ machine_kdump_on_init();
+ }
+ /* We got fatal MCA while kdump!? No way!! */
}
break;
}
--
1.6.0
next prev parent reply other threads:[~2009-06-18 6:51 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-18 6:44 [PATCH 0/7] Patches for kdump vs. INIT Hidetoshi Seto
2009-06-18 6:46 ` [PATCH 1/7] ia64, kdump: Mask MCA/INIT on freezing cpus Hidetoshi Seto
2009-06-22 13:45 ` Robin Holt
2009-06-23 0:33 ` Hidetoshi Seto
2009-06-23 5:55 ` Robin Holt
2009-06-23 8:07 ` Hidetoshi Seto
2009-06-24 11:14 ` Robin Holt
2009-06-25 2:15 ` Hidetoshi Seto
2009-06-25 3:29 ` Robin Holt
2009-06-18 6:48 ` [PATCH 2/7] ia64, kexec: Make INIT safe while kdump/kexec Hidetoshi Seto
2009-06-18 6:48 ` [PATCH 3/7] ia64, kexec: Unregister MCA handler before kexec Hidetoshi Seto
2009-06-18 6:49 ` [PATCH 4/7] ia64, kdump: Don't offline APs Hidetoshi Seto
2009-06-18 6:50 ` Hidetoshi Seto [this message]
2009-06-18 6:51 ` [PATCH 6/7] ia64, kdump: Try INIT regardless of kdump_on_init Hidetoshi Seto
2009-06-18 6:53 ` [PATCH 7/7] ia64, kdump: Short path to freeze CPUs Hidetoshi Seto
2009-06-22 6:31 ` [PATCH 0/7] Patches for kdump vs. INIT Jay Lan
2009-06-22 7:16 ` Hidetoshi Seto
2009-07-09 7:02 ` [PATCH v2 " Hidetoshi Seto
2009-07-09 7:10 ` [PATCH v2 1/7] ia64, kdump: Mask MCA/INIT on frozen cpus Hidetoshi Seto
2009-07-09 7:11 ` [PATCH v2 2/7] ia64, kexec: Make INIT safe while transition to kdump/kexec kernel Hidetoshi Seto
2009-07-09 7:12 ` [PATCH v2 3/7] ia64, kexec: Unregister MCA handler before kexec Hidetoshi Seto
2009-07-09 7:14 ` [PATCH v2 4/7] ia64, kdump: Don't return APs to SAL from kdump Hidetoshi Seto
2009-07-09 7:15 ` [PATCH v2 5/7] ia64, kdump: Mask INIT first in panic-kdump path Hidetoshi Seto
2009-07-09 7:17 ` [PATCH v2 6/7] ia64, kdump: Try INIT regardless of kdump_on_init Hidetoshi Seto
2009-07-09 7:18 ` [PATCH v2 7/7] ia64, kdump: Short path to freeze CPUs Hidetoshi Seto
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=4A39E3C9.2040906@jp.fujitsu.com \
--to=seto.hidetoshi@jp.fujitsu.com \
--cc=hbabu@us.ibm.com \
--cc=kexec@lists.infradead.org \
--cc=linux-ia64@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=vgoyal@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox