Skip to content

Commit

Permalink
proc: consoles: use console_list_lock for list iteration
Browse files Browse the repository at this point in the history
The console_lock is used in part to guarantee safe list iteration.
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 <[email protected]>
Reviewed-by: Petr Mladek <[email protected]>
Signed-off-by: Petr Mladek <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
  • Loading branch information
jogness authored and pmladek committed Dec 2, 2022
1 parent 7c2af0f commit 28de287
Showing 1 changed file with 12 additions and 7 deletions.
19 changes: 12 additions & 7 deletions fs/proc/consoles.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,16 @@ static int show_console_dev(struct seq_file *m, void *v)
if (con->device) {
const struct tty_driver *driver;
int index;

/*
* 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();
driver = con->device(con, &index);
console_unlock();

if (driver) {
dev = MKDEV(driver->major, driver->minor_start);
dev += index;
Expand Down Expand Up @@ -64,15 +73,11 @@ static void *c_start(struct seq_file *m, loff_t *pos)
loff_t off = 0;

/*
* Take console_lock to serialize device() callback with
* other console operations. For example, fg_console is
* modified under console_lock when switching vt.
*
* Hold the console_lock to guarantee safe traversal of the
* Hold the console_list_lock to guarantee safe traversal of the
* console list. SRCU cannot be used because there is no
* place to store the SRCU cookie.
*/
console_lock();
console_list_lock();
for_each_console(con)
if (off++ == *pos)
break;
Expand All @@ -90,7 +95,7 @@ static void *c_next(struct seq_file *m, void *v, loff_t *pos)

static void c_stop(struct seq_file *m, void *v)
{
console_unlock();
console_list_unlock();
}

static const struct seq_operations consoles_op = {
Expand Down

0 comments on commit 28de287

Please sign in to comment.