public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH] Allow for stack traces to be printed on serial console
       [not found] <CAG1a4rtrh7=+gr=kUGO6y4wt926F8rBusOcFgvu4CmvrmR5PCw@mail.gmail.com>
@ 2011-09-30  4:49 ` Pavel Ivanov
  2011-10-03  9:30   ` Srivatsa S. Bhat
  0 siblings, 1 reply; 3+ messages in thread
From: Pavel Ivanov @ 2011-09-30  4:49 UTC (permalink / raw)
  To: linux-kernel

When I tried to chase some mysterious lockup of my PC the only means to
see some error reports for me was serial console. But it looks like only
printk with KERN_ERR is sent to serial console. So when hung task
detector tried to show me stack traces for hung tasks I didn't see them
on serial console and I didn't see them after reboot as they couldn't be
saved to dmesg. Thus the following patch allowed me to actually see
those stack traces.

I believe kernel prints stack traces only in some serious cases and
expects that they would be actually seen, so KERN_ERR looks justified
for me in all changed places. I understand that patch is incomplete and
would need some other places to be changed for consistency (at least
other arch code). But first I want to hear comments on whether this
approach is good enough to be included in mainline or it should be left
for me as a hack.


Signed-off-by: Pavel Ivanov <paivanof@gmail.com>
---

diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c
index 1aae78f..52770aa 100644
--- a/arch/x86/kernel/dumpstack.c
+++ b/arch/x86/kernel/dumpstack.c
@@ -27,7 +27,7 @@ static int die_counter;
 
 void printk_address(unsigned long address, int reliable)
 {
-	printk(" [<%p>] %s%pB\n", (void *) address,
+	printk("[<%p>] %s%pB\n", (void *) address,
 			reliable ? "" : "? ", (void *) address);
 }
 
@@ -147,7 +147,7 @@ static int print_trace_stack(void *data, char *name)
 static void print_trace_address(void *data, unsigned long addr, int reliable)
 {
 	touch_nmi_watchdog();
-	printk(data);
+	printk("%s ", (char*)data);
 	printk_address(addr, reliable);
 }
 
@@ -173,7 +173,7 @@ void show_trace(struct task_struct *task, struct pt_regs *regs,
 
 void show_stack(struct task_struct *task, unsigned long *sp)
 {
-	show_stack_log_lvl(task, NULL, sp, 0, "");
+	show_stack_log_lvl(task, NULL, sp, 0, KERN_ERR);
 }
 
 /*
@@ -281,7 +281,7 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)
 	printk(" SS:ESP %04x:%08lx\n", ss, sp);
 #else
 	/* Executive summary in case the oops scrolled away */
-	printk(KERN_ALERT "RIP ");
+	printk(KERN_ALERT "RIP  ");
 	printk_address(regs->ip, 1);
 	printk(" RSP <%016lx>\n", regs->sp);
 #endif
diff --git a/kernel/lockdep.c b/kernel/lockdep.c
index 91d67ce..eb525ba 100644
--- a/kernel/lockdep.c
+++ b/kernel/lockdep.c
@@ -547,14 +547,14 @@ static void lockdep_print_held_locks(struct task_struct *curr)
 	int i, depth = curr->lockdep_depth;
 
 	if (!depth) {
-		printk("no locks held by %s/%d.\n", curr->comm, task_pid_nr(curr));
+		printk(KERN_ERR "no locks held by %s/%d.\n", curr->comm, task_pid_nr(curr));
 		return;
 	}
-	printk("%d lock%s held by %s/%d:\n",
+	printk(KERN_ERR "%d lock%s held by %s/%d:\n",
 		depth, depth > 1 ? "s" : "", curr->comm, task_pid_nr(curr));
 
 	for (i = 0; i < depth; i++) {
-		printk(" #%d: ", i);
+		printk(KERN_ERR " #%d: ", i);
 		print_lock(curr->held_locks + i);
 	}
 }
@@ -3977,7 +3977,7 @@ EXPORT_SYMBOL_GPL(debug_show_all_locks);
 void debug_show_held_locks(struct task_struct *task)
 {
 	if (unlikely(!debug_locks)) {
-		printk("INFO: lockdep is turned off.\n");
+		printk(KERN_ERR "INFO: lockdep is turned off.\n");
 		return;
 	}
 	lockdep_print_held_locks(task);
diff --git a/kernel/sched.c b/kernel/sched.c
index ec5f472..e05d443 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -5865,7 +5865,7 @@ void sched_show_task(struct task_struct *p)
 	unsigned state;
 
 	state = p->state ? __ffs(p->state) + 1 : 0;
-	printk(KERN_INFO "%-15.15s %c", p->comm,
+	printk(KERN_ERR "%-15.15s %c", p->comm,
 		state < sizeof(stat_nam) - 1 ? stat_nam[state] : '?');
 #if BITS_PER_LONG == 32
 	if (state == TASK_RUNNING)



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [RFC PATCH] Allow for stack traces to be printed on serial console
  2011-09-30  4:49 ` [RFC PATCH] Allow for stack traces to be printed on serial console Pavel Ivanov
@ 2011-10-03  9:30   ` Srivatsa S. Bhat
  2011-10-05 22:03     ` Pavel Ivanov
  0 siblings, 1 reply; 3+ messages in thread
From: Srivatsa S. Bhat @ 2011-10-03  9:30 UTC (permalink / raw)
  To: Pavel Ivanov; +Cc: linux-kernel

On 09/30/2011 10:19 AM, Pavel Ivanov wrote:
> When I tried to chase some mysterious lockup of my PC the only means to
> see some error reports for me was serial console. But it looks like only
> printk with KERN_ERR is sent to serial console. So when hung task
> detector tried to show me stack traces for hung tasks I didn't see them
> on serial console and I didn't see them after reboot as they couldn't be
> saved to dmesg. Thus the following patch allowed me to actually see
> those stack traces.

Which kernel messages gets displayed on your serial console is controlled by
your system configuration which can be altered by modifying /etc/rsyslog.conf
or /etc/sysconfig/syslog.conf 
There you can specify that you want to print every kernel message by specifying
kern.* for example.

There are also some kernel command line options you can use to specify which 
level of kernel messages you want to get displayed.

Since you clearly have a system configuration problem here, you don't need to alter the
kernel source to print with KERN_ERR everywhere. Doing that would also defeat the very
purpose of having that nice distinction between informational messages, error messages
and so on, isn't it?

> I believe kernel prints stack traces only in some serious cases and
> expects that they would be actually seen, so KERN_ERR looks justified
> for me in all changed places. I understand that patch is incomplete and
> would need some other places to be changed for consistency (at least
> other arch code). But first I want to hear comments on whether this
> approach is good enough to be included in mainline or it should be left
> for me as a hack.
> 
-- 
Regards,
Srivatsa S. Bhat  <srivatsa.bhat@linux.vnet.ibm.com>
Linux Technology Center,
IBM India Systems and Technology Lab

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [RFC PATCH] Allow for stack traces to be printed on serial console
  2011-10-03  9:30   ` Srivatsa S. Bhat
@ 2011-10-05 22:03     ` Pavel Ivanov
  0 siblings, 0 replies; 3+ messages in thread
From: Pavel Ivanov @ 2011-10-05 22:03 UTC (permalink / raw)
  To: Srivatsa S. Bhat; +Cc: linux-kernel

On Mon, Oct 3, 2011 at 5:30 AM, Srivatsa S. Bhat
<srivatsa.bhat@linux.vnet.ibm.com> wrote:
> On 09/30/2011 10:19 AM, Pavel Ivanov wrote:
>> When I tried to chase some mysterious lockup of my PC the only means to
>> see some error reports for me was serial console. But it looks like only
>> printk with KERN_ERR is sent to serial console. So when hung task
>> detector tried to show me stack traces for hung tasks I didn't see them
>> on serial console and I didn't see them after reboot as they couldn't be
>> saved to dmesg. Thus the following patch allowed me to actually see
>> those stack traces.
>
> Which kernel messages gets displayed on your serial console is controlled by
> your system configuration which can be altered by modifying /etc/rsyslog.conf
> or /etc/sysconfig/syslog.conf
> There you can specify that you want to print every kernel message by specifying
> kern.* for example.

I've tried to add "kern.* /dev/ttyS0" and "*.* /dev/ttyS0" to
/etc/rsyslog.conf but it didn't help at all.

> There are also some kernel command line options you can use to specify which
> level of kernel messages you want to get displayed.

I've tried to add loglevel=7 as bootup parameter but it didn't help.
Then I've tried to
"echo $'7\t7\t1\t7' >/proc/sys/kernel/printk" and it helped a little
(message with level KERN_INFO was printed from sched_show_task() to
serial console). But still I wasn't able to see stack traces. Do I
miss something?

> Since you clearly have a system configuration problem here, you don't need to alter the
> kernel source to print with KERN_ERR everywhere. Doing that would also defeat the very
> purpose of having that nice distinction between informational messages, error messages
> and so on, isn't it?

Sure. But what configuration parameter should I tune?

I proposed this patch because I didn't believe that there can be cases
when kernel wants to print stack trace and somebody looking at serial
console doesn't want to see it. But of course I can live with some
configuration parameter as long as I find it.


>> I believe kernel prints stack traces only in some serious cases and
>> expects that they would be actually seen, so KERN_ERR looks justified
>> for me in all changed places. I understand that patch is incomplete and
>> would need some other places to be changed for consistency (at least
>> other arch code). But first I want to hear comments on whether this
>> approach is good enough to be included in mainline or it should be left
>> for me as a hack.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-10-05 22:03 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <CAG1a4rtrh7=+gr=kUGO6y4wt926F8rBusOcFgvu4CmvrmR5PCw@mail.gmail.com>
2011-09-30  4:49 ` [RFC PATCH] Allow for stack traces to be printed on serial console Pavel Ivanov
2011-10-03  9:30   ` Srivatsa S. Bhat
2011-10-05 22:03     ` Pavel Ivanov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox