]> 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)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:33:05 +0000 (08:33 +0200)
commitd541bd45c76689ec30cf8ce6ddb0bb986158c767
tree31d8398726d63c19c18dd968e311eac5da2a1427
parent8dc958f0a41849ea4bdb7cb2684cd5c6f0e6f3ea
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