From: Petr Mladek <pmladek@suse.cz>
To: Tejun Heo <tj@kernel.org>
Cc: akpm@linux-foundation.org, davem@davemloft.net,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
Kay Sievers <kay@vrfy.org>
Subject: Re: [PATCH 2/7] printk: factor out message formatting from devkmsg_read()
Date: Fri, 15 May 2015 14:45:19 +0200 [thread overview]
Message-ID: <20150515124518.GC8222@pathway.suse.cz> (raw)
In-Reply-To: <1431619586-29187-3-git-send-email-tj@kernel.org>
On Thu 2015-05-14 12:06:21, Tejun Heo wrote:
> The extended message formatting used for /dev/kmsg will be used
> implement extended consoles. Factor out msg_print_ext_header() and
> msg_print_ext_body() from devkmsg_read().
>
> This is pure restructuring.
>
> Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Petr Mladek <pmladek@suse.cz>
I like the split of the long function.
Best Regards,
Petr
> Cc: Kay Sievers <kay@vrfy.org>
> Cc: Petr Mladek <pmladek@suse.cz>
> ---
> kernel/printk/printk.c | 146 +++++++++++++++++++++++++++----------------------
> 1 file changed, 80 insertions(+), 66 deletions(-)
>
> diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
> index a115490..51ce4f1 100644
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -511,6 +511,81 @@ static void append_char(char **pp, char *e, char c)
> *(*pp)++ = c;
> }
>
> +static ssize_t msg_print_ext_header(char *buf, size_t size,
> + struct printk_log *msg, u64 seq,
> + enum log_flags prev_flags)
> +{
> + u64 ts_usec = msg->ts_nsec;
> + char cont = '-';
> +
> + do_div(ts_usec, 1000);
> +
> + /*
> + * If we couldn't merge continuation line fragments during the print,
> + * export the stored flags to allow an optional external merge of the
> + * records. Merging the records isn't always neccessarily correct, like
> + * when we hit a race during printing. In most cases though, it produces
> + * better readable output. 'c' in the record flags mark the first
> + * fragment of a line, '+' the following.
> + */
> + if (msg->flags & LOG_CONT && !(prev_flags & LOG_CONT))
> + cont = 'c';
> + else if ((msg->flags & LOG_CONT) ||
> + ((prev_flags & LOG_CONT) && !(msg->flags & LOG_PREFIX)))
> + cont = '+';
> +
> + return scnprintf(buf, size, "%u,%llu,%llu,%c;",
> + (msg->facility << 3) | msg->level, seq, ts_usec, cont);
> +}
> +
> +static ssize_t msg_print_ext_body(char *buf, size_t size,
> + char *dict, size_t dict_len,
> + char *text, size_t text_len)
> +{
> + char *p = buf, *e = buf + size;
> + size_t i;
> +
> + /* escape non-printable characters */
> + for (i = 0; i < text_len; i++) {
> + unsigned char c = text[i];
> +
> + if (c < ' ' || c >= 127 || c == '\\')
> + p += scnprintf(p, e - p, "\\x%02x", c);
> + else
> + append_char(&p, e, c);
> + }
> + append_char(&p, e, '\n');
> +
> + if (dict_len) {
> + bool line = true;
> +
> + for (i = 0; i < dict_len; i++) {
> + unsigned char c = dict[i];
> +
> + if (line) {
> + append_char(&p, e, ' ');
> + line = false;
> + }
> +
> + if (c == '\0') {
> + append_char(&p, e, '\n');
> + line = true;
> + continue;
> + }
> +
> + if (c < ' ' || c >= 127 || c == '\\') {
> + p += scnprintf(p, e - p, "\\x%02x", c);
> + continue;
> + }
> +
> + append_char(&p, e, c);
> + }
> + append_char(&p, e, '\n');
> + }
> +
> + return p - buf;
> +}
> +
> /* /dev/kmsg - userspace message inject/listen interface */
> struct devkmsg_user {
> u64 seq;
> @@ -575,19 +650,12 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
> {
> struct devkmsg_user *user = file->private_data;
> struct printk_log *msg;
> - char *p, *e;
> - u64 ts_usec;
> - size_t i;
> - char cont = '-';
> size_t len;
> ssize_t ret;
>
> if (!user)
> return -EBADF;
>
> - p = user->buf;
> - e = user->buf + sizeof(user->buf);
> -
> ret = mutex_lock_interruptible(&user->lock);
> if (ret)
> return ret;
> @@ -617,71 +685,17 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
> }
>
> msg = log_from_idx(user->idx);
> - ts_usec = msg->ts_nsec;
> - do_div(ts_usec, 1000);
> + len = msg_print_ext_header(user->buf, sizeof(user->buf),
> + msg, user->seq, user->prev);
> + len += msg_print_ext_body(user->buf + len, sizeof(user->buf) - len,
> + log_dict(msg), msg->dict_len,
> + log_text(msg), msg->text_len);
>
> - /*
> - * If we couldn't merge continuation line fragments during the print,
> - * export the stored flags to allow an optional external merge of the
> - * records. Merging the records isn't always neccessarily correct, like
> - * when we hit a race during printing. In most cases though, it produces
> - * better readable output. 'c' in the record flags mark the first
> - * fragment of a line, '+' the following.
> - */
> - if (msg->flags & LOG_CONT && !(user->prev & LOG_CONT))
> - cont = 'c';
> - else if ((msg->flags & LOG_CONT) ||
> - ((user->prev & LOG_CONT) && !(msg->flags & LOG_PREFIX)))
> - cont = '+';
> -
> - p += scnprintf(p, e - p, "%u,%llu,%llu,%c;",
> - (msg->facility << 3) | msg->level,
> - user->seq, ts_usec, cont);
> user->prev = msg->flags;
> -
> - /* escape non-printable characters */
> - for (i = 0; i < msg->text_len; i++) {
> - unsigned char c = log_text(msg)[i];
> -
> - if (c < ' ' || c >= 127 || c == '\\')
> - p += scnprintf(p, e - p, "\\x%02x", c);
> - else
> - append_char(&p, e, c);
> - }
> - append_char(&p, e, '\n');
> -
> - if (msg->dict_len) {
> - bool line = true;
> -
> - for (i = 0; i < msg->dict_len; i++) {
> - unsigned char c = log_dict(msg)[i];
> -
> - if (line) {
> - append_char(&p, e, ' ');
> - line = false;
> - }
> -
> - if (c == '\0') {
> - append_char(&p, e, '\n');
> - line = true;
> - continue;
> - }
> -
> - if (c < ' ' || c >= 127 || c == '\\') {
> - p += scnprintf(p, e - p, "\\x%02x", c);
> - continue;
> - }
> -
> - append_char(&p, e, c);
> - }
> - append_char(&p, e, '\n');
> - }
> -
> user->idx = log_next(user->idx);
> user->seq++;
> raw_spin_unlock_irq(&logbuf_lock);
>
> - len = p - user->buf;
> if (len > count) {
> ret = -EINVAL;
> goto out;
> --
> 2.1.0
>
next prev parent reply other threads:[~2015-05-15 12:42 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-14 16:06 [PATCHSET REPOST] printk, netconsole: implement extended console support Tejun Heo
2015-05-14 16:06 ` [PATCH 1/7] printk: guard the amount written per line by devkmsg_read() Tejun Heo
2015-05-15 12:44 ` Petr Mladek
2015-05-14 16:06 ` [PATCH 2/7] printk: factor out message formatting from devkmsg_read() Tejun Heo
2015-05-15 12:45 ` Petr Mladek [this message]
2015-05-14 16:06 ` [PATCH 3/7] printk: implement support for extended console drivers Tejun Heo
2015-05-15 13:20 ` Petr Mladek
2015-05-14 16:06 ` [PATCH 4/7] netconsole: remove unnecessary netconsole_target_get/out() from write_msg() Tejun Heo
2015-05-14 16:06 ` [PATCH 5/7] netconsole: make netconsole_target->enabled a bool Tejun Heo
2015-05-14 16:06 ` [PATCH 6/7] netconsole: make all dynamic netconsoles share a mutex Tejun Heo
2015-05-14 16:06 ` [PATCH 7/7] netconsole: implement extended console support Tejun Heo
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=20150515124518.GC8222@pathway.suse.cz \
--to=pmladek@suse.cz \
--cc=akpm@linux-foundation.org \
--cc=davem@davemloft.net \
--cc=kay@vrfy.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=tj@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 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.