aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/include/linux/futex.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/futex.h')
-rw-r--r--include/linux/futex.h31
1 files changed, 3 insertions, 28 deletions
diff --git a/include/linux/futex.h b/include/linux/futex.h
index 6414cfaf88e0..9f2792427d64 100644
--- a/include/linux/futex.h
+++ b/include/linux/futex.h
@@ -52,6 +52,7 @@ union futex_key {
#ifdef CONFIG_FUTEX
enum {
FUTEX_STATE_OK,
+ FUTEX_STATE_EXITING,
FUTEX_STATE_DEAD,
};
@@ -66,33 +67,7 @@ static inline void futex_init_task(struct task_struct *tsk)
tsk->futex_state = FUTEX_STATE_OK;
}
-/**
- * futex_exit_done - Sets the tasks futex state to FUTEX_STATE_DEAD
- * @tsk: task to set the state on
- *
- * Set the futex exit state of the task lockless. The futex waiter code
- * observes that state when a task is exiting and loops until the task has
- * actually finished the futex cleanup. The worst case for this is that the
- * waiter runs through the wait loop until the state becomes visible.
- *
- * This has two callers:
- *
- * - futex_mm_release() after the futex exit cleanup has been done
- *
- * - do_exit() from the recursive fault handling path.
- *
- * In case of a recursive fault this is best effort. Either the futex exit
- * code has run already or not. If the OWNER_DIED bit has been set on the
- * futex then the waiter can take it over. If not, the problem is pushed
- * back to user space. If the futex exit code did not run yet, then an
- * already queued waiter might block forever, but there is nothing which
- * can be done about that.
- */
-static inline void futex_exit_done(struct task_struct *tsk)
-{
- tsk->futex_state = FUTEX_STATE_DEAD;
-}
-
+void futex_exit_recursive(struct task_struct *tsk);
void futex_exit_release(struct task_struct *tsk);
void futex_exec_release(struct task_struct *tsk);
@@ -100,7 +75,7 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
u32 __user *uaddr2, u32 val2, u32 val3);
#else
static inline void futex_init_task(struct task_struct *tsk) { }
-static inline void futex_exit_done(struct task_struct *tsk) { }
+static inline void futex_exit_recursive(struct task_struct *tsk) { }
static inline void futex_exit_release(struct task_struct *tsk) { }
static inline void futex_exec_release(struct task_struct *tsk) { }
static inline long do_futex(u32 __user *uaddr, int op, u32 val,