[S390] console flush on panic / reboot
The s390 console drivers use the unblank callback of the console structure to flush the console buffer. In case of a panic or a reboot the CPU doing the callback can block on the console i/o. The other CPUs in the system continue to work. For panic this is not a good idea. Replace the unblank callback with proper panic/reboot notifier. These get called after all but one CPU have been stopped. Signed-off-by: Holger Smolinski <Holger.Smolinski@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:

committed by
Martin Schwidefsky

parent
15e86b0c75
commit
2332ce1a97
@@ -24,6 +24,8 @@
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include "sclp.h"
|
||||
|
||||
@@ -743,24 +745,30 @@ sclp_vt220_con_device(struct console *c, int *index)
|
||||
return sclp_vt220_driver;
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine is called from panic when the kernel is going to give up.
|
||||
* We have to make sure that all buffers will be flushed to the SCLP.
|
||||
* Note that this function may be called from within an interrupt context.
|
||||
*/
|
||||
static void
|
||||
sclp_vt220_con_unblank(void)
|
||||
static int
|
||||
sclp_vt220_notify(struct notifier_block *self,
|
||||
unsigned long event, void *data)
|
||||
{
|
||||
__sclp_vt220_flush_buffer();
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block on_panic_nb = {
|
||||
.notifier_call = sclp_vt220_notify,
|
||||
.priority = 1,
|
||||
};
|
||||
|
||||
static struct notifier_block on_reboot_nb = {
|
||||
.notifier_call = sclp_vt220_notify,
|
||||
.priority = 1,
|
||||
};
|
||||
|
||||
/* Structure needed to register with printk */
|
||||
static struct console sclp_vt220_console =
|
||||
{
|
||||
.name = SCLP_VT220_CONSOLE_NAME,
|
||||
.write = sclp_vt220_con_write,
|
||||
.device = sclp_vt220_con_device,
|
||||
.unblank = sclp_vt220_con_unblank,
|
||||
.flags = CON_PRINTBUFFER,
|
||||
.index = SCLP_VT220_CONSOLE_INDEX
|
||||
};
|
||||
@@ -776,6 +784,8 @@ sclp_vt220_con_init(void)
|
||||
if (rc)
|
||||
return rc;
|
||||
/* Attach linux console */
|
||||
atomic_notifier_chain_register(&panic_notifier_list, &on_panic_nb);
|
||||
register_reboot_notifier(&on_reboot_nb);
|
||||
register_console(&sclp_vt220_console);
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user