From: Tim Bird <tim.bird@am.sony.com>
To: Guillaume Chazarain <guichaz@yahoo.fr>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Wrong printk return value
Date: Wed, 24 Aug 2005 09:39:42 -0700 [thread overview]
Message-ID: <430CA2CE.4070403@am.sony.com> (raw)
In-Reply-To: <42F08FE6.8000601@yahoo.fr>
Guillaume Chazarain wrote:
> What's the true meaning of the printk return value?
Hi,
I was one of the ones to touch this code last. I
assumed it was meant to represent the number of characters
emitted by printk into the log. This includes any priority
prefix, time prefix and format character expansion.
> Should it include the prioty prefix length of 3? and what about the timing
> information? In both cases it was broken:
>
> The returned length was "length of input string + 3", I made it "length
> of printed string including any prefix".
>
IMHO, it should behave as much like printf as possible,
which means the return value should represent output length
rather than input length. It was already accounting for format
expansion, so it wasn't really returning just "length of input
string + 3" (only in the most simple case). I don't think it matters
that there are other systems down the line that mask part
of the value (such as the priority prefix). Theoretically,
this code could change in the future. printk should stay
as self-contained as possible in terms of its own operation,
and not predict post-processing.
I would argue it shouldn't be "length of printed string", if
by this you mean the thing that dmesg outputs.
Rather, it should be length of string emitted to log buffer.
>
> strace -e write echo 1 > /dev/kmsg
> => write(1, "1\n", 2) = 5
This is not broken, from the standpoint of printk.
But it's weird from the standpoint of kmsg_write.
>
> strace -e write echo "<1>1" > /dev/kmsg
> => write(1, "<1>1\n", 5) = 8
OK, this is wrong. The math got messed up somewhere.
This should have been 5.
> Successful printk calls can have a return value different than the input
> length (priority prefix, timing), so /bin/echo will still think there is
> an error.
> So, to avoid breaking programs that assume write(buff, len) != len is an
> error, /dev/kmsg should return the buffer length when the call succeeds.
>
> The only drawback is that now it's no more possible to use /dev/kmsg to
> check the printk return value :-(
>
>
> ------------------------------------------------------------------------
>
> --- linux-2.6.13-rc5/kernel/printk.c
> +++ linux-2.6.13-rc5/kernel/printk.c
> @@ -553,7 +553,7 @@
> p[1] <= '7' && p[2] == '>') {
> loglev_char = p[1];
> p += 3;
> - printed_len += 3;
> + printed_len -= 3;
> } else {
> loglev_char = default_message_loglevel
> + '0';
> @@ -568,7 +568,7 @@
>
> for (tp = tbuf; tp < tbuf + tlen; tp++)
> emit_log_char(*tp);
> - printed_len += tlen - 3;
> + printed_len += tlen;
> } else {
> if (p[0] != '<' || p[1] < '0' ||
> p[1] > '7' || p[2] != '>') {
> @@ -576,8 +576,8 @@
> emit_log_char(default_message_loglevel
> + '0');
> emit_log_char('>');
> + printed_len += 3;
> }
> - printed_len += 3;
> }
> log_level_unknown = 0;
> if (!*p)
I like the above code since it moves the counting closer
to the emitting, and I think it's easier to understand (and apparently
more correct. ;-) I haven't runtime tested this, but
consider this part to have an:
Acked-By: Tim Bird <tim.bird@am.sony.com>
> --- linux-2.6.13-rc5/drivers/char/mem.c
> +++ linux-2.6.13-rc5/drivers/char/mem.c
> @@ -819,7 +819,7 @@ static ssize_t kmsg_write(struct file *
> size_t count, loff_t *ppos)
> {
> char *tmp;
> - int ret;
> + ssize_t ret;
>
> tmp = kmalloc(count + 1, GFP_KERNEL);
> if (tmp == NULL)
> @@ -828,6 +828,9 @@ static ssize_t kmsg_write(struct file *
> if (!copy_from_user(tmp, buf, count)) {
> tmp[count] = 0;
> ret = printk("%s", tmp);
> + if (ret > count)
> + /* printk can add a prefix */
> + ret = count;
> }
> kfree(tmp);
> return ret;
I'm not sure the side effect of this is. Someone else will
have to comment.
Overall, if this patch didn't get noticed, please consider sending it again.
Thanks,
-- Tim
=============================
Tim Bird
Architecture Group Chair, CE Linux Forum
Senior Staff Engineer, Sony Electronics
=============================
next prev parent reply other threads:[~2005-08-24 16:39 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-03 9:35 [PATCH] Wrong printk return value Guillaume Chazarain
2005-08-24 16:39 ` Tim Bird [this message]
2005-11-15 12:17 ` [-mm PATCH 1/2] printk return value: fix it Guillaume Chazarain
2005-11-15 23:23 ` Tim Bird
2005-11-15 12:18 ` [PATCH 2/2] kmsg_write: don't return printk return value Guillaume Chazarain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=430CA2CE.4070403@am.sony.com \
--to=tim.bird@am.sony.com \
--cc=guichaz@yahoo.fr \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox