• Duoming Zhou's avatar
    arch: xtensa: platforms: Fix deadlock in rs_close() · eb5adc70
    Duoming Zhou authored
    
    
    There is a deadlock in rs_close(), which is shown
    below:
    
       (Thread 1)              |      (Thread 2)
                               | rs_open()
    rs_close()                 |  mod_timer()
     spin_lock_bh() //(1)      |  (wait a time)
     ...                       | rs_poll()
     del_timer_sync()          |  spin_lock() //(2)
     (wait timer to stop)      |  ...
    
    We hold timer_lock in position (1) of thread 1 and
    use del_timer_sync() to wait timer to stop, but timer handler
    also need timer_lock in position (2) of thread 2.
    As a result, rs_close() will block forever.
    
    This patch deletes the redundant timer_lock in order to
    prevent the deadlock. Because there is no race condition
    between rs_close, rs_open and rs_poll.
    Signed-off-by: default avatarDuoming Zhou <duoming@zju.edu.cn>
    Message-Id: <20220407154430.22387-1-duoming@zju.edu.cn>
    Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
    eb5adc70
console.c 4.77 KB