return ret;
 }
 
+/* Constants for the pending_op argument of handle_futex_death */
+#define HANDLE_DEATH_PENDING   true
+#define HANDLE_DEATH_LIST      false
+
 /*
  * Process a futex-list entry, check whether it's owned by the
  * dying task, and do notification if so:
  */
-static int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi)
+static int handle_futex_death(u32 __user *uaddr, struct task_struct *curr,
+                             bool pi, bool pending_op)
 {
        u32 uval, uninitialized_var(nval), mval;
        int err;
        if (get_user(uval, uaddr))
                return -1;
 
+       /*
+        * Special case for regular (non PI) futexes. The unlock path in
+        * user space has two race scenarios:
+        *
+        * 1. The unlock path releases the user space futex value and
+        *    before it can execute the futex() syscall to wake up
+        *    waiters it is killed.
+        *
+        * 2. A woken up waiter is killed before it can acquire the
+        *    futex in user space.
+        *
+        * In both cases the TID validation below prevents a wakeup of
+        * potential waiters which can cause these waiters to block
+        * forever.
+        *
+        * In both cases the following conditions are met:
+        *
+        *      1) task->robust_list->list_op_pending != NULL
+        *         @pending_op == true
+        *      2) User space futex value == 0
+        *      3) Regular futex: @pi == false
+        *
+        * If these conditions are met, it is safe to attempt waking up a
+        * potential waiter without touching the user space futex value and
+        * trying to set the OWNER_DIED bit. The user space futex value is
+        * uncontended and the rest of the user space mutex state is
+        * consistent, so a woken waiter will just take over the
+        * uncontended futex. Setting the OWNER_DIED bit would create
+        * inconsistent state and malfunction of the user space owner died
+        * handling.
+        */
+       if (pending_op && !pi && !uval) {
+               futex_wake(uaddr, 1, 1, FUTEX_BITSET_MATCH_ANY);
+               return 0;
+       }
+
        if ((uval & FUTEX_TID_MASK) != task_pid_vnr(curr))
                return 0;
 
                 * A pending lock might already be on the list, so
                 * don't process it twice:
                 */
-               if (entry != pending)
+               if (entry != pending) {
                        if (handle_futex_death((void __user *)entry + futex_offset,
-                                               curr, pi))
+                                               curr, pi, HANDLE_DEATH_LIST))
                                return;
+               }
                if (rc)
                        return;
                entry = next_entry;
                cond_resched();
        }
 
-       if (pending)
+       if (pending) {
                handle_futex_death((void __user *)pending + futex_offset,
-                                  curr, pip);
+                                  curr, pip, HANDLE_DEATH_PENDING);
+       }
 }
 
 long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
                if (entry != pending) {
                        void __user *uaddr = futex_uaddr(entry, futex_offset);
 
-                       if (handle_futex_death(uaddr, curr, pi))
+                       if (handle_futex_death(uaddr, curr, pi,
+                                              HANDLE_DEATH_LIST))
                                return;
                }
                if (rc)
        if (pending) {
                void __user *uaddr = futex_uaddr(pending, futex_offset);
 
-               handle_futex_death(uaddr, curr, pip);
+               handle_futex_death(uaddr, curr, pip, HANDLE_DEATH_PENDING);
        }
 }