From: Petr Mladek <pmladek@suse.com>
To: John Ogness <john.ogness@linutronix.de>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>,
Steven Rostedt <rostedt@goodmis.org>,
Thomas Gleixner <tglx@linutronix.de>,
linux-kernel@vger.kernel.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: Re: [PATCH printk v2 04/38] printk: introduce console_is_enabled() wrapper
Date: Fri, 21 Oct 2022 10:57:57 +0200 [thread overview]
Message-ID: <Y1JfFTAIbcFOrPtD@alley> (raw)
In-Reply-To: <20221019145600.1282823-5-john.ogness@linutronix.de>
On Wed 2022-10-19 17:01:26, John Ogness wrote:
> 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@linutronix.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.
Hmm, I somehow do not understand the explanation. How does
read-modify-write operation make this safe, please?
We are interested into one bit. IMHO, it is not important
if the flags variable is modified atomically or byte by byte.
The important thing is if the reading is synchronized against
modifications.
This function does not do any synchronization on its own.
So, it depends on the caller.
I would personally do two variants. for example:
console_is_enabled()
console_is_enabled_safe()
The first variant would be called in situations where the race
does not matter and the other when it matters.
> + */
> + 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
Best Regards,
Petr
next prev parent reply other threads:[~2022-10-21 8:58 UTC|newest]
Thread overview: 129+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-19 14:55 [PATCH printk v2 00/38] reduce console_lock scope John Ogness
2022-10-19 14:55 ` [PATCH printk v2 01/38] serial: kgdboc: Lock console list in probe function John Ogness
2022-10-19 15:41 ` Greg Kroah-Hartman
2022-10-24 5:22 ` Sergey Senozhatsky
2022-10-25 0:34 ` Doug Anderson
2022-10-19 14:55 ` [PATCH printk v2 02/38] printk: Convert console_drivers list to hlist John Ogness
2022-10-19 15:44 ` Greg Kroah-Hartman
2022-10-19 21:46 ` John Ogness
2022-10-20 7:43 ` Greg Kroah-Hartman
2022-10-20 12:36 ` Petr Mladek
2022-10-24 5:23 ` Sergey Senozhatsky
2022-10-19 14:55 ` [PATCH printk v2 03/38] printk: Prepare for SRCU console list protection John Ogness
2022-10-19 15:16 ` Miguel Ojeda
2022-10-19 17:12 ` Paul E. McKenney
2022-10-21 8:34 ` Petr Mladek
2022-10-31 13:06 ` John Ogness
2022-10-31 14:09 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 04/38] printk: introduce console_is_enabled() wrapper John Ogness
2022-10-19 16:01 ` Greg Kroah-Hartman
2022-10-21 8:57 ` Petr Mladek [this message]
2022-10-21 9:37 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 05/38] printk: use console_is_enabled() John Ogness
2022-10-21 9:25 ` Petr Mladek
2022-10-31 15:39 ` John Ogness
2022-10-19 14:55 ` [PATCH printk v2 06/38] tty: nfcon: " John Ogness
2022-10-21 9:55 ` Petr Mladek
2022-10-31 15:59 ` John Ogness
2022-11-01 8:57 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 07/38] um: kmsg_dump: " John Ogness
2022-10-21 12:46 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 08/38] efi: earlycon: " John Ogness
2022-10-19 15:32 ` Ard Biesheuvel
2022-10-21 12:53 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 09/38] netconsole: " John Ogness
2022-10-21 13:14 ` Petr Mladek
2022-11-04 15:12 ` John Ogness
2022-10-19 14:55 ` [PATCH printk v2 10/38] tty: hvc: " John Ogness
2022-10-19 16:01 ` Greg Kroah-Hartman
2022-10-21 13:22 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 11/38] tty: serial: earlycon: " John Ogness
2022-10-19 16:01 ` Greg Kroah-Hartman
2022-10-21 13:51 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 12/38] tty: serial: kgdboc: " John Ogness
2022-10-19 16:00 ` Greg Kroah-Hartman
2022-10-21 14:10 ` Petr Mladek
2022-10-24 22:46 ` Doug Anderson
2022-10-25 0:49 ` Doug Anderson
2022-10-25 11:28 ` John Ogness
2022-11-04 16:23 ` John Ogness
2022-11-07 8:47 ` Petr Mladek
2022-11-07 9:45 ` John Ogness
2022-10-19 14:55 ` [PATCH printk v2 13/38] tty: serial: pic32_uart: " John Ogness
2022-10-19 16:01 ` Greg Kroah-Hartman
2022-10-21 14:11 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 14/38] tty: serial: samsung_tty: " John Ogness
2022-10-19 16:00 ` Greg Kroah-Hartman
2022-10-21 14:14 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 15/38] tty: serial: serial_core: " John Ogness
2022-10-19 16:00 ` Greg Kroah-Hartman
2022-10-21 14:14 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 16/38] tty: serial: xilinx_uartps: " John Ogness
2022-10-19 16:01 ` Greg Kroah-Hartman
2022-10-21 14:23 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 17/38] tty: tty_io: " John Ogness
2022-10-19 16:00 ` Greg Kroah-Hartman
2022-10-21 14:24 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 18/38] usb: early: xhci-dbc: " John Ogness
2022-10-19 16:01 ` Greg Kroah-Hartman
2022-10-21 14:27 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 19/38] kdb: kdb_io: " John Ogness
2022-10-21 14:28 ` Petr Mladek
2022-10-25 0:34 ` Doug Anderson
2022-10-19 14:55 ` [PATCH printk v2 20/38] um: kmsg_dumper: use srcu console list iterator John Ogness
2022-10-21 14:56 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 21/38] serial: kgdboc: " John Ogness
2022-10-19 16:02 ` Greg Kroah-Hartman
2022-10-21 15:09 ` Petr Mladek
2022-10-25 0:33 ` Doug Anderson
2022-10-19 14:55 ` [PATCH printk v2 22/38] serial: kgdboc: document console_lock usage John Ogness
2022-10-20 7:42 ` Greg Kroah-Hartman
2022-10-25 0:36 ` Doug Anderson
2022-10-25 10:09 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 23/38] tty: tty_io: " John Ogness
2022-10-20 7:43 ` Greg Kroah-Hartman
2022-10-25 13:31 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 24/38] xen: fbfront: use srcu console list iterator John Ogness
2022-10-25 13:39 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 25/38] proc: consoles: document console_lock usage John Ogness
2022-10-25 14:40 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 26/38] kdb: use srcu console list iterator John Ogness
2022-10-25 0:47 ` Doug Anderson
2022-10-25 14:59 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 27/38] printk: console_flush_all: " John Ogness
2022-10-25 15:17 ` Petr Mladek
2022-11-07 0:00 ` John Ogness
2022-11-07 13:03 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 28/38] printk: console_unblank: " John Ogness
2022-10-25 15:28 ` Petr Mladek
2022-10-25 15:31 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 29/38] printk: console_flush_on_panic: " John Ogness
2022-10-25 15:32 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 30/38] printk: console_device: " John Ogness
2022-10-25 15:35 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 31/38] printk: register_console: " John Ogness
2022-10-26 8:20 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 32/38] printk: __pr_flush: " John Ogness
2022-10-26 8:33 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 33/38] printk: introduce console_list_lock John Ogness
2022-10-20 7:53 ` Greg Kroah-Hartman
2022-10-27 10:09 ` Petr Mladek
2022-10-27 18:50 ` Paul E. McKenney
2022-10-28 18:09 ` Boqun Feng
2022-10-28 18:42 ` Paul E. McKenney
2022-11-07 10:10 ` John Ogness
2022-11-07 16:16 ` Paul E. McKenney
2022-10-19 14:55 ` [PATCH printk v2 34/38] serial: kgdboc: use console_list_lock instead of console_lock John Ogness
2022-10-20 7:52 ` Greg Kroah-Hartman
2022-10-27 10:13 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 35/38] tty: tty_io: use console_list_lock for list synchronization John Ogness
2022-10-20 7:43 ` Greg Kroah-Hartman
2022-10-27 10:17 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 36/38] proc: consoles: use console_list_lock for list iteration John Ogness
2022-10-27 12:02 ` Petr Mladek
2022-10-19 14:55 ` [PATCH printk v2 37/38] printk: relieve console_lock of list synchronization duties John Ogness
2022-10-27 12:40 ` Petr Mladek
2022-10-19 14:56 ` [PATCH printk v2 38/38] printk, xen: fbfront: create/use safe function for forcing preferred John Ogness
2022-10-27 13:18 ` Petr Mladek
2022-10-27 13:35 ` John Ogness
2022-10-27 14:27 ` Petr Mladek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y1JfFTAIbcFOrPtD@alley \
--to=pmladek@suse.com \
--cc=gregkh@linuxfoundation.org \
--cc=john.ogness@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=senozhatsky@chromium.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox