Skip to content

Commit

Permalink
futex: Split futex_mm_release() for exit/exec
Browse files Browse the repository at this point in the history
To allow separate handling of the futex exit state in the futex exit code
for exit and exec, split futex_mm_release() into two functions and invoke
them from the corresponding exit/exec_mm_release() callsites.

Preparatory only, no functional change.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20191106224556.332094221@linutronix.de
  • Loading branch information
KAGA-KOKO committed Nov 20, 2019
1 parent 4610ba7 commit 150d715
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 6 deletions.
6 changes: 4 additions & 2 deletions include/linux/futex.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,16 @@ static inline void futex_exit_done(struct task_struct *tsk)
tsk->futex_state = FUTEX_STATE_DEAD;
}

void futex_mm_release(struct task_struct *tsk);
void futex_exit_release(struct task_struct *tsk);
void futex_exec_release(struct task_struct *tsk);

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_mm_release(struct task_struct *tsk) { }
static inline void futex_exit_done(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,
ktime_t *timeout, u32 __user *uaddr2,
u32 val2, u32 val3)
Expand Down
5 changes: 2 additions & 3 deletions kernel/fork.c
Original file line number Diff line number Diff line change
Expand Up @@ -1285,9 +1285,6 @@ static int wait_for_vfork_done(struct task_struct *child,
*/
static void mm_release(struct task_struct *tsk, struct mm_struct *mm)
{
/* Get rid of any futexes when releasing the mm */
futex_mm_release(tsk);

uprobe_free_utask(tsk);

/* Get rid of any cached register state */
Expand Down Expand Up @@ -1322,11 +1319,13 @@ static void mm_release(struct task_struct *tsk, struct mm_struct *mm)

void exit_mm_release(struct task_struct *tsk, struct mm_struct *mm)
{
futex_exit_release(tsk);
mm_release(tsk, mm);
}

void exec_mm_release(struct task_struct *tsk, struct mm_struct *mm)
{
futex_exec_release(tsk);
mm_release(tsk, mm);
}

Expand Down
7 changes: 6 additions & 1 deletion kernel/futex.c
Original file line number Diff line number Diff line change
Expand Up @@ -3661,7 +3661,7 @@ static void exit_robust_list(struct task_struct *curr)
}
}

void futex_mm_release(struct task_struct *tsk)
void futex_exec_release(struct task_struct *tsk)
{
if (unlikely(tsk->robust_list)) {
exit_robust_list(tsk);
Expand All @@ -3679,6 +3679,11 @@ void futex_mm_release(struct task_struct *tsk)
exit_pi_state_list(tsk);
}

void futex_exit_release(struct task_struct *tsk)
{
futex_exec_release(tsk);
}

long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
u32 __user *uaddr2, u32 val2, u32 val3)
{
Expand Down

0 comments on commit 150d715

Please sign in to comment.