76 lines
3.3 KiB
Diff
76 lines
3.3 KiB
Diff
|
From: John Ogness <john.ogness@linutronix.de>
|
||
|
Date: Tue, 20 Aug 2024 08:35:38 +0206
|
||
|
Subject: [PATCH 12/54] console: Improve console_srcu_read_flags() comments
|
||
|
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.11/older/patches-6.11-rt7.tar.xz
|
||
|
|
||
|
It was not clear when exactly console_srcu_read_flags() must be
|
||
|
used vs. directly reading @console->flags.
|
||
|
|
||
|
Refactor and clarify that console_srcu_read_flags() is only
|
||
|
needed if the console is registered or the caller is in a
|
||
|
context where the registration status of the console may change
|
||
|
(due to another context).
|
||
|
|
||
|
The function requires the caller holds @console_srcu, which will
|
||
|
ensure that the caller sees an appropriate @flags value for the
|
||
|
registered console and that exit/cleanup routines will not run
|
||
|
if the console is in the process of unregistration.
|
||
|
|
||
|
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||
|
Reviewed-by: Petr Mladek <pmladek@suse.com>
|
||
|
Link: https://lore.kernel.org/r/20240820063001.36405-13-john.ogness@linutronix.de
|
||
|
Signed-off-by: Petr Mladek <pmladek@suse.com>
|
||
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||
|
---
|
||
|
include/linux/console.h | 28 +++++++++++++++++-----------
|
||
|
1 file changed, 17 insertions(+), 11 deletions(-)
|
||
|
|
||
|
--- a/include/linux/console.h
|
||
|
+++ b/include/linux/console.h
|
||
|
@@ -446,28 +446,34 @@ extern void console_list_unlock(void) __
|
||
|
extern struct hlist_head console_list;
|
||
|
|
||
|
/**
|
||
|
- * console_srcu_read_flags - Locklessly read the console flags
|
||
|
+ * console_srcu_read_flags - Locklessly read flags of a possibly registered
|
||
|
+ * console
|
||
|
* @con: struct console pointer of console to read flags from
|
||
|
*
|
||
|
- * This function provides the necessary READ_ONCE() and data_race()
|
||
|
- * notation for locklessly reading the console flags. The READ_ONCE()
|
||
|
- * in this function matches the WRITE_ONCE() when @flags are modified
|
||
|
- * for registered consoles with console_srcu_write_flags().
|
||
|
+ * Locklessly reading @con->flags provides a consistent read value because
|
||
|
+ * there is at most one CPU modifying @con->flags and that CPU is using only
|
||
|
+ * read-modify-write operations to do so.
|
||
|
*
|
||
|
- * Only use this function to read console flags when locklessly
|
||
|
- * iterating the console list via srcu.
|
||
|
+ * Requires console_srcu_read_lock to be held, which implies that @con might
|
||
|
+ * be a registered console. The purpose of holding console_srcu_read_lock is
|
||
|
+ * to guarantee that the console state is valid (CON_SUSPENDED/CON_ENABLED)
|
||
|
+ * and that no exit/cleanup routines will run if the console is currently
|
||
|
+ * undergoing unregistration.
|
||
|
+ *
|
||
|
+ * If the caller is holding the console_list_lock or it is _certain_ that
|
||
|
+ * @con is not and will not become registered, the caller may read
|
||
|
+ * @con->flags directly instead.
|
||
|
*
|
||
|
* Context: Any context.
|
||
|
+ * Return: The current value of the @con->flags field.
|
||
|
*/
|
||
|
static inline short console_srcu_read_flags(const struct console *con)
|
||
|
{
|
||
|
WARN_ON_ONCE(!console_srcu_read_lock_is_held());
|
||
|
|
||
|
/*
|
||
|
- * Locklessly reading console->flags provides a consistent
|
||
|
- * read value because there is at most one CPU modifying
|
||
|
- * console->flags and that CPU is using only read-modify-write
|
||
|
- * operations to do so.
|
||
|
+ * The READ_ONCE() matches the WRITE_ONCE() when @flags are modified
|
||
|
+ * for registered consoles with console_srcu_write_flags().
|
||
|
*/
|
||
|
return data_race(READ_ONCE(con->flags));
|
||
|
}
|