| From foo@baz Mon Feb 1 04:21:37 PM CET 2021 |
| From: Lee Jones <lee.jones@linaro.org> |
| Date: Mon, 1 Feb 2021 15:12:07 +0000 |
| Subject: futex: Split futex_mm_release() for exit/exec |
| To: stable@vger.kernel.org |
| Cc: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@kernel.org>, Peter Zijlstra <peterz@infradead.org>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Lee Jones <lee.jones@linaro.org> |
| Message-ID: <20210201151214.2193508-6-lee.jones@linaro.org> |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| commit 150d71584b12809144b8145b817e83b81158ae5f upstream. |
| |
| 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 |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Lee Jones <lee.jones@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| include/linux/futex.h | 6 ++++-- |
| kernel/fork.c | 5 ++--- |
| kernel/futex.c | 7 ++++++- |
| 3 files changed, 12 insertions(+), 6 deletions(-) |
| |
| --- a/include/linux/futex.h |
| +++ b/include/linux/futex.h |
| @@ -98,13 +98,15 @@ static inline void futex_exit_done(struc |
| 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) { } |
| #endif |
| #endif |
| --- a/kernel/fork.c |
| +++ b/kernel/fork.c |
| @@ -889,9 +889,6 @@ static int wait_for_vfork_done(struct ta |
| */ |
| 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 */ |
| @@ -926,11 +923,13 @@ static void mm_release(struct task_struc |
| |
| 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); |
| } |
| |
| --- a/kernel/futex.c |
| +++ b/kernel/futex.c |
| @@ -3234,7 +3234,7 @@ static void exit_robust_list(struct task |
| curr, pip); |
| } |
| |
| -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); |
| @@ -3252,6 +3252,11 @@ void futex_mm_release(struct task_struct |
| 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) |
| { |