|
@@ -24,6 +24,7 @@ int kdump_status[NR_CPUS];
|
|
static atomic_t kdump_cpu_frozen;
|
|
static atomic_t kdump_cpu_frozen;
|
|
atomic_t kdump_in_progress;
|
|
atomic_t kdump_in_progress;
|
|
static int kdump_on_init = 1;
|
|
static int kdump_on_init = 1;
|
|
|
|
+static int kdump_on_fatal_mca = 1;
|
|
|
|
|
|
static inline Elf64_Word
|
|
static inline Elf64_Word
|
|
*append_elf_note(Elf64_Word *buf, char *name, unsigned type, void *data,
|
|
*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)
|
|
struct ia64_mca_notify_die *nd;
|
|
struct ia64_mca_notify_die *nd;
|
|
struct die_args *args = data;
|
|
struct die_args *args = data;
|
|
|
|
|
|
- if (!kdump_on_init)
|
|
|
|
|
|
+ if (!kdump_on_init && !kdump_on_fatal_mca)
|
|
return NOTIFY_DONE;
|
|
return NOTIFY_DONE;
|
|
|
|
|
|
if (!ia64_kimage) {
|
|
if (!ia64_kimage) {
|
|
@@ -174,11 +175,14 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
|
|
|
|
|
|
switch (val) {
|
|
switch (val) {
|
|
case DIE_INIT_MONARCH_PROCESS:
|
|
case DIE_INIT_MONARCH_PROCESS:
|
|
- atomic_set(&kdump_in_progress, 1);
|
|
|
|
- *(nd->monarch_cpu) = -1;
|
|
|
|
|
|
+ if (kdump_on_init) {
|
|
|
|
+ atomic_set(&kdump_in_progress, 1);
|
|
|
|
+ *(nd->monarch_cpu) = -1;
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
case DIE_INIT_MONARCH_LEAVE:
|
|
case DIE_INIT_MONARCH_LEAVE:
|
|
- machine_kdump_on_init();
|
|
|
|
|
|
+ if (kdump_on_init)
|
|
|
|
+ machine_kdump_on_init();
|
|
break;
|
|
break;
|
|
case DIE_INIT_SLAVE_LEAVE:
|
|
case DIE_INIT_SLAVE_LEAVE:
|
|
if (atomic_read(&kdump_in_progress))
|
|
if (atomic_read(&kdump_in_progress))
|
|
@@ -189,16 +193,19 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
|
|
unw_init_running(kdump_cpu_freeze, NULL);
|
|
unw_init_running(kdump_cpu_freeze, NULL);
|
|
break;
|
|
break;
|
|
case DIE_MCA_MONARCH_LEAVE:
|
|
case DIE_MCA_MONARCH_LEAVE:
|
|
- /* die_register->signr indicate if MCA is recoverable */
|
|
|
|
- if (!args->signr)
|
|
|
|
|
|
+ /* die_register->signr indicate if MCA is recoverable */
|
|
|
|
+ if (kdump_on_fatal_mca && !args->signr) {
|
|
|
|
+ atomic_set(&kdump_in_progress, 1);
|
|
|
|
+ *(nd->monarch_cpu) = -1;
|
|
machine_kdump_on_init();
|
|
machine_kdump_on_init();
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
return NOTIFY_DONE;
|
|
return NOTIFY_DONE;
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SYSCTL
|
|
#ifdef CONFIG_SYSCTL
|
|
-static ctl_table kdump_on_init_table[] = {
|
|
|
|
|
|
+static ctl_table kdump_ctl_table[] = {
|
|
{
|
|
{
|
|
.ctl_name = CTL_UNNUMBERED,
|
|
.ctl_name = CTL_UNNUMBERED,
|
|
.procname = "kdump_on_init",
|
|
.procname = "kdump_on_init",
|
|
@@ -207,6 +214,14 @@ static ctl_table kdump_on_init_table[] = {
|
|
.mode = 0644,
|
|
.mode = 0644,
|
|
.proc_handler = &proc_dointvec,
|
|
.proc_handler = &proc_dointvec,
|
|
},
|
|
},
|
|
|
|
+ {
|
|
|
|
+ .ctl_name = CTL_UNNUMBERED,
|
|
|
|
+ .procname = "kdump_on_fatal_mca",
|
|
|
|
+ .data = &kdump_on_fatal_mca,
|
|
|
|
+ .maxlen = sizeof(int),
|
|
|
|
+ .mode = 0644,
|
|
|
|
+ .proc_handler = &proc_dointvec,
|
|
|
|
+ },
|
|
{ .ctl_name = 0 }
|
|
{ .ctl_name = 0 }
|
|
};
|
|
};
|
|
|
|
|
|
@@ -215,7 +230,7 @@ static ctl_table sys_table[] = {
|
|
.ctl_name = CTL_KERN,
|
|
.ctl_name = CTL_KERN,
|
|
.procname = "kernel",
|
|
.procname = "kernel",
|
|
.mode = 0555,
|
|
.mode = 0555,
|
|
- .child = kdump_on_init_table,
|
|
|
|
|
|
+ .child = kdump_ctl_table,
|
|
},
|
|
},
|
|
{ .ctl_name = 0 }
|
|
{ .ctl_name = 0 }
|
|
};
|
|
};
|