[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20221107141638.3790965-40-john.ogness@linutronix.de>
Date: Mon, 7 Nov 2022 15:22:37 +0106
From: John Ogness <john.ogness@...utronix.de>
To: Petr Mladek <pmladek@...e.com>
Cc: Sergey Senozhatsky <senozhatsky@...omium.org>,
Steven Rostedt <rostedt@...dmis.org>,
Thomas Gleixner <tglx@...utronix.de>,
linux-kernel@...r.kernel.org
Subject: [PATCH printk v3 39/40] printk: relieve console_lock of list synchronization duties
The console_list_lock provides synchronization for console list and
console->flags updates. All call sites that were using the console_lock
for this synchronization have either switched to use the
console_list_lock or the SRCU list iterator.
Remove console_lock usage for console list updates and console->flags
updates.
Signed-off-by: John Ogness <john.ogness@...utronix.de>
---
kernel/printk/printk.c | 36 ++++++++++++------------------------
1 file changed, 12 insertions(+), 24 deletions(-)
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index d74e6e609f7d..17765166ac42 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -86,8 +86,8 @@ EXPORT_SYMBOL(oops_in_progress);
static DEFINE_MUTEX(console_mutex);
/*
- * console_sem protects console_list and console->flags updates, and also
- * provides serialization for access to the entire console driver system.
+ * console_sem protects updates to console->seq and console_suspended,
+ * and also provides serialization for console printing.
*/
static DEFINE_SEMAPHORE(console_sem);
HLIST_HEAD(console_list);
@@ -2638,10 +2638,10 @@ static int console_cpu_notify(unsigned int cpu)
}
/**
- * console_lock - lock the console system for exclusive use.
+ * console_lock - block the console subsystem from printing
*
- * Acquires a lock which guarantees that the caller has
- * exclusive access to the console system and console_list.
+ * Acquires a lock which guarantees that no consoles will
+ * be in or enter their write() callback.
*
* Can sleep, returns nothing.
*/
@@ -2658,10 +2658,10 @@ void console_lock(void)
EXPORT_SYMBOL(console_lock);
/**
- * console_trylock - try to lock the console system for exclusive use.
+ * console_trylock - try to block the console subsystem from printing
*
- * Try to acquire a lock which guarantees that the caller has exclusive
- * access to the console system and console_list.
+ * Try to acquire a lock which guarantees that no consoles will
+ * be in or enter their write() callback.
*
* returns 1 on success, and 0 on failure to acquire the lock.
*/
@@ -2917,10 +2917,10 @@ static bool console_flush_all(bool do_cond_resched, u64 *next_seq, bool *handove
}
/**
- * console_unlock - unlock the console system
+ * console_unlock - unblock the console subsystem from printing
*
- * Releases the console_lock which the caller holds on the console system
- * and the console driver list.
+ * Releases the console_lock which the caller holds to block printing of
+ * the console subsystem.
*
* While the console_lock was held, console output may have been buffered
* by printk(). If this is the case, console_unlock(); emits
@@ -3107,9 +3107,7 @@ void console_stop(struct console *console)
{
__pr_flush(console, 1000, true);
console_list_lock();
- console_lock();
WRITE_ONCE(console->flags, console->flags & ~CON_ENABLED);
- console_unlock();
console_list_unlock();
/*
@@ -3125,9 +3123,7 @@ EXPORT_SYMBOL(console_stop);
void console_start(struct console *console)
{
console_list_lock();
- console_lock();
WRITE_ONCE(console->flags, console->flags | CON_ENABLED);
- console_unlock();
console_list_unlock();
__pr_flush(console, 1000, true);
}
@@ -3344,7 +3340,6 @@ void register_console(struct console *newcon)
* Put this console in the list - keep the
* preferred driver at the head of the list.
*/
- console_lock();
if (hlist_empty(&console_list)) {
/* Ensure CON_CONSDEV is always set for the head. */
newcon->flags |= CON_CONSDEV;
@@ -3358,7 +3353,6 @@ void register_console(struct console *newcon)
} else {
hlist_add_behind_rcu(&newcon->node, console_list.first);
}
- console_unlock();
/*
* No need to synchronize SRCU here! The caller does not rely
@@ -3406,15 +3400,11 @@ static int unregister_console_locked(struct console *console)
if (res > 0)
return 0;
- console_lock();
-
/* Disable it unconditionally */
WRITE_ONCE(console->flags, console->flags & ~CON_ENABLED);
- if (!console_is_registered_locked(console)) {
- console_unlock();
+ if (!console_is_registered_locked(console))
return -ENODEV;
- }
hlist_del_init_rcu(&console->node);
@@ -3430,8 +3420,6 @@ static int unregister_console_locked(struct console *console)
if (!hlist_empty(&console_list) && console->flags & CON_CONSDEV)
WRITE_ONCE(console_first()->flags, console_first()->flags | CON_CONSDEV);
- console_unlock();
-
/*
* Ensure that all SRCU list walks have completed. All contexts
* must not be able to see this console in the list so that any
--
2.30.2
Powered by blists - more mailing lists