tty/hvc_console: fix console lock ordering with spinlock
authorDenis Kirjanov <kda@linux-powerpc.org>
Thu, 30 Mar 2017 14:06:19 +0000 (10:06 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 31 Mar 2017 09:37:13 +0000 (11:37 +0200)
hvc_remove() takes a spin lock first then acquires the console
semaphore. This situation can easily lead to a deadlock scenario
where we call scheduler with spin lock held.

Signed-off-by: Denis Kirjanov <kda@linux-powerpc.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/hvc/hvc_console.c

index b19ae36a05ec753c4edade42ff1f55c036a28c8a..a8d399188242efe428bb579f845b716396465d9f 100644 (file)
@@ -920,17 +920,17 @@ int hvc_remove(struct hvc_struct *hp)
 
        tty = tty_port_tty_get(&hp->port);
 
+       console_lock();
        spin_lock_irqsave(&hp->lock, flags);
        if (hp->index < MAX_NR_HVC_CONSOLES) {
-               console_lock();
                vtermnos[hp->index] = -1;
                cons_ops[hp->index] = NULL;
-               console_unlock();
        }
 
        /* Don't whack hp->irq because tty_hangup() will need to free the irq. */
 
        spin_unlock_irqrestore(&hp->lock, flags);
+       console_unlock();
 
        /*
         * We 'put' the instance that was grabbed when the kref instance