diff options
author | Kay Sievers <kay@vrfy.org> | 2012-05-02 20:29:13 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-05-07 19:53:02 -0400 |
commit | 7ff9554bb578ba02166071d2d487b7fc7d860d62 (patch) | |
tree | fcd01f3dadfb451af453300663c60054d3e702cf /include/linux/printk.h | |
parent | 89528127fa5f4aca0483203c87c945555d057770 (diff) |
printk: convert byte-buffer to variable-length record buffer
- Record-based stream instead of the traditional byte stream
buffer. All records carry a 64 bit timestamp, the syslog facility
and priority in the record header.
- Records consume almost the same amount, sometimes less memory than
the traditional byte stream buffer (if printk_time is enabled). The record
header is 16 bytes long, plus some padding bytes at the end if needed.
The byte-stream buffer needed 3 chars for the syslog prefix, 15 char for
the timestamp and a newline.
- Buffer management is based on message sequence numbers. When records
need to be discarded, the reading heads move on to the next full
record. Unlike the byte-stream buffer, no old logged lines get
truncated or partly overwritten by new ones. Sequence numbers also
allow consumers of the log stream to get notified if any message in
the stream they are about to read gets discarded during the time
of reading.
- Better buffered IO support for KERN_CONT continuation lines, when printk()
is called multiple times for a single line. The use of KERN_CONT is now
mandatory to use continuation; a few places in the kernel need trivial fixes
here. The buffering could possibly be extended to per-cpu variables to allow
better thread-safety for multiple printk() invocations for a single line.
- Full-featured syslog facility value support. Different facilities
can tag their messages. All userspace-injected messages enforce a
facility value > 0 now, to be able to reliably distinguish them from
the kernel-generated messages. Independent subsystems like a
baseband processor running its own firmware, or a kernel-related
userspace process can use their own unique facility values. Multiple
independent log streams can co-exist that way in the same
buffer. All share the same global sequence number counter to ensure
proper ordering (and interleaving) and to allow the consumers of the
log to reliably correlate the events from different facilities.
Tested-by: William Douglas <william.douglas@intel.com>
Signed-off-by: Kay Sievers <kay@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux/printk.h')
-rw-r--r-- | include/linux/printk.h | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/include/linux/printk.h b/include/linux/printk.h index 0525927f203f..aa3c66da105c 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h | |||
@@ -95,8 +95,19 @@ extern int printk_needs_cpu(int cpu); | |||
95 | extern void printk_tick(void); | 95 | extern void printk_tick(void); |
96 | 96 | ||
97 | #ifdef CONFIG_PRINTK | 97 | #ifdef CONFIG_PRINTK |
98 | asmlinkage __printf(5, 0) | ||
99 | int vprintk_emit(int facility, int level, | ||
100 | const char *dict, size_t dictlen, | ||
101 | const char *fmt, va_list args); | ||
102 | |||
98 | asmlinkage __printf(1, 0) | 103 | asmlinkage __printf(1, 0) |
99 | int vprintk(const char *fmt, va_list args); | 104 | int vprintk(const char *fmt, va_list args); |
105 | |||
106 | asmlinkage __printf(5, 6) __cold | ||
107 | asmlinkage int printk_emit(int facility, int level, | ||
108 | const char *dict, size_t dictlen, | ||
109 | const char *fmt, ...); | ||
110 | |||
100 | asmlinkage __printf(1, 2) __cold | 111 | asmlinkage __printf(1, 2) __cold |
101 | int printk(const char *fmt, ...); | 112 | int printk(const char *fmt, ...); |
102 | 113 | ||