From: Petr Mladek <pmladek@suse.com>
To: John Ogness <john.ogness@linutronix.de>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>,
Steven Rostedt <rostedt@goodmis.org>,
Thomas Gleixner <tglx@linutronix.de>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH printk v3 6/6] printk: introduce console_prepend_dropped() for dropped messages
Date: Mon, 2 Jan 2023 17:19:26 +0100 [thread overview]
Message-ID: <Y7MEDmP1zqWblj0N@alley> (raw)
In-Reply-To: <20221221202704.857925-7-john.ogness@linutronix.de>
On Wed 2022-12-21 21:33:04, John Ogness wrote:
> Currently "dropped messages" are separately printed immediately
> before printing the printk message. Since normal consoles are
> now using an output buffer that is much larger than previously,
> the "dropped message" could be prepended to the printk message
> and output in a single call.
>
> Introduce a helper function console_prepend_dropped() to prepend
> an existing message with a "dropped message". This simplifies
> the code by allowing all message formatting to be handled
> together and then only requires a single write() call to output
> the full message. And since this helper does not require any
> locking, it can be used in the future for other console printing
> contexts as well.
>
> Signed-off-by: John Ogness <john.ogness@linutronix.de>
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -2724,6 +2699,50 @@ static void __console_unlock(void)
> up_console_sem();
> }
>
> +/*
> + * Prepend the message in @cmsg->cbufs->outbuf with a "dropped message". This
> + * is achieved by shifting the existing message over and inserting the dropped
> + * message.
> + *
> + * @cmsg is the console message to prepend.
> + *
> + * @dropped is the dropped count to report in the dropped message.
> + *
> + * If the message text in @cmsg->cbufs->outbuf does not have enough space for
> + * the dropped message, the message text will be sufficiently truncated.
> + *
> + * If @cmsg->cbufs->outbuf is modified, @cmsg->outbuf_len is updated.
> + */
> +static void console_prepend_dropped(struct console_message *cmsg, unsigned long dropped)
> +{
> + struct console_buffers *cbufs = cmsg->cbufs;
> + const size_t scratchbuf_sz = sizeof(cbufs->scratchbuf);
> + const size_t outbuf_sz = sizeof(cbufs->outbuf);
> + char *scratchbuf = &cbufs->scratchbuf[0];
> + char *outbuf = &cbufs->outbuf[0];
> + size_t len;
> +
> + len = snprintf(scratchbuf, scratchbuf_sz,
> + "** %lu printk messages dropped **\n", dropped);
> +
> + /*
> + * Make sure outbuf is sufficiently large before prepending. Space
> + * for a terminator is also counted in case truncation occurs.
> + */
> + if (WARN_ON_ONCE(len + 1 >= outbuf_sz))
> + return;
Strictly speaking, this should be:
if (WARN_ON_ONCE(len >= outbuf_sz))
return;
The trailing '\0' will fit into the buffer when len < outbuf_sz.
That said, the consoles would be almost unusable when we are anywhere close this
limit. Most messages would be truncated.
> +
> + if (cmsg->outbuf_len + len >= outbuf_sz) {
> + /* Truncate the message, but keep it terminated. */
> + cmsg->outbuf_len = outbuf_sz - (len + 1);
> + outbuf[cmsg->outbuf_len] = 0;
> + }
> +
> + memmove(outbuf + len, outbuf, cmsg->outbuf_len + 1);
> + memcxpy(outbuf, scratchbuf, len);
> + cmsg->outbuf_len += len;
> +}
> +
> /*
> * Read and format the specified record (or a later record if the specified
> * record is not available).
Otherwise, the change looks fine:
Reviewed-by: Petr Mladek <pmladek@suse.com>
Best Regards,
Petr
next prev parent reply other threads:[~2023-01-02 16:19 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-21 20:26 [PATCH printk v3 0/6] printk: cleanup buffer handling John Ogness
2022-12-21 20:26 ` [PATCH printk v3 1/6] printk: move size limit macros into internal.h John Ogness
2023-01-02 14:06 ` Petr Mladek
2022-12-21 20:27 ` [PATCH printk v3 2/6] console: Use BIT() macros for @flags values John Ogness
2022-12-21 20:27 ` [PATCH printk v3 3/6] console: Document struct console John Ogness
2022-12-21 20:27 ` [PATCH printk v3 4/6] printk: introduce struct console_buffers John Ogness
2023-01-02 15:15 ` Petr Mladek
2023-01-03 10:04 ` John Ogness
2022-12-21 20:27 ` [PATCH printk v3 5/6] printk: introduce console_get_next_message() and console_message John Ogness
2022-12-22 15:41 ` John Ogness
2023-01-03 14:04 ` Petr Mladek
2023-01-03 14:57 ` John Ogness
2023-01-03 15:55 ` Petr Mladek
2023-01-04 10:26 ` John Ogness
2023-01-04 10:42 ` Petr Mladek
2023-01-02 15:52 ` Petr Mladek
2023-01-03 15:41 ` John Ogness
2023-01-03 10:02 ` John Ogness
2023-01-03 14:05 ` Petr Mladek
2022-12-21 20:27 ` [PATCH printk v3 6/6] printk: introduce console_prepend_dropped() for dropped messages John Ogness
2023-01-02 16:19 ` Petr Mladek [this message]
2023-01-03 10:20 ` John Ogness
2023-01-03 13:29 ` Petr Mladek
2023-01-03 13:44 ` John Ogness
2023-01-03 14:16 ` Petr Mladek
2023-01-03 15:00 ` John Ogness
2023-01-03 16:13 ` Petr Mladek
2023-01-04 9:06 ` John Ogness
2023-01-04 10:33 ` Petr Mladek
2023-01-05 13:14 ` kernel test robot
2023-01-05 13:55 ` John Ogness
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=Y7MEDmP1zqWblj0N@alley \
--to=pmladek@suse.com \
--cc=john.ogness@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=senozhatsky@chromium.org \
--cc=tglx@linutronix.de \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.