diff mbox

[RESEND,3.18-rc3] kdb: Avoid printing KERN_ levels to consoles

Message ID 1415287626-25802-1-git-send-email-daniel.thompson@linaro.org
State New
Headers show

Commit Message

Daniel Thompson Nov. 6, 2014, 3:27 p.m. UTC
Currently when kdb traps printk messages then the raw log level prefix
(consisting of '\001' followed by a numeral) does not get stripped off
before the message is issued to the various I/O handlers supported by
kdb. This causes annoying visual noise as well as causing problems
grepping for ^. It is also a change of behaviour compared to normal usage
of printk() usage. For example <SysRq>-h ends up with different to that of
kdb's "sr h".

This patch addresses the problem by stripping log levels from messages
before they are issued to the I/O handlers.

printk(), which is used as an I/O handler for logging purposes, is
handled as a special case; if the caller provided a log level then this
will be preserved.

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
Cc: Jason Wessel <jason.wessel@windriver.com>
---

Notes:
    This patch is tested both on arm (kgdboc=ttyAMA0) and x86_64
    (kgdboc=kdb,ttyS0).
    

 kernel/debug/kdb/kdb_io.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

--
1.9.3

Comments

Joe Perches Nov. 6, 2014, 4:13 p.m. UTC | #1
On Thu, 2014-11-06 at 15:27 +0000, Daniel Thompson wrote:
> Currently when kdb traps printk messages then the raw log level prefix
> (consisting of '\001' followed by a numeral) does not get stripped off
> before the message is issued to the various I/O handlers supported by
> kdb. This causes annoying visual noise as well as causing problems
> grepping for ^. It is also a change of behaviour compared to normal usage
> of printk() usage. For example <SysRq>-h ends up with different to that of
> kdb's "sr h".
> 
> This patch addresses the problem by stripping log levels from messages
> before they are issued to the I/O handlers.

Perhaps instead of stripping the logging level,
maybe a KERN_SOH_ASCII 'char' sequence should be
emitted as '<' 'char' '>' (see: printk:print_prefix)

Maybe this should be added to stable from v3.6
when KERN_SOH_ASCII was first added.
Daniel Thompson Nov. 6, 2014, 5:22 p.m. UTC | #2
On 06/11/14 16:13, Joe Perches wrote:
> On Thu, 2014-11-06 at 15:27 +0000, Daniel Thompson wrote:
>> Currently when kdb traps printk messages then the raw log level prefix
>> (consisting of '\001' followed by a numeral) does not get stripped off
>> before the message is issued to the various I/O handlers supported by
>> kdb. This causes annoying visual noise as well as causing problems
>> grepping for ^. It is also a change of behaviour compared to normal usage
>> of printk() usage. For example <SysRq>-h ends up with different to that of
>> kdb's "sr h".
>>
>> This patch addresses the problem by stripping log levels from messages
>> before they are issued to the I/O handlers.
> 
> Perhaps instead of stripping the logging level,
> maybe a KERN_SOH_ASCII 'char' sequence should be
> emitted as '<' 'char' '>' (see: printk:print_prefix)
> 
> Maybe this should be added to stable from v3.6
> when KERN_SOH_ASCII was first added.

You mean call the problem a regression and try to restore the original
3.5 behaviour?

Maybe.

However I have to confess that I don't really like the old behaviour.
I'd view it as contradicting the normal behaviours of consoles
(including the kgdbcon console). Why should printk() inside kdb show
different text to printk() outside kdb? For me, having <5> and <c>
scribbled all over the output of an "sr" command (which I think is
probably the heaviest user of printk() inside kdb) never struck me as
adding much value.

Is the above paragraph convincing?

To be honest I'd happy to make the change if this is critical for you
since almost anything is better than dumping a non-printable character
(which does all sorts of different things depending on the combination
of terminal emuluator/screen/minicom I need to access the board or
emulator).

On the other hand if you really mean "perhaps and maybe" then I'd prefer
to leave it as it it.


Daniel.
Joe Perches Nov. 6, 2014, 5:43 p.m. UTC | #3
On Thu, 2014-11-06 at 17:22 +0000, Daniel Thompson wrote:
> On 06/11/14 16:13, Joe Perches wrote:
> > On Thu, 2014-11-06 at 15:27 +0000, Daniel Thompson wrote:
> >> Currently when kdb traps printk messages then the raw log level prefix
> >> (consisting of '\001' followed by a numeral) does not get stripped off
> >> before the message is issued to the various I/O handlers supported by
> >> kdb. This causes annoying visual noise as well as causing problems
> >> grepping for ^. It is also a change of behaviour compared to normal usage
> >> of printk() usage. For example <SysRq>-h ends up with different to that of
> >> kdb's "sr h".
> >>
> >> This patch addresses the problem by stripping log levels from messages
> >> before they are issued to the I/O handlers.
> > 
> > Perhaps instead of stripping the logging level,
> > maybe a KERN_SOH_ASCII 'char' sequence should be
> > emitted as '<' 'char' '>' (see: printk:print_prefix)
> > 
> > Maybe this should be added to stable from v3.6
> > when KERN_SOH_ASCII was first added.
> 
> You mean call the problem a regression and try to restore the original
> 3.5 behaviour?

Yes.

I added KERN_SOH_ASCII so to me it's a regression.

> However I have to confess that I don't really like the old behaviour.
> I'd view it as contradicting the normal behaviours of consoles
> (including the kgdbcon console). Why should printk() inside kdb show
> different text to printk() outside kdb? For me, having <5> and <c>
> scribbled all over the output of an "sr" command (which I think is
> probably the heaviest user of printk() inside kdb) never struck me as
> adding much value.
> 
> Is the above paragraph convincing?

I don't use it so I have a useful opinion.

I don't recall that anyone has reported it in the 
2+ years since so it doesn't seem widely used.

But then again, this is a resend and I don't recall
seeing it the first time either.

> On the other hand if you really mean "perhaps and maybe" then I'd prefer
> to leave it as it it.

Your choice.

btw: in the patch I suggest using printk_skip_level
instead of the direct test here:

+       cp = kdb_buffer;
+       if (cp[0] == KERN_SOH_ASCII && cp[1] != '\0')
+               cp += 2;

so this could be

	cp = printk_skip_level(kdb_buffer);
Daniel Thompson Nov. 7, 2014, 9:57 a.m. UTC | #4
On 06/11/14 17:43, Joe Perches wrote:
> On Thu, 2014-11-06 at 17:22 +0000, Daniel Thompson wrote:
>> On 06/11/14 16:13, Joe Perches wrote:
>>> On Thu, 2014-11-06 at 15:27 +0000, Daniel Thompson wrote:
>>>> Currently when kdb traps printk messages then the raw log level prefix
>>>> (consisting of '\001' followed by a numeral) does not get stripped off
>>>> before the message is issued to the various I/O handlers supported by
>>>> kdb. This causes annoying visual noise as well as causing problems
>>>> grepping for ^. It is also a change of behaviour compared to normal usage
>>>> of printk() usage. For example <SysRq>-h ends up with different to that of
>>>> kdb's "sr h".
>>>>
>>>> This patch addresses the problem by stripping log levels from messages
>>>> before they are issued to the I/O handlers.
>>>
>>> Perhaps instead of stripping the logging level,
>>> maybe a KERN_SOH_ASCII 'char' sequence should be
>>> emitted as '<' 'char' '>' (see: printk:print_prefix)
>>>
>>> Maybe this should be added to stable from v3.6
>>> when KERN_SOH_ASCII was first added.
>>
>> You mean call the problem a regression and try to restore the original
>> 3.5 behaviour?
> 
> Yes.
> 
> I added KERN_SOH_ASCII so to me it's a regression.
> 
>> However I have to confess that I don't really like the old behaviour.
>> I'd view it as contradicting the normal behaviours of consoles
>> (including the kgdbcon console). Why should printk() inside kdb show
>> different text to printk() outside kdb? For me, having <5> and <c>
>> scribbled all over the output of an "sr" command (which I think is
>> probably the heaviest user of printk() inside kdb) never struck me as
>> adding much value.
>>
>> Is the above paragraph convincing?
> 
> I don't use it so I have a useful opinion.
> 
> I don't recall that anyone has reported it in the 
> 2+ years since so it doesn't seem widely used.

Does that arguing against Cc:ing stable@ or you think I should just put
that on anyway and leave it for the stable committee?


> But then again, this is a resend and I don't recall
> seeing it the first time either.
>
>> On the other hand if you really mean "perhaps and maybe" then I'd prefer
>> to leave it as it it.
> 
> Your choice.
> 
> btw: in the patch I suggest using printk_skip_level
> instead of the direct test here:
> 
> +       cp = kdb_buffer;
> +       if (cp[0] == KERN_SOH_ASCII && cp[1] != '\0')
> +               cp += 2;
> 
> so this could be
> 
> 	cp = printk_skip_level(kdb_buffer);

Excellent. I'll do that.
Joe Perches Nov. 7, 2014, 10:10 a.m. UTC | #5
On Fri, 2014-11-07 at 09:57 +0000, Daniel Thompson wrote:

> Does that arguing against Cc:ing stable@ or you think I should just put
> that on anyway and leave it for the stable committee?

It's a regression, I think you should send a fix
for it to stable.  It's up to the stable folks to
figure out if they want to take it.
diff mbox

Patch

diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
index 7c70812..381f297 100644
--- a/kernel/debug/kdb/kdb_io.c
+++ b/kernel/debug/kdb/kdb_io.c
@@ -691,19 +691,22 @@  kdb_printit:
 	 * Write to all consoles.
 	 */
 	retlen = strlen(kdb_buffer);
+	cp = kdb_buffer;
+	if (cp[0] == KERN_SOH_ASCII && cp[1] != '\0')
+		cp += 2;
 	if (!dbg_kdb_mode && kgdb_connected) {
-		gdbstub_msg_write(kdb_buffer, retlen);
+		gdbstub_msg_write(cp, retlen - (cp - kdb_buffer));
 	} else {
 		if (dbg_io_ops && !dbg_io_ops->is_console) {
-			len = retlen;
-			cp = kdb_buffer;
+			len = retlen - (cp - kdb_buffer);
+			cp2 = cp;
 			while (len--) {
-				dbg_io_ops->write_char(*cp);
-				cp++;
+				dbg_io_ops->write_char(*cp2);
+				cp2++;
 			}
 		}
 		while (c) {
-			c->write(c, kdb_buffer, retlen);
+			c->write(c, cp, retlen - (cp - kdb_buffer));
 			touch_nmi_watchdog();
 			c = c->next;
 		}
@@ -711,7 +714,10 @@  kdb_printit:
 	if (logging) {
 		saved_loglevel = console_loglevel;
 		console_loglevel = CONSOLE_LOGLEVEL_SILENT;
-		printk(KERN_INFO "%s", kdb_buffer);
+		if (cp == kdb_buffer)
+			printk(KERN_INFO "%s", kdb_buffer);
+		else
+			printk("%s", kdb_buffer);
 	}

 	if (KDB_STATE(PAGER)) {