Thread (10 messages) 10 messages, 4 authors, 2012-06-19

Re: [RFC PATCH] pch_uart: Add eg20t_port lock field, avoid recursive spinlocks

From: Darren Hart <hidden>
Date: 2012-06-05 22:08:15
Also in: lkml


On 06/01/2012 11:36 AM, Darren Hart wrote:

On 06/01/2012 01:30 AM, Tomoya MORINAGA wrote:
quoted
On Thu, May 31, 2012 at 5:54 PM, Darren Hart [off-list ref] wrote:
quoted
@@ -1376,7 +1379,8 @@ static void pch_uart_set_termios(struct uart_port *port,

       baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);

-       spin_lock_irqsave(&port->lock, flags);
+       spin_lock_irqsave(&priv->lock, flags);
+       spin_lock(&port->lock);

       uart_update_timeout(port, termios->c_cflag, baud);
       rtn = pch_uart_hal_set_line(priv, baud, parity, bits, stb);
@@ -1389,7 +1393,8 @@ static void pch_uart_set_termios(struct uart_port *port,
               tty_termios_encode_baud_rate(termios, baud, baud);

 out:
-       spin_unlock_irqrestore(&port->lock, flags);
+       spin_unlock(&port->lock);
+       spin_unlock_irqrestore(&priv->lock, flags);
 }
Are both port->lock and priv->lock really necessary ?
The priv lock protects the pch_uart_hal* calls and the io access.

The port lock protects the uart_update_timeout call. I'm assuming the
8250.c driver is correct in holding the port lock before making this
call and making other modifcations to the port struct.

So yes, I believe both are required. The port->lock was used as the lock
to protect the private data in the interrupt handler,
pch_uart_interrupt. If we could avoid holding that lock across the
entire function, limiting it to just around the pch_uart_hal calls
(perhaps by adding it to the hal calls and adding lockless __pch_uart*
calls) we could avoid the recursive lock that occurs with handle_rx. I
still think a priv-lock is a good idea though, even if just to clarify
what is being protected.

Thoughts?
Are there still concerns about the additional lock? I'll resend V2
tomorrow with the single whitespace fix if I don't hear anything back today.

Thanks,

Darren
quoted
quoted
@@ -1572,7 +1578,9 @@ pch_console_write(struct console *co, const char *s, unsigned int count)

       if (locked)
               spin_unlock(&priv->port.lock);
+       spin_unlock(&priv->lock);
       local_irq_restore(flags);
+
 }
Looks spare blank line.
Thanks, will fix for V2 after this discussion wraps up.
quoted
thanks.
-- 
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help