forked from luck/tmp_suning_uos_patched
[S390] kernel: Shutdown Actions Interface
In case of a kernel panic it is currently possible to specify that a dump should be created, the system should be rebooted or stopped. Virtual sysfs files under the directory /sys/firmware/ are used for that configuration. In addition to that, there are kernel parameters 'vmhalt', 'vmpoff' and 'vmpanic', which can be used to specify z/VM commands, which are automatically executed in case of halt, power off or a kernel panic. This patch combines both functionalities and allows to specify the z/VM CP commands also via sysfs attributes. In addition to that, it enhances the existing handling of shutdown triggers (e.g. halt or panic) and associated shutdown actions (e.g. dump or reipl) and makes it more flexible. Signed-off-by: Michael Holzheu <holzheu@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
ceb3dfbae1
commit
99ca4e582d
File diff suppressed because it is too large
Load Diff
@ -125,75 +125,6 @@ void __cpuinit cpu_init(void)
|
||||
enter_lazy_tlb(&init_mm, current);
|
||||
}
|
||||
|
||||
/*
|
||||
* VM halt and poweroff setup routines
|
||||
*/
|
||||
char vmhalt_cmd[128] = "";
|
||||
char vmpoff_cmd[128] = "";
|
||||
static char vmpanic_cmd[128] = "";
|
||||
|
||||
static void strncpy_skip_quote(char *dst, char *src, int n)
|
||||
{
|
||||
int sx, dx;
|
||||
|
||||
dx = 0;
|
||||
for (sx = 0; src[sx] != 0; sx++) {
|
||||
if (src[sx] == '"') continue;
|
||||
dst[dx++] = src[sx];
|
||||
if (dx >= n) break;
|
||||
}
|
||||
}
|
||||
|
||||
static int __init vmhalt_setup(char *str)
|
||||
{
|
||||
strncpy_skip_quote(vmhalt_cmd, str, 127);
|
||||
vmhalt_cmd[127] = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("vmhalt=", vmhalt_setup);
|
||||
|
||||
static int __init vmpoff_setup(char *str)
|
||||
{
|
||||
strncpy_skip_quote(vmpoff_cmd, str, 127);
|
||||
vmpoff_cmd[127] = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("vmpoff=", vmpoff_setup);
|
||||
|
||||
static int vmpanic_notify(struct notifier_block *self, unsigned long event,
|
||||
void *data)
|
||||
{
|
||||
if (MACHINE_IS_VM && strlen(vmpanic_cmd) > 0)
|
||||
cpcmd(vmpanic_cmd, NULL, 0, NULL);
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
#define PANIC_PRI_VMPANIC 0
|
||||
|
||||
static struct notifier_block vmpanic_nb = {
|
||||
.notifier_call = vmpanic_notify,
|
||||
.priority = PANIC_PRI_VMPANIC
|
||||
};
|
||||
|
||||
static int __init vmpanic_setup(char *str)
|
||||
{
|
||||
static int register_done __initdata = 0;
|
||||
|
||||
strncpy_skip_quote(vmpanic_cmd, str, 127);
|
||||
vmpanic_cmd[127] = 0;
|
||||
if (!register_done) {
|
||||
register_done = 1;
|
||||
atomic_notifier_chain_register(&panic_notifier_list,
|
||||
&vmpanic_nb);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("vmpanic=", vmpanic_setup);
|
||||
|
||||
/*
|
||||
* condev= and conmode= setup parameter.
|
||||
*/
|
||||
@ -308,38 +239,6 @@ static void __init setup_zfcpdump(unsigned int console_devno)
|
||||
static inline void setup_zfcpdump(unsigned int console_devno) {}
|
||||
#endif /* CONFIG_ZFCPDUMP */
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
void (*_machine_restart)(char *command) = machine_restart_smp;
|
||||
void (*_machine_halt)(void) = machine_halt_smp;
|
||||
void (*_machine_power_off)(void) = machine_power_off_smp;
|
||||
#else
|
||||
/*
|
||||
* Reboot, halt and power_off routines for non SMP.
|
||||
*/
|
||||
static void do_machine_restart_nonsmp(char * __unused)
|
||||
{
|
||||
do_reipl();
|
||||
}
|
||||
|
||||
static void do_machine_halt_nonsmp(void)
|
||||
{
|
||||
if (MACHINE_IS_VM && strlen(vmhalt_cmd) > 0)
|
||||
__cpcmd(vmhalt_cmd, NULL, 0, NULL);
|
||||
signal_processor(smp_processor_id(), sigp_stop_and_store_status);
|
||||
}
|
||||
|
||||
static void do_machine_power_off_nonsmp(void)
|
||||
{
|
||||
if (MACHINE_IS_VM && strlen(vmpoff_cmd) > 0)
|
||||
__cpcmd(vmpoff_cmd, NULL, 0, NULL);
|
||||
signal_processor(smp_processor_id(), sigp_stop_and_store_status);
|
||||
}
|
||||
|
||||
void (*_machine_restart)(char *command) = do_machine_restart_nonsmp;
|
||||
void (*_machine_halt)(void) = do_machine_halt_nonsmp;
|
||||
void (*_machine_power_off)(void) = do_machine_power_off_nonsmp;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Reboot, halt and power_off stubs. They just call _machine_restart,
|
||||
* _machine_halt or _machine_power_off.
|
||||
@ -913,7 +812,7 @@ setup_arch(char **cmdline_p)
|
||||
|
||||
parse_early_param();
|
||||
|
||||
setup_ipl_info();
|
||||
setup_ipl();
|
||||
setup_memory_end();
|
||||
setup_addressing_mode();
|
||||
setup_memory();
|
||||
|
@ -233,33 +233,6 @@ void smp_send_stop(void)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Reboot, halt and power_off routines for SMP.
|
||||
*/
|
||||
void machine_restart_smp(char *__unused)
|
||||
{
|
||||
smp_send_stop();
|
||||
do_reipl();
|
||||
}
|
||||
|
||||
void machine_halt_smp(void)
|
||||
{
|
||||
smp_send_stop();
|
||||
if (MACHINE_IS_VM && strlen(vmhalt_cmd) > 0)
|
||||
__cpcmd(vmhalt_cmd, NULL, 0, NULL);
|
||||
signal_processor(smp_processor_id(), sigp_stop_and_store_status);
|
||||
for (;;);
|
||||
}
|
||||
|
||||
void machine_power_off_smp(void)
|
||||
{
|
||||
smp_send_stop();
|
||||
if (MACHINE_IS_VM && strlen(vmpoff_cmd) > 0)
|
||||
__cpcmd(vmpoff_cmd, NULL, 0, NULL);
|
||||
signal_processor(smp_processor_id(), sigp_stop_and_store_status);
|
||||
for (;;);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the main routine where commands issued by other
|
||||
* cpus are handled.
|
||||
|
@ -83,6 +83,8 @@ extern u32 dump_prefix_page;
|
||||
extern unsigned int zfcpdump_prefix_array[];
|
||||
|
||||
extern void do_reipl(void);
|
||||
extern void do_halt(void);
|
||||
extern void do_poff(void);
|
||||
extern void ipl_save_parameters(void);
|
||||
|
||||
enum {
|
||||
@ -118,7 +120,7 @@ struct ipl_info
|
||||
};
|
||||
|
||||
extern struct ipl_info ipl_info;
|
||||
extern void setup_ipl_info(void);
|
||||
extern void setup_ipl(void);
|
||||
|
||||
/*
|
||||
* DIAG 308 support
|
||||
|
Loading…
Reference in New Issue
Block a user