Re: [PATCH printk v2 30/38] printk: console_device: use srcu console list iterator

From: Petr Mladek
Date: Tue Oct 25 2022 - 11:35:16 EST


On Wed 2022-10-19 17:01:52, John Ogness wrote:
> Use srcu console list iteration for console list traversal.
>
> Document why the console_lock is still necessary.
>
> Signed-off-by: John Ogness <john.ogness@xxxxxxxxxxxxx>
> ---
> kernel/printk/printk.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
> index e478cb92e7ba..410ad9d5649c 100644
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -3025,15 +3025,24 @@ struct tty_driver *console_device(int *index)
> {
> struct console *c;
> struct tty_driver *driver = NULL;
> + int cookie;
>
> + /*
> + * Stop console printing because the device() callback may
> + * assume the console is not within its write() callback.

Again, I would like to know more details about the possible races
with the write() callback. It is not that obvious.

> + */
> console_lock();
> - for_each_console(c) {
> +
> + cookie = console_srcu_read_lock();
> + for_each_console_srcu(c) {
> if (!c->device)
> continue;
> driver = c->device(c, index);
> if (driver)
> break;
> }
> + console_srcu_read_unlock(cookie);
> +
> console_unlock();
> return driver;

Otherwise, the change looks good.

Best Regards,
Petr