Commit 7c2af0f6 authored by John Ogness's avatar John Ogness Committed by Petr Mladek

tty: tty_io: use console_list_lock for list synchronization

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: default avatarJohn Ogness <john.ogness@linutronix.de>
Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20221116162152.193147-34-john.ogness@linutronix.de
parent 6f883675
...@@ -3527,16 +3527,13 @@ static ssize_t show_cons_active(struct device *dev, ...@@ -3527,16 +3527,13 @@ static ssize_t show_cons_active(struct device *dev,
ssize_t count = 0; 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. * unregistered until all console processing is complete.
* This also allows safe traversal of the console list and * This also allows safe traversal of the console list and
* race-free reading of @flags. * 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) { for_each_console(c) {
if (!c->device) if (!c->device)
continue; continue;
...@@ -3548,6 +3545,13 @@ static ssize_t show_cons_active(struct device *dev, ...@@ -3548,6 +3545,13 @@ static ssize_t show_cons_active(struct device *dev,
if (i >= ARRAY_SIZE(cs)) if (i >= ARRAY_SIZE(cs))
break; 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--) { while (i--) {
int index = cs[i]->index; int index = cs[i]->index;
struct tty_driver *drv = cs[i]->device(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, ...@@ -3563,6 +3567,8 @@ static ssize_t show_cons_active(struct device *dev,
} }
console_unlock(); console_unlock();
console_list_unlock();
return count; return count;
} }
static DEVICE_ATTR(active, S_IRUGO, show_cons_active, NULL); static DEVICE_ATTR(active, S_IRUGO, show_cons_active, NULL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment