serial_core: Don't re-initialize a previously initialized spinlock.
authorRandy Witt <rewitt@declaratino.com>
Thu, 17 Oct 2013 20:56:47 +0000 (16:56 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 9 Dec 2013 00:44:21 +0000 (16:44 -0800)
commit42b6a1baa3ec18de2eb15baa250da6203eeb2d39
tree02c53dbbe7be345a2335e0b54c6cc05d01b0ff9e
parentdc1ccc48159d63eca5089e507c82c7d22ef60839
serial_core: Don't re-initialize a previously initialized spinlock.

The uart_set_options() code unconditionally initalizes the spinlock
on the port. This can cause a deadlock in some situations.

One instance that exposed the problem, was when writing to
/sys/module/kgdboc/parameters/kgdboc to use ttyS0 when the console
is already running on ttyS0. If the spinlock is re-initialized
while the lock is held due to output to the console, there
is a deadlock.

Assume the spinlock is initialized if the port is a console.

Signed-off-by: Randy Witt <rewitt@declaratino.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/serial_core.c