tty/sysrq: Replay kernel log messages on consoles via sysrq
authorSreenath Vijayan <sreenath.vijayan@sony.com>
Wed, 13 Mar 2024 10:22:52 +0000 (15:52 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 Apr 2024 12:22:52 +0000 (14:22 +0200)
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>
Documentation/admin-guide/sysrq.rst
drivers/tty/sysrq.c

index 2f2e5bd440f9b340f1ffb910996b592ef79f645e..a85b3384d1e7a9e64dbf84c429e1af6eb55680d7 100644 (file)
@@ -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?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
index 02217e3c916b560b782a32164e3fbf146570f712..e5974b8239c9904abbc15c1b658380bd800426b8 100644 (file)
@@ -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 */