There will be needed some fixes in the check for free space. They will
be easier if the code is moved outside of the quite long log_store()
function.

This patch does not change the existing behavior.

Signed-off-by: Petr Mladek <pmla...@suse.cz>
---
 kernel/printk/printk.c | 44 +++++++++++++++++++++++++++++---------------
 1 file changed, 29 insertions(+), 15 deletions(-)

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index a45b50962295..cc7d7defce24 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -297,6 +297,34 @@ static u32 log_next(u32 idx)
        return idx + msg->len;
 }
 
+/* check whether there is enough free space for the given message */
+static int logbuf_has_space(u32 msg_size)
+{
+       u32 free;
+
+       if (log_next_idx > log_first_idx)
+               free = max(log_buf_len - log_next_idx, log_first_idx);
+       else
+               free = log_first_idx - log_next_idx;
+
+       /*
+        * We need space also for an empty header that signalizes wrapping
+        * of the buffer.
+        */
+       return free >= msg_size + sizeof(struct printk_log);
+}
+
+static void log_make_free_space(u32 msg_size)
+{
+       while (log_first_seq < log_next_seq) {
+               if (logbuf_has_space(msg_size))
+                       return;
+               /* drop old messages until we have enough continuous space */
+               log_first_idx = log_next(log_first_idx);
+               log_first_seq++;
+       }
+}
+
 /* insert record into the buffer, discard old ones, update heads */
 static void log_store(int facility, int level,
                      enum log_flags flags, u64 ts_nsec,
@@ -311,21 +339,7 @@ static void log_store(int facility, int level,
        pad_len = (-size) & (LOG_ALIGN - 1);
        size += pad_len;
 
-       while (log_first_seq < log_next_seq) {
-               u32 free;
-
-               if (log_next_idx > log_first_idx)
-                       free = max(log_buf_len - log_next_idx, log_first_idx);
-               else
-                       free = log_first_idx - log_next_idx;
-
-               if (free >= size + sizeof(struct printk_log))
-                       break;
-
-               /* drop old messages until we have enough contiuous space */
-               log_first_idx = log_next(log_first_idx);
-               log_first_seq++;
-       }
+       log_make_free_space(size);
 
        if (log_next_idx + size + sizeof(struct printk_log) > log_buf_len) {
                /*
-- 
1.8.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to