Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1422923AbbEOMmh (ORCPT ); Fri, 15 May 2015 08:42:37 -0400 Received: from cantor2.suse.de ([195.135.220.15]:58432 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1422649AbbEOMmf (ORCPT ); Fri, 15 May 2015 08:42:35 -0400 Date: Fri, 15 May 2015 14:45:19 +0200 From: Petr Mladek To: Tejun Heo Cc: akpm@linux-foundation.org, davem@davemloft.net, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Kay Sievers Subject: Re: [PATCH 2/7] printk: factor out message formatting from devkmsg_read() Message-ID: <20150515124518.GC8222@pathway.suse.cz> References: <1431619586-29187-1-git-send-email-tj@kernel.org> <1431619586-29187-3-git-send-email-tj@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1431619586-29187-3-git-send-email-tj@kernel.org> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5970 Lines: 213 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 Reviewed-by: Petr Mladek I like the split of the long function. Best Regards, Petr > Cc: Kay Sievers > Cc: Petr Mladek > --- > 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 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/