Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 May 2011 11:26:50 -0700
From:      Julian Elischer <julian@freebsd.org>
To:        "Kenneth D. Merry" <ken@freebsd.org>
Cc:        current@freebsd.org
Subject:   Re: message buffer scrambling fix
Message-ID:  <4DE13E6A.20202@freebsd.org>
In-Reply-To: <20110527224523.GA77922@nargothrond.kdm.org>
References:  <20110527224523.GA77922@nargothrond.kdm.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 5/27/11 3:45 PM, Kenneth D. Merry wrote:
> Hey folks,
>
> I have attached some patches to the kernel message buffer code (this
> affects dmesg(8) output as well as kernel messages that go to the syslog)
> to address log scrambling.
>
> This fixes the same issue that 'options PRINTF_BUFR_SIZE=128' fixes for the
> console.
>
> The problem is that you can have multiple kernel threads writing to the
> message buffer at the same time, and so their characters will get
> interleaved.  All of the characters will get in there, because they're
> written with atomic operations, but the output might looked scrambled.
>
> So the fix is to use the same stack buffer that is used for the console
> output (so the stack size doesn't increase), and use a spin lock instead of
> atomic operations to insert the string into the message buffer.
>
> The result is that dmesg and syslog output should look the same as the
> console output.  As long as individual kernel prints fit in the printf
> buffer size, they will be put into the message buffer atomically.
>
> I also fixed a couple of other long-standing issues.  putcons() (in
> subr_prf.c) was adding a carriage return before calling cnputs().  But
> cnputs() calls cnputc(), which adds a carriage return before every newline.
> So much of the console output (the part that came from putcons() at least)
> had two carriage returns at the end.
>
> The other issue was that log_console() was inserting a newline for any
> console write that didn't already have one at the end.  The issue with that
> can be seen if you do a 'dmesg -a' and compare that to the console output.
>
> You'll see something like this on the console:
>
> Updating motd:.
>
> But this in dmesg -a:
>
> Updating motd:
> .
>
> That is because "Updating motd:" is written first, log_console() appends a
> newline, and then ".\n" is written.
>
> I added a loader tunable and sysctl to turn the old behavior back on
> (kern.log_console_add_linefeed) if you want the old behavior, but I think
> we should be able to safely remove it.
>
> Also, the new msgbuf_addstr() function allows the caller to optionally ask
> for carriage returns to be stripped out.  However, in my testing I haven't
> seen any carriage returns to strip.
>
> Let me know if you have any comments.  I'm planning to check this into head
> next week.

looks good.. as long as we don't end up  with the behaviour that I 
think I see on
Linux (it's hard to tell sometimes) where the last message (the one 
you really
want to see) doesn't make it out.

> Thanks,
>
> Ken
>
>
> _______________________________________________
> freebsd-current@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org"




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4DE13E6A.20202>