CHECK   drivers/tty/serial/cpm_uart/cpm_uart_core.c
drivers/tty/serial/cpm_uart/cpm_uart_core.c:1271:39: warning: context imbalance 
in 'cpm_uart_console_write' - unexpected unlock

Allthough 'nolock' is not expected to change, sparse find the following
form suspicious:

        if (unlikely(nolock)) {
                local_irq_save(flags);
        } else {
                spin_lock_irqsave(&pinfo->port.lock, flags);
        }

        cpm_uart_early_write(pinfo, s, count, true);

        if (unlikely(nolock)) {
                local_irq_restore(flags);
        } else {
                spin_unlock_irqrestore(&pinfo->port.lock, flags);
        }

Rewrite it a more obvious form:

        if (unlikely(oops_in_progress)) {
                local_irq_save(flags);
                cpm_uart_early_write(pinfo, s, count, true);
                local_irq_restore(flags);
        } else {
                spin_lock_irqsave(&pinfo->port.lock, flags);
                cpm_uart_early_write(pinfo, s, count, true);
                spin_unlock_irqrestore(&pinfo->port.lock, flags);
        }

Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu>
---
 drivers/tty/serial/cpm_uart/cpm_uart_core.c | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/tty/serial/cpm_uart/cpm_uart_core.c 
b/drivers/tty/serial/cpm_uart/cpm_uart_core.c
index 66afa9bea6bf..71366a4cea22 100644
--- a/drivers/tty/serial/cpm_uart/cpm_uart_core.c
+++ b/drivers/tty/serial/cpm_uart/cpm_uart_core.c
@@ -1255,19 +1255,14 @@ static void cpm_uart_console_write(struct console *co, 
const char *s,
 {
        struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index];
        unsigned long flags;
-       int nolock = oops_in_progress;
 
-       if (unlikely(nolock)) {
+       if (unlikely(oops_in_progress)) {
                local_irq_save(flags);
-       } else {
-               spin_lock_irqsave(&pinfo->port.lock, flags);
-       }
-
-       cpm_uart_early_write(pinfo, s, count, true);
-
-       if (unlikely(nolock)) {
+               cpm_uart_early_write(pinfo, s, count, true);
                local_irq_restore(flags);
        } else {
+               spin_lock_irqsave(&pinfo->port.lock, flags);
+               cpm_uart_early_write(pinfo, s, count, true);
                spin_unlock_irqrestore(&pinfo->port.lock, flags);
        }
 }
-- 
2.41.0

Reply via email to