[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20221019145600.1282823-5-john.ogness@linutronix.de>
Date: Wed, 19 Oct 2022 17:01:26 +0206
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,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>
Subject: [PATCH printk v2 04/38] printk: introduce console_is_enabled() wrapper
After switching to SRCU for console list iteration, some readers
will begin accessing console->flags as a data race. This is safe
because there is at most one CPU modifying console->flags and
using rmw operations.
The primary reason for readers to access console->flags is to
check if the console is enabled. Introduce console_is_enabled()
to mark such access as a data race.
Signed-off-by: John Ogness <john.ogness@...utronix.de>
---
include/linux/console.h | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/include/linux/console.h b/include/linux/console.h
index cff86cc615f8..60195cd086dc 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -172,6 +172,26 @@ extern void console_srcu_read_unlock(int cookie);
extern struct hlist_head console_list;
+/**
+ * console_is_enabled - Check if the console is enabled
+ * @con: struct console pointer of console to check
+ *
+ * This should be used instead of manually testing for the CON_ENABLED
+ * bit in the console->flags.
+ *
+ * Context: Any context.
+ */
+static inline bool console_is_enabled(const struct console *con)
+{
+ /*
+ * If SRCU is used, reading of console->flags can be a data
+ * race. However, this is safe because there is at most one
+ * CPU modifying console->flags and it is using only
+ * read-modify-write operations to do so.
+ */
+ return (data_race(READ_ONCE(con->flags)) & CON_ENABLED);
+}
+
/**
* for_each_console_srcu() - Iterator over registered consoles
* @con: struct console pointer used as loop cursor
--
2.30.2
Powered by blists - more mailing lists