• Thomas Gleixner's avatar
    futex: Prevent inconsistent state and exit race · 4f07ec0d
    Thomas Gleixner authored
    The recent rework of the requeue PI code introduced a possibility for
    going back to user space in inconsistent state:
    
    CPU 0				CPU 1
    
    requeue_futex()
      if (lock_pifutex_user()) {
          dequeue_waiter();
          wake_waiter(task);
    				sched_in(task);
         				return_from_futex_syscall();
    
      ---> Inconsistent state because PI state is not established
    
    It becomes worse if the woken up task immediately exits:
    
    				sys_exit();
    				
          attach_pistate(vpid);	<--- FAIL
    
    
    Attach the pi state before dequeuing and waking the waiter. If the waiter
    gets a spurious wakeup before the dequeue operation it will wait in
    futex_requeue_pi_wakeup_sync() and therefore cannot return and exit.
    
    Fixes: 07d91ef5 ("futex: Prevent requeue_pi() lock nesting issue on RT")
    Reported-by: syzbot+4d1bd0725ef09168e1a0@syzkaller.appspotmail.com
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20210902094414.558914045@linutronix.de
    
    4f07ec0d
futex.c 116 KB