From: Hannes Reinecke <hare@suse.de>
To: Petr Mladek <pmladek@suse.cz>
Cc: James Bottomley <jbottomley@parallels.com>,
Christoph Hellwig <hch@infradead.org>,
linux-scsi@vger.kernel.org, Robert Elliott <elliott@hp.com>,
Steven Rostedt <rostedt@goodmis.org>,
Andrew Morton <akpm@linux-foundation.org>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 28/38] Externalize string buffer for printk
Date: Tue, 30 Sep 2014 20:52:40 +0200 [thread overview]
Message-ID: <542AFBF8.1070004@suse.de> (raw)
In-Reply-To: <20140930163931.GG2707@dhcp128.suse.cz>
On 09/30/2014 06:39 PM, Petr Mladek wrote:
> On Mon 29-09-14 13:58:57, Hannes Reinecke wrote:
>> This patch splits off the actual logging from vprintk_emit()
>> into printk_emit_string(), with vprintk_emit() just being a
>> simple wrapper for formatting the message into a
>> static buffer.
>>
>> With that the caller can pass in a local buffer for
>> printk_emit_string() without increasing the overall stack size.
>>
>> Cc: Steven Rostedt <rostedt@goodmis.org>
>> Cc: LKML <linux-kernel@vger.kernel.org>
>
> Adding Andrew into CC here as well.
>
> There is one potential problem, see below.
>
>> Signed-off-by: Hannes Reinecke <hare@suse.de>
>> ---
>> include/linux/printk.h | 5 +++++
>> kernel/printk/printk.c | 36 ++++++++++++++++++++++++------------
>> 2 files changed, 29 insertions(+), 12 deletions(-)
>>
>> diff --git a/include/linux/printk.h b/include/linux/printk.h
>> index d78125f..9639900 100644
>> --- a/include/linux/printk.h
>> +++ b/include/linux/printk.h
>> @@ -130,6 +130,11 @@ int vprintk_emit(int facility, int level,
>> const char *dict, size_t dictlen,
>> const char *fmt, va_list args);
>>
>> +asmlinkage
>> +int printk_emit_string(int facility, int level,
>> + const char *dict, size_t dictlen,
>> + char *textbuf, size_t text_len);
>> +
>> asmlinkage __printf(1, 0)
>> int vprintk(const char *fmt, va_list args);
>>
>> diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
>> index d13675e..303a1fe 100644
>> --- a/kernel/printk/printk.c
>> +++ b/kernel/printk/printk.c
>> @@ -1618,22 +1618,11 @@ asmlinkage int vprintk_emit(int facility, int level,
>> const char *dict, size_t dictlen,
>> const char *fmt, va_list args)
>> {
>> - static int recursion_bug;
>> static char textbuf[LOG_LINE_MAX];
>>
>> char *text = textbuf;
>> size_t text_len = 0;
>> - enum log_flags lflags = 0;
>> - unsigned long flags;
>> - int this_cpu;
>> - int printed_len = 0;
>> - bool in_sched = false;
>> - /* cpu currently holding logbuf_lock in this function */
>> - static volatile unsigned int logbuf_cpu = UINT_MAX;
>>
>> if (level == SCHED_MESSAGE_LOGLEVEL) {
>> - level = -1;
>> - in_sched = true;
>> -
>> /*
>> * The printf needs to come first; we need the syslog
>> * prefix which might be passed-in as a parameter.
>> @@ -1644,6 +1633,24 @@ asmlinkage int vprintk_emit(int facility, int level,
>>
>> text_len += vscnprintf(text + text_len,
>> sizeof(textbuf) - text_len, fmt, args);
>> + return printk_emit_string(facility, level, dict, dictlen,
>> + textbuf, text_len);
>> +}
>> +EXPORT_SYMBOL(vprintk_emit);
>> +
>> +asmlinkage int printk_emit_string(int facility, int level,
>> + const char *dict, size_t dictlen,
>> + char *textbuf, size_t text_len)
>> +{
>> + static int recursion_bug;
>> + char *text = textbuf;
>> + enum log_flags lflags = 0;
>> + unsigned long flags;
>> + int this_cpu;
>> + int printed_len = 0;
>> + bool in_sched = false;
>> + /* cpu currently holding logbuf_lock in this function */
>> + static volatile unsigned int logbuf_cpu = UINT_MAX;
>
> We should make sure that text_len is lower or equal LOG_LINE_MAX.
>
> I am afraid that printk() code is not able to process longer
> lines. For example, syslog_print() does:
>
> text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
>
> Then it calls msg_print_text() that works with entire messages. So,
> any longer message would freeze syslog_print() because it would newer
> fit into the buffer.
>
Ah. Okay, I haven't thought about this. But yes, you are right.
> I guess that there are more locations like this.
>
> Maybe, we should make LOG_LINE_MAX public, so it could be used on the
> other location either to allocate the buffer or to check the size.
>
Well, for starters we should be truncating the buffer to LOG_LINE_MAX in
printk_emit_string().
And document that it will only handle messages up to that length.
I'll be posting an updated patchset.
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
next prev parent reply other threads:[~2014-09-30 18:52 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-29 11:58 [PATCHv3 00/38] scsi logging update Hannes Reinecke
2014-09-29 11:58 ` [PATCH 01/38] Remove scsi_cmd_print_sense_hdr() Hannes Reinecke
2014-09-29 11:58 ` [PATCH 02/38] sd: Remove scsi_print_sense() in sd_done() Hannes Reinecke
2014-09-29 11:58 ` [PATCH 03/38] aha152x: Debug output update and whitespace cleanup Hannes Reinecke
2014-09-29 11:58 ` [PATCH 04/38] scsi: introduce sdev_prefix_printk() Hannes Reinecke
2014-09-29 11:58 ` [PATCH 05/38] scsi: Use sdev as argument for sense code printing Hannes Reinecke
2014-09-29 11:58 ` [PATCH 06/38] acornscsi: use scsi_print_command() Hannes Reinecke
2014-09-29 11:58 ` [PATCH 07/38] fas216: Update logging messages Hannes Reinecke
2014-09-29 11:58 ` [PATCH 08/38] 53c700: remove scsi_print_sense() usage Hannes Reinecke
2014-09-29 11:58 ` [PATCH 09/38] scsi: stop decoding if scsi_normalize_sense() fails Hannes Reinecke
2014-09-29 11:58 ` [PATCH 10/38] scsi: do not decode sense extras Hannes Reinecke
2014-09-29 11:58 ` [PATCH 11/38] scsi: use 'bool' as return value for scsi_normalize_sense() Hannes Reinecke
2014-09-29 11:58 ` [PATCH 12/38] scsi: remove scsi_print_status() Hannes Reinecke
2014-09-29 11:58 ` [PATCH 13/38] Implement scsi_opcode_sa_name Hannes Reinecke
2014-09-29 19:29 ` Douglas Gilbert
2014-09-30 5:50 ` Hannes Reinecke
2014-09-29 11:58 ` [PATCH 14/38] scsi: merge print_opcode_name() Hannes Reinecke
2014-09-29 11:58 ` [PATCH 15/38] scsi: consolidate opcode lookup in scsi_opcode_sa_name() Hannes Reinecke
2014-09-29 11:58 ` [PATCH 16/38] scsi: remove last argument from print_opcode_name() Hannes Reinecke
2014-09-29 11:58 ` [PATCH 17/38] scsi: Remove scsi_print_command when calling abort Hannes Reinecke
2014-09-29 11:58 ` [PATCH 18/38] scsi: separate out scsi_(host|driver)byte_string() Hannes Reinecke
2014-09-29 11:58 ` [PATCH 19/38] sd: Cleanup logging Hannes Reinecke
2014-09-29 11:58 ` [PATCH 20/38] scsi: simplify scsi_log_(send|completion) Hannes Reinecke
2014-09-29 11:58 ` [PATCH 21/38] scsi: fixup logging messages in scsi_error.c Hannes Reinecke
2014-09-29 11:58 ` [PATCH 22/38] scsi: use shost argument in scsi_eh_prt_fail_stats Hannes Reinecke
2014-09-29 11:58 ` [PATCH 23/38] scsi_trace: add tracepoint for completion Hannes Reinecke
2014-09-29 11:58 ` [PATCH 24/38] tracing: Add trace_seq_buffer_ptr() helper function Hannes Reinecke
2014-09-29 11:58 ` [PATCH 25/38] tracing: Create seq_buf layer in trace_seq Hannes Reinecke
2014-09-29 11:58 ` [PATCH 26/38] seq_buf: Move the seq_buf code to lib/ Hannes Reinecke
2014-09-29 14:04 ` Steven Rostedt
2014-09-29 14:08 ` Hannes Reinecke
2014-09-29 11:58 ` [PATCH 27/38] Rearrange buffer formatting in printk() Hannes Reinecke
2014-09-30 16:16 ` Petr Mladek
2014-09-30 19:37 ` Petr Mladek
2014-09-29 11:58 ` [PATCH 28/38] Externalize string buffer for printk Hannes Reinecke
2014-09-30 16:39 ` Petr Mladek
2014-09-30 18:52 ` Hannes Reinecke [this message]
2014-09-29 11:58 ` [PATCH 29/38] Introduce dev_printk_string() and dev_printk_header() Hannes Reinecke
2014-09-29 16:58 ` Greg Kroah-Hartman
2014-09-30 5:48 ` Hannes Reinecke
2014-09-29 11:58 ` [PATCH 30/38] scsi: Use real functions for logging Hannes Reinecke
2014-09-29 11:59 ` [PATCH 31/38] scsi: log request tag for scmd_printk() Hannes Reinecke
2014-09-29 11:59 ` [PATCH 32/38] scsi: use external buffer for command logging Hannes Reinecke
2014-09-29 11:59 ` [PATCH 33/38] libata: use __scsi_print_command() Hannes Reinecke
2014-09-29 14:06 ` Tejun Heo
2014-09-29 14:10 ` Hannes Reinecke
2014-09-29 14:11 ` Tejun Heo
2014-09-29 11:59 ` [PATCH 34/38] scsi: Remove command pointer argument from logging messages Hannes Reinecke
2014-09-29 11:59 ` [PATCH 35/38] scsi: use seq_buf for formatting sense buffer Hannes Reinecke
2014-09-29 11:59 ` [PATCH 36/38] scsi: use seq_buf for formatting scsi_print_result() Hannes Reinecke
2014-09-29 11:59 ` [PATCH 37/38] scsi: Conditionally compile in constants.c Hannes Reinecke
2014-09-29 11:59 ` [PATCH 38/38] scsi_error: document scsi_try_to_abort_cmd Hannes Reinecke
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=542AFBF8.1070004@suse.de \
--to=hare@suse.de \
--cc=akpm@linux-foundation.org \
--cc=elliott@hp.com \
--cc=hch@infradead.org \
--cc=jbottomley@parallels.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=pmladek@suse.cz \
--cc=rostedt@goodmis.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.