[PATCH V2 16/23] printk: Add printk_log.c
Move print_log variables and functions into a separate file. Signed-off-by: Joe Perches --- kernel/printk/Makefile |1 + kernel/printk/printk.c | 128 - kernel/printk/printk_log.c | 149 3 files changed, 150 insertions(+), 128 deletions(-) create mode 100644 kernel/printk/printk_log.c diff --git a/kernel/printk/Makefile b/kernel/printk/Makefile index 85405bd..a692b68 100644 --- a/kernel/printk/Makefile +++ b/kernel/printk/Makefile @@ -1,2 +1,3 @@ obj-y = printk.o +obj-y += printk_log.o obj-$(CONFIG_A11Y_BRAILLE_CONSOLE) += braille.o diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 3b18ade..3b5c10e 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -121,12 +121,6 @@ EXPORT_SYMBOL(console_set_on_cmdline); /* Flag: console code may call schedule() */ static int console_may_schedule; -/* - * The printk_logbuf_lock protects kmsg buffer, indices, counters. It is also - * used in interesting ways to provide interlocking in console_unlock(); - */ -DEFINE_RAW_SPINLOCK(printk_logbuf_lock); - #ifdef CONFIG_PRINTK /* the next printk record to read by syslog(READ) or /proc/kmsg */ static u64 syslog_seq; @@ -134,139 +128,17 @@ static u32 syslog_idx; static enum printk_log_flags syslog_prev; static size_t syslog_partial; -/* index and sequence number of the first record stored in the buffer */ -u64 printk_log_first_seq; -u32 printk_log_first_idx; - -/* index and sequence number of the next record to store in the buffer */ -u64 printk_log_next_seq; -u32 printk_log_next_idx; - /* the next printk record to write to the console */ static u64 console_seq; static u32 console_idx; static enum printk_log_flags console_prev; -/* the next printk record to read after the last 'clear' command */ -u64 printk_log_clear_seq; -u32 printk_log_clear_idx; - #define PREFIX_MAX 32 #define LOG_LINE_MAX 1024 - PREFIX_MAX -/* record buffer */ -char __printk_log_buf[__PRINTK_LOG_BUF_LEN] __aligned(PRINTK_LOG_ALIGN); -char *printk_log_buf = __printk_log_buf; -u32 printk_log_buf_len = __PRINTK_LOG_BUF_LEN; - /* cpu currently holding printk_logbuf_lock */ static volatile unsigned int logbuf_cpu = UINT_MAX; -/* human readable text of the record */ -char *printk_log_text(const struct printk_log *msg) -{ - return (char *)msg + sizeof(struct printk_log); -} - -/* optional key/value pair dictionary attached to the record */ -char *printk_log_dict(const struct printk_log *msg) -{ - return (char *)msg + sizeof(struct printk_log) + msg->text_len; -} - -/* get record by index; idx must point to valid msg */ -struct printk_log *printk_log_from_idx(u32 idx) -{ - struct printk_log *msg = (struct printk_log *)(printk_log_buf + idx); - - /* -* A length == 0 record is the end of buffer marker. Wrap around and -* read the message at the start of the buffer. -*/ - if (!msg->len) - return (struct printk_log *)printk_log_buf; - return msg; -} - -/* get next record; idx must point to valid msg */ -u32 printk_log_next(u32 idx) -{ - struct printk_log *msg = (struct printk_log *)(printk_log_buf + idx); - - /* length == 0 indicates the end of the buffer; wrap */ - /* -* A length == 0 record is the end of buffer marker. Wrap around and -* read the message at the start of the buffer as *this* one, and -* return the one after that. -*/ - if (!msg->len) { - msg = (struct printk_log *)printk_log_buf; - return msg->len; - } - return idx + msg->len; -} - -/* insert record into the buffer, discard old ones, update heads */ -void printk_log_store(int facility, int level, - enum printk_log_flags flags, u64 ts_nsec, - const char *dict, u16 dict_len, - const char *text, u16 text_len) -{ - struct printk_log *msg; - u32 size, pad_len; - - /* number of '\0' padding bytes to next message */ - size = sizeof(struct printk_log) + text_len + dict_len; - pad_len = (-size) & (PRINTK_LOG_ALIGN - 1); - size += pad_len; - - while (printk_log_first_seq < printk_log_next_seq) { - u32 free; - - if (printk_log_next_idx > printk_log_first_idx) - free = max(printk_log_buf_len - printk_log_next_idx, printk_log_first_idx); - else - free = printk_log_first_idx - printk_log_next_idx; - - if (free > size + sizeof(struct printk_log)) - break; - - /* drop old messages until we have enough contiuous space */ - printk_log_first_idx = printk_log_next(printk_log_first_idx); - printk_log_first_seq++; - } - - if (printk_log_next_idx + size + sizeof(struct printk_log) >=
[PATCH V2 16/23] printk: Add printk_log.c
Move print_log variables and functions into a separate file. Signed-off-by: Joe Perches j...@perches.com --- kernel/printk/Makefile |1 + kernel/printk/printk.c | 128 - kernel/printk/printk_log.c | 149 3 files changed, 150 insertions(+), 128 deletions(-) create mode 100644 kernel/printk/printk_log.c diff --git a/kernel/printk/Makefile b/kernel/printk/Makefile index 85405bd..a692b68 100644 --- a/kernel/printk/Makefile +++ b/kernel/printk/Makefile @@ -1,2 +1,3 @@ obj-y = printk.o +obj-y += printk_log.o obj-$(CONFIG_A11Y_BRAILLE_CONSOLE) += braille.o diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 3b18ade..3b5c10e 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -121,12 +121,6 @@ EXPORT_SYMBOL(console_set_on_cmdline); /* Flag: console code may call schedule() */ static int console_may_schedule; -/* - * The printk_logbuf_lock protects kmsg buffer, indices, counters. It is also - * used in interesting ways to provide interlocking in console_unlock(); - */ -DEFINE_RAW_SPINLOCK(printk_logbuf_lock); - #ifdef CONFIG_PRINTK /* the next printk record to read by syslog(READ) or /proc/kmsg */ static u64 syslog_seq; @@ -134,139 +128,17 @@ static u32 syslog_idx; static enum printk_log_flags syslog_prev; static size_t syslog_partial; -/* index and sequence number of the first record stored in the buffer */ -u64 printk_log_first_seq; -u32 printk_log_first_idx; - -/* index and sequence number of the next record to store in the buffer */ -u64 printk_log_next_seq; -u32 printk_log_next_idx; - /* the next printk record to write to the console */ static u64 console_seq; static u32 console_idx; static enum printk_log_flags console_prev; -/* the next printk record to read after the last 'clear' command */ -u64 printk_log_clear_seq; -u32 printk_log_clear_idx; - #define PREFIX_MAX 32 #define LOG_LINE_MAX 1024 - PREFIX_MAX -/* record buffer */ -char __printk_log_buf[__PRINTK_LOG_BUF_LEN] __aligned(PRINTK_LOG_ALIGN); -char *printk_log_buf = __printk_log_buf; -u32 printk_log_buf_len = __PRINTK_LOG_BUF_LEN; - /* cpu currently holding printk_logbuf_lock */ static volatile unsigned int logbuf_cpu = UINT_MAX; -/* human readable text of the record */ -char *printk_log_text(const struct printk_log *msg) -{ - return (char *)msg + sizeof(struct printk_log); -} - -/* optional key/value pair dictionary attached to the record */ -char *printk_log_dict(const struct printk_log *msg) -{ - return (char *)msg + sizeof(struct printk_log) + msg-text_len; -} - -/* get record by index; idx must point to valid msg */ -struct printk_log *printk_log_from_idx(u32 idx) -{ - struct printk_log *msg = (struct printk_log *)(printk_log_buf + idx); - - /* -* A length == 0 record is the end of buffer marker. Wrap around and -* read the message at the start of the buffer. -*/ - if (!msg-len) - return (struct printk_log *)printk_log_buf; - return msg; -} - -/* get next record; idx must point to valid msg */ -u32 printk_log_next(u32 idx) -{ - struct printk_log *msg = (struct printk_log *)(printk_log_buf + idx); - - /* length == 0 indicates the end of the buffer; wrap */ - /* -* A length == 0 record is the end of buffer marker. Wrap around and -* read the message at the start of the buffer as *this* one, and -* return the one after that. -*/ - if (!msg-len) { - msg = (struct printk_log *)printk_log_buf; - return msg-len; - } - return idx + msg-len; -} - -/* insert record into the buffer, discard old ones, update heads */ -void printk_log_store(int facility, int level, - enum printk_log_flags flags, u64 ts_nsec, - const char *dict, u16 dict_len, - const char *text, u16 text_len) -{ - struct printk_log *msg; - u32 size, pad_len; - - /* number of '\0' padding bytes to next message */ - size = sizeof(struct printk_log) + text_len + dict_len; - pad_len = (-size) (PRINTK_LOG_ALIGN - 1); - size += pad_len; - - while (printk_log_first_seq printk_log_next_seq) { - u32 free; - - if (printk_log_next_idx printk_log_first_idx) - free = max(printk_log_buf_len - printk_log_next_idx, printk_log_first_idx); - else - free = printk_log_first_idx - printk_log_next_idx; - - if (free size + sizeof(struct printk_log)) - break; - - /* drop old messages until we have enough contiuous space */ - printk_log_first_idx = printk_log_next(printk_log_first_idx); - printk_log_first_seq++; - } - - if (printk_log_next_idx + size + sizeof(struct printk_log) =