]> git.karo-electronics.de Git - karo-tx-linux.git/commit
ENGR00154346 UART: fix uart deadlock
authorZeng Zhaoming <b32542@freescale.com>
Thu, 4 Aug 2011 01:07:32 +0000 (09:07 +0800)
committerOliver Wendt <ow@karo-electronics.de>
Mon, 30 Sep 2013 12:09:25 +0000 (14:09 +0200)
commitb991616bf809080221530d6a44c582e79ceb2a59
tree31d8398726d63c19c18dd968e311eac5da2a1427
parent8efa99b20331697e0c785839eb534cdaf64f4f83
ENGR00154346 UART: fix uart deadlock

UART hold the following locks in order of:

imx_set_termios():
--> spin_lock_irqsave(&sport->port.lock, flags)
    del_timer_sync(&sport->timer);
--> spin_lock(timer->base->lock);
     --> spin_unlock(timer->base->lock);
    spin_unlock_irqrestore(&sport->port.lock);

while when imx_timeout() may invoked in following stack:
run_timer_softirq():
--> spin_lock_irqsave(timer->base->lock, flags);
    imx_timeout();
--> spin_lock_irqsave(&sport->port.lock, flags);
    ...;
--> spin_unlock_irqrestore(&sport->port.lock, flags);
    spin_unlock_irqrestore(timer->base->lock, flags);

the above two cases hold lock with revert order, may
deadlock in SMP platform.

Signed-off-by: Zeng Zhaoming <b32542@freescale.com>
drivers/tty/serial/imx.c