tty/sysrq: Replay kernel log messages on consoles via sysrq
When terminal is unresponsive, one cannot use dmesg to view the printk ring buffer messages. Also, syslog services may be disabled, especially on embedded systems, to check the messages after a reboot. In this scenario, replay the messages in printk ring buffer on consoles via sysrq by pressing sysrq+R. The console loglevel will determine which all kernel log messages are displayed. The messages will be displayed only when console_trylock() succeeds. Users could repeat the sysrq key when it fails. If the owner of console subsystem lock is stuck, repeating the key won't work. Suggested-by: Petr Mladek <pmladek@suse.com> Signed-off-by: Shimoyashiki Taichi <taichi.shimoyashiki@sony.com> Reviewed-by: John Ogness <john.ogness@linutronix.de> Signed-off-by: Sreenath Vijayan <sreenath.vijayan@sony.com> Link: https://lore.kernel.org/r/cc3b9b1aae60a236c6aed1dc7b0ffa2c7cd1f183.1710220326.git.sreenath.vijayan@sony.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
693f75b91a
commit
1b743485e2
@ -161,6 +161,8 @@ Command Function
|
||||
will be printed to your console. (``0``, for example would make
|
||||
it so that only emergency messages like PANICs or OOPSes would
|
||||
make it to your console.)
|
||||
|
||||
``R`` Replay the kernel log messages on consoles.
|
||||
=========== ===================================================================
|
||||
|
||||
Okay, so what can I use them for?
|
||||
@ -211,6 +213,13 @@ processes.
|
||||
"just thaw ``it(j)``" is useful if your system becomes unresponsive due to a
|
||||
frozen (probably root) filesystem via the FIFREEZE ioctl.
|
||||
|
||||
``Replay logs(R)`` is useful to view the kernel log messages when system is hung
|
||||
or you are not able to use dmesg command to view the messages in printk buffer.
|
||||
User may have to press the key combination multiple times if console system is
|
||||
busy. If it is completely locked up, then messages won't be printed. Output
|
||||
messages depend on current console loglevel, which can be modified using
|
||||
sysrq[0-9] (see above).
|
||||
|
||||
Sometimes SysRq seems to get 'stuck' after using it, what can I do?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
@ -450,6 +450,17 @@ static const struct sysrq_key_op sysrq_unrt_op = {
|
||||
.enable_mask = SYSRQ_ENABLE_RTNICE,
|
||||
};
|
||||
|
||||
static void sysrq_handle_replay_logs(u8 key)
|
||||
{
|
||||
console_replay_all();
|
||||
}
|
||||
static struct sysrq_key_op sysrq_replay_logs_op = {
|
||||
.handler = sysrq_handle_replay_logs,
|
||||
.help_msg = "replay-kernel-logs(R)",
|
||||
.action_msg = "Replay kernel logs on consoles",
|
||||
.enable_mask = SYSRQ_ENABLE_DUMP,
|
||||
};
|
||||
|
||||
/* Key Operations table and lock */
|
||||
static DEFINE_SPINLOCK(sysrq_key_table_lock);
|
||||
|
||||
@ -519,7 +530,7 @@ static const struct sysrq_key_op *sysrq_key_table[62] = {
|
||||
NULL, /* O */
|
||||
NULL, /* P */
|
||||
NULL, /* Q */
|
||||
NULL, /* R */
|
||||
&sysrq_replay_logs_op, /* R */
|
||||
NULL, /* S */
|
||||
NULL, /* T */
|
||||
NULL, /* U */
|
||||
|
Loading…
Reference in New Issue
Block a user