aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorHidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>2008-04-08 00:31:47 -0400
committerTony Luck <tony.luck@intel.com>2008-04-09 12:53:00 -0400
commitb0247a55f4cdd7a270e938aa39f9edb5b005a88c (patch)
tree04fc27486ff75dcebbabecbebb4082883eceeee3 /arch
parent7180c4c9e09888db0a188f729c96c6d7bd61fa83 (diff)
[IA64] kdump: add kdump_on_fatal_mca
While it is convenient that we can invoke kdump by asserting INIT via button on chassis etc., there are some situations that invoking kdump on fatal MCA is not welcomed rather than rebooting fast without dump. This patch adds a new flag 'kdump_on_fatal_mca' that is independent from 'kdump_on_init' currently available. Adding this flag enable us to turning on/off of kdump depend on the event, INIT and/or fatal MCA. Default for this flag is to take the dump. Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/ia64/kernel/crash.c31
-rw-r--r--arch/ia64/kernel/mca.c6
2 files changed, 24 insertions, 13 deletions
diff --git a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c
index fbe742ad2fde..2b01e5a1f3ce 100644
--- a/arch/ia64/kernel/crash.c
+++ b/arch/ia64/kernel/crash.c
@@ -24,6 +24,7 @@ int kdump_status[NR_CPUS];
24static atomic_t kdump_cpu_frozen; 24static atomic_t kdump_cpu_frozen;
25atomic_t kdump_in_progress; 25atomic_t kdump_in_progress;
26static int kdump_on_init = 1; 26static int kdump_on_init = 1;
27static int kdump_on_fatal_mca = 1;
27 28
28static inline Elf64_Word 29static inline Elf64_Word
29*append_elf_note(Elf64_Word *buf, char *name, unsigned type, void *data, 30*append_elf_note(Elf64_Word *buf, char *name, unsigned type, void *data,
@@ -148,7 +149,7 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
148 struct ia64_mca_notify_die *nd; 149 struct ia64_mca_notify_die *nd;
149 struct die_args *args = data; 150 struct die_args *args = data;
150 151
151 if (!kdump_on_init) 152 if (!kdump_on_init && !kdump_on_fatal_mca)
152 return NOTIFY_DONE; 153 return NOTIFY_DONE;
153 154
154 if (!ia64_kimage) { 155 if (!ia64_kimage) {
@@ -174,11 +175,14 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
174 175
175 switch (val) { 176 switch (val) {
176 case DIE_INIT_MONARCH_PROCESS: 177 case DIE_INIT_MONARCH_PROCESS:
177 atomic_set(&kdump_in_progress, 1); 178 if (kdump_on_init) {
178 *(nd->monarch_cpu) = -1; 179 atomic_set(&kdump_in_progress, 1);
180 *(nd->monarch_cpu) = -1;
181 }
179 break; 182 break;
180 case DIE_INIT_MONARCH_LEAVE: 183 case DIE_INIT_MONARCH_LEAVE:
181 machine_kdump_on_init(); 184 if (kdump_on_init)
185 machine_kdump_on_init();
182 break; 186 break;
183 case DIE_INIT_SLAVE_LEAVE: 187 case DIE_INIT_SLAVE_LEAVE:
184 if (atomic_read(&kdump_in_progress)) 188 if (atomic_read(&kdump_in_progress))
@@ -189,16 +193,19 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
189 unw_init_running(kdump_cpu_freeze, NULL); 193 unw_init_running(kdump_cpu_freeze, NULL);
190 break; 194 break;
191 case DIE_MCA_MONARCH_LEAVE: 195 case DIE_MCA_MONARCH_LEAVE:
192 /* die_register->signr indicate if MCA is recoverable */ 196 /* die_register->signr indicate if MCA is recoverable */
193 if (!args->signr) 197 if (kdump_on_fatal_mca && !args->signr) {
198 atomic_set(&kdump_in_progress, 1);
199 *(nd->monarch_cpu) = -1;
194 machine_kdump_on_init(); 200 machine_kdump_on_init();
201 }
195 break; 202 break;
196 } 203 }
197 return NOTIFY_DONE; 204 return NOTIFY_DONE;
198} 205}
199 206
200#ifdef CONFIG_SYSCTL 207#ifdef CONFIG_SYSCTL
201static ctl_table kdump_on_init_table[] = { 208static ctl_table kdump_ctl_table[] = {
202 { 209 {
203 .ctl_name = CTL_UNNUMBERED, 210 .ctl_name = CTL_UNNUMBERED,
204 .procname = "kdump_on_init", 211 .procname = "kdump_on_init",
@@ -207,6 +214,14 @@ static ctl_table kdump_on_init_table[] = {
207 .mode = 0644, 214 .mode = 0644,
208 .proc_handler = &proc_dointvec, 215 .proc_handler = &proc_dointvec,
209 }, 216 },
217 {
218 .ctl_name = CTL_UNNUMBERED,
219 .procname = "kdump_on_fatal_mca",
220 .data = &kdump_on_fatal_mca,
221 .maxlen = sizeof(int),
222 .mode = 0644,
223 .proc_handler = &proc_dointvec,
224 },
210 { .ctl_name = 0 } 225 { .ctl_name = 0 }
211}; 226};
212 227
@@ -215,7 +230,7 @@ static ctl_table sys_table[] = {
215 .ctl_name = CTL_KERN, 230 .ctl_name = CTL_KERN,
216 .procname = "kernel", 231 .procname = "kernel",
217 .mode = 0555, 232 .mode = 0555,
218 .child = kdump_on_init_table, 233 .child = kdump_ctl_table,
219 }, 234 },
220 { .ctl_name = 0 } 235 { .ctl_name = 0 }
221}; 236};
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c
index 6c18221dba36..338dbb8c2cfc 100644
--- a/arch/ia64/kernel/mca.c
+++ b/arch/ia64/kernel/mca.c
@@ -1266,16 +1266,12 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
1266 } else { 1266 } else {
1267 /* Dump buffered message to console */ 1267 /* Dump buffered message to console */
1268 ia64_mlogbuf_finish(1); 1268 ia64_mlogbuf_finish(1);
1269#ifdef CONFIG_KEXEC
1270 atomic_set(&kdump_in_progress, 1);
1271 monarch_cpu = -1;
1272#endif
1273 } 1269 }
1270
1274 if (notify_die(DIE_MCA_MONARCH_LEAVE, "MCA", regs, (long)&nd, 0, recover) 1271 if (notify_die(DIE_MCA_MONARCH_LEAVE, "MCA", regs, (long)&nd, 0, recover)
1275 == NOTIFY_STOP) 1272 == NOTIFY_STOP)
1276 ia64_mca_spin(__func__); 1273 ia64_mca_spin(__func__);
1277 1274
1278
1279 if (atomic_dec_return(&mca_count) > 0) { 1275 if (atomic_dec_return(&mca_count) > 0) {
1280 int i; 1276 int i;
1281 1277