summaryrefslogtreecommitdiff
path: root/patches/0013-printk-remove-logbuf_lock.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/0013-printk-remove-logbuf_lock.patch')
-rw-r--r--patches/0013-printk-remove-logbuf_lock.patch461
1 files changed, 0 insertions, 461 deletions
diff --git a/patches/0013-printk-remove-logbuf_lock.patch b/patches/0013-printk-remove-logbuf_lock.patch
deleted file mode 100644
index 31352c1be84b..000000000000
--- a/patches/0013-printk-remove-logbuf_lock.patch
+++ /dev/null
@@ -1,461 +0,0 @@
-From: John Ogness <john.ogness@linutronix.de>
-Date: Wed, 3 Mar 2021 11:15:26 +0100
-Subject: [PATCH 13/29] printk: remove logbuf_lock
-
-Since the ringbuffer is lockless, there is no need for it to be
-protected by @logbuf_lock. Remove @logbuf_lock.
-
-@console_seq, @exclusive_console_stop_seq, @console_dropped are
-protected by @console_lock.
-
-Signed-off-by: John Ogness <john.ogness@linutronix.de>
-Reviewed-by: Petr Mladek <pmladek@suse.com>
-Signed-off-by: Petr Mladek <pmladek@suse.com>
-Link: https://lore.kernel.org/r/20210303101528.29901-14-john.ogness@linutronix.de
-Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
----
- kernel/printk/internal.h | 4 -
- kernel/printk/printk.c | 112 ++++++++++++++------------------------------
- kernel/printk/printk_safe.c | 27 +++-------
- 3 files changed, 46 insertions(+), 97 deletions(-)
-
---- a/kernel/printk/internal.h
-+++ b/kernel/printk/internal.h
-@@ -12,8 +12,6 @@
-
- #define PRINTK_NMI_CONTEXT_OFFSET 0x010000000
-
--extern raw_spinlock_t logbuf_lock;
--
- __printf(4, 0)
- int vprintk_store(int facility, int level,
- const struct dev_printk_info *dev_info,
-@@ -59,7 +57,7 @@ void defer_console_output(void);
- __printf(1, 0) int vprintk_func(const char *fmt, va_list args) { return 0; }
-
- /*
-- * In !PRINTK builds we still export logbuf_lock spin_lock, console_sem
-+ * In !PRINTK builds we still export console_sem
- * semaphore and some of console functions (console_unlock()/etc.), so
- * printk-safe must preserve the existing local IRQ guarantees.
- */
---- a/kernel/printk/printk.c
-+++ b/kernel/printk/printk.c
-@@ -355,41 +355,6 @@ enum log_flags {
- LOG_CONT = 8, /* text is a fragment of a continuation line */
- };
-
--/*
-- * The logbuf_lock protects kmsg buffer, indices, counters. This can be taken
-- * within the scheduler's rq lock. It must be released before calling
-- * console_unlock() or anything else that might wake up a process.
-- */
--DEFINE_RAW_SPINLOCK(logbuf_lock);
--
--/*
-- * Helper macros to lock/unlock logbuf_lock and switch between
-- * printk-safe/unsafe modes.
-- */
--#define logbuf_lock_irq() \
-- do { \
-- printk_safe_enter_irq(); \
-- raw_spin_lock(&logbuf_lock); \
-- } while (0)
--
--#define logbuf_unlock_irq() \
-- do { \
-- raw_spin_unlock(&logbuf_lock); \
-- printk_safe_exit_irq(); \
-- } while (0)
--
--#define logbuf_lock_irqsave(flags) \
-- do { \
-- printk_safe_enter_irqsave(flags); \
-- raw_spin_lock(&logbuf_lock); \
-- } while (0)
--
--#define logbuf_unlock_irqrestore(flags) \
-- do { \
-- raw_spin_unlock(&logbuf_lock); \
-- printk_safe_exit_irqrestore(flags); \
-- } while (0)
--
- /* syslog_lock protects syslog_* variables and write access to clear_seq. */
- static DEFINE_RAW_SPINLOCK(syslog_lock);
-
-@@ -401,6 +366,7 @@ static u64 syslog_seq;
- static size_t syslog_partial;
- static bool syslog_time;
-
-+/* All 3 protected by @console_sem. */
- /* the next printk record to write to the console */
- static u64 console_seq;
- static u64 exclusive_console_stop_seq;
-@@ -766,27 +732,27 @@ static ssize_t devkmsg_read(struct file
- if (ret)
- return ret;
-
-- logbuf_lock_irq();
-+ printk_safe_enter_irq();
- if (!prb_read_valid(prb, atomic64_read(&user->seq), r)) {
- if (file->f_flags & O_NONBLOCK) {
- ret = -EAGAIN;
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
- goto out;
- }
-
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
- ret = wait_event_interruptible(log_wait,
- prb_read_valid(prb, atomic64_read(&user->seq), r));
- if (ret)
- goto out;
-- logbuf_lock_irq();
-+ printk_safe_enter_irq();
- }
-
- if (r->info->seq != atomic64_read(&user->seq)) {
- /* our last seen message is gone, return error and reset */
- atomic64_set(&user->seq, r->info->seq);
- ret = -EPIPE;
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
- goto out;
- }
-
-@@ -796,7 +762,7 @@ static ssize_t devkmsg_read(struct file
- &r->info->dev_info);
-
- atomic64_set(&user->seq, r->info->seq + 1);
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
-
- if (len > count) {
- ret = -EINVAL;
-@@ -831,7 +797,7 @@ static loff_t devkmsg_llseek(struct file
- if (offset)
- return -ESPIPE;
-
-- logbuf_lock_irq();
-+ printk_safe_enter_irq();
- switch (whence) {
- case SEEK_SET:
- /* the first record */
-@@ -852,7 +818,7 @@ static loff_t devkmsg_llseek(struct file
- default:
- ret = -EINVAL;
- }
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
- return ret;
- }
-
-@@ -867,7 +833,7 @@ static __poll_t devkmsg_poll(struct file
-
- poll_wait(file, &log_wait, wait);
-
-- logbuf_lock_irq();
-+ printk_safe_enter_irq();
- if (prb_read_valid_info(prb, atomic64_read(&user->seq), &info, NULL)) {
- /* return error when data has vanished underneath us */
- if (info.seq != atomic64_read(&user->seq))
-@@ -875,7 +841,7 @@ static __poll_t devkmsg_poll(struct file
- else
- ret = EPOLLIN|EPOLLRDNORM;
- }
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
-
- return ret;
- }
-@@ -908,9 +874,9 @@ static int devkmsg_open(struct inode *in
- prb_rec_init_rd(&user->record, &user->info,
- &user->text_buf[0], sizeof(user->text_buf));
-
-- logbuf_lock_irq();
-+ printk_safe_enter_irq();
- atomic64_set(&user->seq, prb_first_valid_seq(prb));
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
-
- file->private_data = user;
- return 0;
-@@ -1532,11 +1498,11 @@ static int syslog_print(char __user *buf
- size_t n;
- size_t skip;
-
-- logbuf_lock_irq();
-+ printk_safe_enter_irq();
- raw_spin_lock(&syslog_lock);
- if (!prb_read_valid(prb, syslog_seq, &r)) {
- raw_spin_unlock(&syslog_lock);
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
- break;
- }
- if (r.info->seq != syslog_seq) {
-@@ -1566,7 +1532,7 @@ static int syslog_print(char __user *buf
- } else
- n = 0;
- raw_spin_unlock(&syslog_lock);
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
-
- if (!n)
- break;
-@@ -1600,7 +1566,7 @@ static int syslog_print_all(char __user
- return -ENOMEM;
-
- time = printk_time;
-- logbuf_lock_irq();
-+ printk_safe_enter_irq();
- /*
- * Find first record that fits, including all following records,
- * into the user-provided buffer for this dump.
-@@ -1621,12 +1587,12 @@ static int syslog_print_all(char __user
- break;
- }
-
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
- if (copy_to_user(buf + len, text, textlen))
- len = -EFAULT;
- else
- len += textlen;
-- logbuf_lock_irq();
-+ printk_safe_enter_irq();
-
- if (len < 0)
- break;
-@@ -1637,7 +1603,7 @@ static int syslog_print_all(char __user
- latched_seq_write(&clear_seq, seq);
- raw_spin_unlock(&syslog_lock);
- }
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
-
- kfree(text);
- return len;
-@@ -1645,11 +1611,11 @@ static int syslog_print_all(char __user
-
- static void syslog_clear(void)
- {
-- logbuf_lock_irq();
-+ printk_safe_enter_irq();
- raw_spin_lock(&syslog_lock);
- latched_seq_write(&clear_seq, prb_next_seq(prb));
- raw_spin_unlock(&syslog_lock);
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
- }
-
- /* Return a consistent copy of @syslog_seq. */
-@@ -1737,12 +1703,12 @@ int do_syslog(int type, char __user *buf
- break;
- /* Number of chars in the log buffer */
- case SYSLOG_ACTION_SIZE_UNREAD:
-- logbuf_lock_irq();
-+ printk_safe_enter_irq();
- raw_spin_lock(&syslog_lock);
- if (!prb_read_valid_info(prb, syslog_seq, &info, NULL)) {
- /* No unread messages. */
- raw_spin_unlock(&syslog_lock);
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
- return 0;
- }
- if (info.seq != syslog_seq) {
-@@ -1771,7 +1737,7 @@ int do_syslog(int type, char __user *buf
- error -= syslog_partial;
- }
- raw_spin_unlock(&syslog_lock);
-- logbuf_unlock_irq();
-+ printk_safe_exit_irq();
- break;
- /* Size of the log buffer */
- case SYSLOG_ACTION_SIZE_BUFFER:
-@@ -2627,7 +2593,6 @@ void console_unlock(void)
- size_t len;
-
- printk_safe_enter_irqsave(flags);
-- raw_spin_lock(&logbuf_lock);
- skip:
- if (!prb_read_valid(prb, console_seq, &r))
- break;
-@@ -2671,7 +2636,6 @@ void console_unlock(void)
- console_msg_format & MSG_FORMAT_SYSLOG,
- printk_time);
- console_seq++;
-- raw_spin_unlock(&logbuf_lock);
-
- /*
- * While actively printing out messages, if another printk()
-@@ -2698,8 +2662,6 @@ void console_unlock(void)
-
- console_locked = 0;
-
-- raw_spin_unlock(&logbuf_lock);
--
- up_console_sem();
-
- /*
-@@ -2708,9 +2670,7 @@ void console_unlock(void)
- * there's a new owner and the console_unlock() from them will do the
- * flush, no worries.
- */
-- raw_spin_lock(&logbuf_lock);
- retry = prb_read_valid(prb, console_seq, NULL);
-- raw_spin_unlock(&logbuf_lock);
- printk_safe_exit_irqrestore(flags);
-
- if (retry && console_trylock())
-@@ -2777,9 +2737,9 @@ void console_flush_on_panic(enum con_flu
- if (mode == CONSOLE_REPLAY_ALL) {
- unsigned long flags;
-
-- logbuf_lock_irqsave(flags);
-+ printk_safe_enter_irqsave(flags);
- console_seq = prb_first_valid_seq(prb);
-- logbuf_unlock_irqrestore(flags);
-+ printk_safe_exit_irqrestore(flags);
- }
- console_unlock();
- }
-@@ -3008,7 +2968,7 @@ void register_console(struct console *ne
- * console_unlock(); will print out the buffered messages
- * for us.
- */
-- logbuf_lock_irqsave(flags);
-+ printk_safe_enter_irqsave(flags);
- /*
- * We're about to replay the log buffer. Only do this to the
- * just-registered console to avoid excessive message spam to
-@@ -3026,7 +2986,7 @@ void register_console(struct console *ne
- console_seq = syslog_seq;
- raw_spin_unlock(&syslog_lock);
-
-- logbuf_unlock_irqrestore(flags);
-+ printk_safe_exit_irqrestore(flags);
- }
- console_unlock();
- console_sysfs_notify();
-@@ -3492,9 +3452,9 @@ bool kmsg_dump_get_line(struct kmsg_dump
- unsigned long flags;
- bool ret;
-
-- logbuf_lock_irqsave(flags);
-+ printk_safe_enter_irqsave(flags);
- ret = kmsg_dump_get_line_nolock(iter, syslog, line, size, len);
-- logbuf_unlock_irqrestore(flags);
-+ printk_safe_exit_irqrestore(flags);
-
- return ret;
- }
-@@ -3538,7 +3498,7 @@ bool kmsg_dump_get_buffer(struct kmsg_du
- if (iter->cur_seq < min_seq)
- iter->cur_seq = min_seq;
-
-- logbuf_lock_irqsave(flags);
-+ printk_safe_enter_irqsave(flags);
- if (prb_read_valid_info(prb, iter->cur_seq, &info, NULL)) {
- if (info.seq != iter->cur_seq) {
- /* messages are gone, move to first available one */
-@@ -3548,7 +3508,7 @@ bool kmsg_dump_get_buffer(struct kmsg_du
-
- /* last entry */
- if (iter->cur_seq >= iter->next_seq) {
-- logbuf_unlock_irqrestore(flags);
-+ printk_safe_exit_irqrestore(flags);
- goto out;
- }
-
-@@ -3582,7 +3542,7 @@ bool kmsg_dump_get_buffer(struct kmsg_du
-
- iter->next_seq = next_seq;
- ret = true;
-- logbuf_unlock_irqrestore(flags);
-+ printk_safe_exit_irqrestore(flags);
- out:
- if (len_out)
- *len_out = len;
-@@ -3618,9 +3578,9 @@ void kmsg_dump_rewind(struct kmsg_dump_i
- {
- unsigned long flags;
-
-- logbuf_lock_irqsave(flags);
-+ printk_safe_enter_irqsave(flags);
- kmsg_dump_rewind_nolock(iter);
-- logbuf_unlock_irqrestore(flags);
-+ printk_safe_exit_irqrestore(flags);
- }
- EXPORT_SYMBOL_GPL(kmsg_dump_rewind);
-
---- a/kernel/printk/printk_safe.c
-+++ b/kernel/printk/printk_safe.c
-@@ -16,7 +16,7 @@
- #include "internal.h"
-
- /*
-- * printk() could not take logbuf_lock in NMI context. Instead,
-+ * In NMI and safe mode, printk() avoids taking locks. Instead,
- * it uses an alternative implementation that temporary stores
- * the strings into a per-CPU buffer. The content of the buffer
- * is later flushed into the main ring buffer via IRQ work.
-@@ -267,17 +267,9 @@ void printk_safe_flush(void)
- void printk_safe_flush_on_panic(void)
- {
- /*
-- * Make sure that we could access the main ring buffer.
-+ * Make sure that we could access the safe buffers.
- * Do not risk a double release when more CPUs are up.
- */
-- if (raw_spin_is_locked(&logbuf_lock)) {
-- if (num_online_cpus() > 1)
-- return;
--
-- debug_locks_off();
-- raw_spin_lock_init(&logbuf_lock);
-- }
--
- if (raw_spin_is_locked(&safe_read_lock)) {
- if (num_online_cpus() > 1)
- return;
-@@ -319,9 +311,7 @@ void noinstr printk_nmi_exit(void)
- * reordering.
- *
- * It has effect only when called in NMI context. Then printk()
-- * will try to store the messages into the main logbuf directly
-- * and use the per-CPU buffers only as a fallback when the lock
-- * is not available.
-+ * will store the messages into the main logbuf directly.
- */
- void printk_nmi_direct_enter(void)
- {
-@@ -376,20 +366,21 @@ void __printk_safe_exit(void)
- #endif
-
- /*
-- * Try to use the main logbuf even in NMI. But avoid calling console
-+ * Use the main logbuf even in NMI. But avoid calling console
- * drivers that might have their own locks.
- */
-- if ((this_cpu_read(printk_context) & PRINTK_NMI_DIRECT_CONTEXT_MASK) &&
-- raw_spin_trylock(&logbuf_lock)) {
-+ if ((this_cpu_read(printk_context) & PRINTK_NMI_DIRECT_CONTEXT_MASK)) {
-+ unsigned long flags;
- int len;
-
-+ printk_safe_enter_irqsave(flags);
- len = vprintk_store(0, LOGLEVEL_DEFAULT, NULL, fmt, args);
-- raw_spin_unlock(&logbuf_lock);
-+ printk_safe_exit_irqrestore(flags);
- defer_console_output();
- return len;
- }
-
-- /* Use extra buffer in NMI when logbuf_lock is taken or in safe mode. */
-+ /* Use extra buffer in NMI. */
- if (this_cpu_read(printk_context) & PRINTK_NMI_CONTEXT_MASK)
- return vprintk_nmi(fmt, args);
-