Chris,
Here's a patch for you to try. It creates a safe method for
sysrq handlers to modify console_loglevel, which I suspect is
why you were not seeing messages on the serial console.
Please report back on your testing.
Thanks.
---
From: Randy Dunlap <[email protected]>
Some sysrq handlers modify the console_loglevel variable,
but when they do so, some of their own messages may be lost
(not logged, esp. on serial console).
This patch introduces a way for console_loglevel to be
modified safely by the sysrq handlers. The new value is not
set until the sysrq handler complets and returns.
Signed-off-by: Randy Dunlap <[email protected]>
---
drivers/char/sysrq.c | 16 +++++++++-------
1 files changed, 9 insertions(+), 7 deletions(-)
diff -Naurp linux-2613-rc2/drivers/char/sysrq.c~fix_loglevel linux-2613-rc2/drivers/char/sysrq.c
--- linux-2613-rc2/drivers/char/sysrq.c~fix_loglevel 2005-07-09 13:55:01.000000000 -0700
+++ linux-2613-rc2/drivers/char/sysrq.c 2005-09-25 21:31:12.000000000 -0700
@@ -41,6 +41,7 @@
/* Whether we react on sysrq keys or just ignore them */
int sysrq_enabled = 1;
+static int next_log_level;
/* Loglevel sysrq handler */
static void sysrq_handle_loglevel(int key, struct pt_regs *pt_regs,
@@ -50,7 +51,7 @@ static void sysrq_handle_loglevel(int ke
i = key - '0';
console_loglevel = 7;
printk("Loglevel set to %d\n", i);
- console_loglevel = i;
+ next_log_level = i;
}
static struct sysrq_key_op sysrq_loglevel_op = {
.handler = sysrq_handle_loglevel,
@@ -217,7 +218,7 @@ static void sysrq_handle_term(int key, s
struct tty_struct *tty)
{
send_sig_all(SIGTERM);
- console_loglevel = 8;
+ next_log_level = 8;
}
static struct sysrq_key_op sysrq_term_op = {
.handler = sysrq_handle_term,
@@ -248,7 +249,7 @@ static void sysrq_handle_kill(int key, s
struct tty_struct *tty)
{
send_sig_all(SIGKILL);
- console_loglevel = 8;
+ next_log_level = 8;
}
static struct sysrq_key_op sysrq_kill_op = {
.handler = sysrq_handle_kill,
@@ -371,12 +372,11 @@ void __sysrq_put_key_op (int key, struct
void __handle_sysrq(int key, struct pt_regs *pt_regs, struct tty_struct *tty, int check_mask)
{
struct sysrq_key_op *op_p;
- int orig_log_level;
int i, j;
unsigned long flags;
spin_lock_irqsave(&sysrq_key_table_lock, flags);
- orig_log_level = console_loglevel;
+ next_log_level = console_loglevel;
console_loglevel = 7;
printk(KERN_INFO "SysRq : ");
@@ -387,8 +387,10 @@ void __handle_sysrq(int key, struct pt_r
if (!check_mask || sysrq_enabled == 1 ||
(sysrq_enabled & op_p->enable_mask)) {
printk ("%s\n", op_p->action_msg);
- console_loglevel = orig_log_level;
+ /* handlers may change console_loglevel,
+ * but now they do this by setting <next_log_level> */
op_p->handler(key, pt_regs, tty);
+ console_loglevel = next_log_level;
}
else
printk("This sysrq operation is disabled.\n");
@@ -402,7 +404,7 @@ void __handle_sysrq(int key, struct pt_r
printk ("%s ", sysrq_key_table[i]->help_msg);
}
printk ("\n");
- console_loglevel = orig_log_level;
+ console_loglevel = next_log_level;
}
spin_unlock_irqrestore(&sysrq_key_table_lock, flags);
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
|
|