Messages in this thread | | | From | Arnd Bergmann <> | Subject | Re: patch "TTY: remove tty_locked" added to tty tree | Date | Wed, 24 Aug 2011 13:20:47 +0200 |
| |
On Wednesday 24 August 2011, Jiri Slaby wrote: > On 08/24/2011 10:46 AM, Arnd Bergmann wrote: > > On Tuesday 23 August 2011 20:54:08 Jiri Slaby wrote: > >> On 08/23/2011 08:46 PM, Arnd Bergmann wrote:
> > I think I just saw another problem: uart_close takes port->mutex while > > holding the BTM, then calls tty_wait_until_sent(). If this releases > > and reaquires the BTM, you get an AB-BA deadlock with port->mutex. > > Aargh, right. The question is why uart_close takes port->mutex there? It > may take it even right before uart_shutdown. As tty_wait_until_sent (or > uart_wait_until_sent) may be called e.g. from set_termios without that > lock anyway. There are ->tx_empty and ->stop_rx that may need some > protection. But those are register accessors, so they should be > protected by some spinlock to not race with interrupts. Actually stop_rx > is. And empty_rx is only in 8250. > > And I don't see anything else there which would need be protected by the > lock. Do you?
I have not looked at correctness of port->lock before, I just tried to make sure that BTM correctly nests around it when I removed the BKL.
It's not clear to me what state->mutex protects in the serial_core, but it has been around forever (used to be called state->sem) and is held in all uart functions, which is at least consistent. IIRC what Alan's plan for this was, uart_close should eventually get changed to use tty_port_close_start or even tty_port_close. Maybe the time for that has come now, lacking better alternatives?
A lot of other drivers call tty_port_close_start() before taking port->mutex.
Arnd
| |