tty: tty_io: use console_list_lock for list synchronization
authorJohn Ogness <john.ogness@linutronix.de>
Wed, 16 Nov 2022 16:21:45 +0000 (17:27 +0106)
committerPetr Mladek <pmladek@suse.com>
Fri, 2 Dec 2022 10:25:02 +0000 (11:25 +0100)
show_cons_active() uses the console_lock to gather information
on registered consoles. It requires that no consoles are unregistered
until it is finished. The console_list_lock should be used because
list synchronization responsibility will be removed from the
console_lock in a later change.

Note, the console_lock is still needed to serialize the device()
callback with other console operations.

Signed-off-by: John Ogness <john.ogness@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20221116162152.193147-34-john.ogness@linutronix.de
drivers/tty/tty_io.c

index ee4da2f..cafdff5 100644 (file)
@@ -3527,16 +3527,13 @@ static ssize_t show_cons_active(struct device *dev,
        ssize_t count = 0;
 
        /*
-        * Hold the console_lock to guarantee that no consoles are
+        * Hold the console_list_lock to guarantee that no consoles are
         * unregistered until all console processing is complete.
         * This also allows safe traversal of the console list and
         * race-free reading of @flags.
-        *
-        * Take console_lock to serialize device() callback with
-        * other console operations. For example, fg_console is
-        * modified under console_lock when switching vt.
         */
-       console_lock();
+       console_list_lock();
+
        for_each_console(c) {
                if (!c->device)
                        continue;
@@ -3548,6 +3545,13 @@ static ssize_t show_cons_active(struct device *dev,
                if (i >= ARRAY_SIZE(cs))
                        break;
        }
+
+       /*
+        * Take console_lock to serialize device() callback with
+        * other console operations. For example, fg_console is
+        * modified under console_lock when switching vt.
+        */
+       console_lock();
        while (i--) {
                int index = cs[i]->index;
                struct tty_driver *drv = cs[i]->device(cs[i], &index);
@@ -3563,6 +3567,8 @@ static ssize_t show_cons_active(struct device *dev,
        }
        console_unlock();
 
+       console_list_unlock();
+
        return count;
 }
 static DEVICE_ATTR(active, S_IRUGO, show_cons_active, NULL);