lkml.org 
[lkml]   [2022]   [Nov]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH printk v3 35/40] proc: consoles: use console_list_lock for list iteration
    Date
    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 <john.ogness@linutronix.de>
    Reviewed-by: Petr Mladek <pmladek@suse.com>
    ---
    fs/proc/consoles.c | 19 ++++++++++++-------
    1 file changed, 12 insertions(+), 7 deletions(-)

    diff --git a/fs/proc/consoles.c b/fs/proc/consoles.c
    index 46b305fa04ed..e0758fe7936d 100644
    --- a/fs/proc/consoles.c
    +++ b/fs/proc/consoles.c
    @@ -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;
    @@ -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;
    @@ -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 = {
    --
    2.30.2
    \
     
     \ /
      Last update: 2022-11-07 15:20    [W:4.047 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site