• Rabin Vincent's avatar
    vt: fix race in vt_waitactive() · a7b12929
    Rabin Vincent authored
    pm_restore_console() is called from the suspend/resume path, and this
    calls vt_move_to_console(), which calls vt_waitactive().
    
    There's a race in this path which causes the process which requests the
    suspend to sleep indefinitely waiting for an event which already
    happened:
    
    P1                                      P2
     vt_move_to_console()
      set_console()
        schedule_console_callback()
      vt_waitactive()
        check n == fg_console +1
                                           console_callback()
                                             switch_screen()
                                             vt_event_post() // no waiters
    
        vt_event_wait() // forever
    
    Fix the race by ensuring we're registered for the event before we check
    if it's already completed.
    Signed-off-by: default avatarRabin Vincent <rabin.vincent@stericsson.com>
    Acked-by: default avatarAlan Cox <alan@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    a7b12929
vt_ioctl.c 32.8 KB