|
@@ -2510,7 +2510,7 @@ void kmsg_dump(enum kmsg_dump_reason reason)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * kmsg_dump_get_line - retrieve one kmsg log line
|
|
|
+ * kmsg_dump_get_line_nolock - retrieve one kmsg log line (unlocked version)
|
|
|
* @dumper: registered kmsg dumper
|
|
|
* @syslog: include the "<4>" prefixes
|
|
|
* @line: buffer to copy the line to
|
|
@@ -2525,11 +2525,12 @@ void kmsg_dump(enum kmsg_dump_reason reason)
|
|
|
*
|
|
|
* A return value of FALSE indicates that there are no more records to
|
|
|
* read.
|
|
|
+ *
|
|
|
+ * The function is similar to kmsg_dump_get_line(), but grabs no locks.
|
|
|
*/
|
|
|
-bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
|
|
|
- char *line, size_t size, size_t *len)
|
|
|
+bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog,
|
|
|
+ char *line, size_t size, size_t *len)
|
|
|
{
|
|
|
- unsigned long flags;
|
|
|
struct log *msg;
|
|
|
size_t l = 0;
|
|
|
bool ret = false;
|
|
@@ -2537,7 +2538,6 @@ bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
|
|
|
if (!dumper->active)
|
|
|
goto out;
|
|
|
|
|
|
- raw_spin_lock_irqsave(&logbuf_lock, flags);
|
|
|
if (dumper->cur_seq < log_first_seq) {
|
|
|
/* messages are gone, move to first available one */
|
|
|
dumper->cur_seq = log_first_seq;
|
|
@@ -2545,10 +2545,8 @@ bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
|
|
|
}
|
|
|
|
|
|
/* last entry */
|
|
|
- if (dumper->cur_seq >= log_next_seq) {
|
|
|
- raw_spin_unlock_irqrestore(&logbuf_lock, flags);
|
|
|
+ if (dumper->cur_seq >= log_next_seq)
|
|
|
goto out;
|
|
|
- }
|
|
|
|
|
|
msg = log_from_idx(dumper->cur_idx);
|
|
|
l = msg_print_text(msg, 0, syslog, line, size);
|
|
@@ -2556,12 +2554,41 @@ bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
|
|
|
dumper->cur_idx = log_next(dumper->cur_idx);
|
|
|
dumper->cur_seq++;
|
|
|
ret = true;
|
|
|
- raw_spin_unlock_irqrestore(&logbuf_lock, flags);
|
|
|
out:
|
|
|
if (len)
|
|
|
*len = l;
|
|
|
return ret;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * kmsg_dump_get_line - retrieve one kmsg log line
|
|
|
+ * @dumper: registered kmsg dumper
|
|
|
+ * @syslog: include the "<4>" prefixes
|
|
|
+ * @line: buffer to copy the line to
|
|
|
+ * @size: maximum size of the buffer
|
|
|
+ * @len: length of line placed into buffer
|
|
|
+ *
|
|
|
+ * Start at the beginning of the kmsg buffer, with the oldest kmsg
|
|
|
+ * record, and copy one record into the provided buffer.
|
|
|
+ *
|
|
|
+ * Consecutive calls will return the next available record moving
|
|
|
+ * towards the end of the buffer with the youngest messages.
|
|
|
+ *
|
|
|
+ * A return value of FALSE indicates that there are no more records to
|
|
|
+ * read.
|
|
|
+ */
|
|
|
+bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
|
|
|
+ char *line, size_t size, size_t *len)
|
|
|
+{
|
|
|
+ unsigned long flags;
|
|
|
+ bool ret;
|
|
|
+
|
|
|
+ raw_spin_lock_irqsave(&logbuf_lock, flags);
|
|
|
+ ret = kmsg_dump_get_line_nolock(dumper, syslog, line, size, len);
|
|
|
+ raw_spin_unlock_irqrestore(&logbuf_lock, flags);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
EXPORT_SYMBOL_GPL(kmsg_dump_get_line);
|
|
|
|
|
|
/**
|
|
@@ -2663,6 +2690,24 @@ out:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer);
|
|
|
|
|
|
+/**
|
|
|
+ * kmsg_dump_rewind_nolock - reset the interator (unlocked version)
|
|
|
+ * @dumper: registered kmsg dumper
|
|
|
+ *
|
|
|
+ * Reset the dumper's iterator so that kmsg_dump_get_line() and
|
|
|
+ * kmsg_dump_get_buffer() can be called again and used multiple
|
|
|
+ * times within the same dumper.dump() callback.
|
|
|
+ *
|
|
|
+ * The function is similar to kmsg_dump_rewind(), but grabs no locks.
|
|
|
+ */
|
|
|
+void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper)
|
|
|
+{
|
|
|
+ dumper->cur_seq = clear_seq;
|
|
|
+ dumper->cur_idx = clear_idx;
|
|
|
+ dumper->next_seq = log_next_seq;
|
|
|
+ dumper->next_idx = log_next_idx;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* kmsg_dump_rewind - reset the interator
|
|
|
* @dumper: registered kmsg dumper
|
|
@@ -2676,10 +2721,7 @@ void kmsg_dump_rewind(struct kmsg_dumper *dumper)
|
|
|
unsigned long flags;
|
|
|
|
|
|
raw_spin_lock_irqsave(&logbuf_lock, flags);
|
|
|
- dumper->cur_seq = clear_seq;
|
|
|
- dumper->cur_idx = clear_idx;
|
|
|
- dumper->next_seq = log_next_seq;
|
|
|
- dumper->next_idx = log_next_idx;
|
|
|
+ kmsg_dump_rewind_nolock(dumper);
|
|
|
raw_spin_unlock_irqrestore(&logbuf_lock, flags);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(kmsg_dump_rewind);
|