]> git.baikalelectronics.ru Git - kernel.git/commit
vt: fix race in vt_waitactive()
authorRabin Vincent <rabin.vincent@stericsson.com>
Mon, 21 May 2012 08:08:42 +0000 (13:38 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 26 Jul 2012 20:37:02 +0000 (13:37 -0700)
commit92ae1f4b3bd75fcfa15125ea94bae9bc9cdd6d89
treea8bcc11178f8d2dda31c4c7ce509a1315d55f87a
parent449b70ad32d3275773a3e036418ca5884d5bebd8
vt: fix race in vt_waitactive()

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: Rabin Vincent <rabin.vincent@stericsson.com>
Acked-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/vt/vt_ioctl.c