| 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:06 +0000 |
| Subject: exit/exec: Seperate mm_release() |
| 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-5-lee.jones@linaro.org> |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| commit 4610ba7ad877fafc0a25a30c6c82015304120426 upstream. |
| |
| mm_release() contains the futex exit handling. mm_release() is called from |
| do_exit()->exit_mm() and from exec()->exec_mm(). |
| |
| In the exit_mm() case PF_EXITING and the futex state is updated. In the |
| exec_mm() case these states are not touched. |
| |
| As the futex exit code needs further protections against exit races, this |
| needs to be split into two functions. |
| |
| 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.240518241@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> |
| --- |
| fs/exec.c | 2 +- |
| include/linux/sched.h | 6 ++++-- |
| kernel/exit.c | 2 +- |
| kernel/fork.c | 12 +++++++++++- |
| 4 files changed, 17 insertions(+), 5 deletions(-) |
| |
| --- a/fs/exec.c |
| +++ b/fs/exec.c |
| @@ -875,7 +875,7 @@ static int exec_mmap(struct mm_struct *m |
| /* Notify parent that we're no longer interested in the old VM */ |
| tsk = current; |
| old_mm = current->mm; |
| - mm_release(tsk, old_mm); |
| + exec_mm_release(tsk, old_mm); |
| |
| if (old_mm) { |
| sync_mm_rss(old_mm); |
| --- a/include/linux/sched.h |
| +++ b/include/linux/sched.h |
| @@ -2647,8 +2647,10 @@ extern struct mm_struct *get_task_mm(str |
| * succeeds. |
| */ |
| extern struct mm_struct *mm_access(struct task_struct *task, unsigned int mode); |
| -/* Remove the current tasks stale references to the old mm_struct */ |
| -extern void mm_release(struct task_struct *, struct mm_struct *); |
| +/* Remove the current tasks stale references to the old mm_struct on exit() */ |
| +extern void exit_mm_release(struct task_struct *, struct mm_struct *); |
| +/* Remove the current tasks stale references to the old mm_struct on exec() */ |
| +extern void exec_mm_release(struct task_struct *, struct mm_struct *); |
| |
| #ifdef CONFIG_HAVE_COPY_THREAD_TLS |
| extern int copy_thread_tls(unsigned long, unsigned long, unsigned long, |
| --- a/kernel/exit.c |
| +++ b/kernel/exit.c |
| @@ -389,7 +389,7 @@ static void exit_mm(struct task_struct * |
| struct mm_struct *mm = tsk->mm; |
| struct core_state *core_state; |
| |
| - mm_release(tsk, mm); |
| + exit_mm_release(tsk, mm); |
| if (!mm) |
| return; |
| sync_mm_rss(mm); |
| --- a/kernel/fork.c |
| +++ b/kernel/fork.c |
| @@ -887,7 +887,7 @@ static int wait_for_vfork_done(struct ta |
| * restoring the old one. . . |
| * Eric Biederman 10 January 1998 |
| */ |
| -void mm_release(struct task_struct *tsk, struct mm_struct *mm) |
| +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); |
| @@ -924,6 +924,16 @@ void mm_release(struct task_struct *tsk, |
| complete_vfork_done(tsk); |
| } |
| |
| +void exit_mm_release(struct task_struct *tsk, struct mm_struct *mm) |
| +{ |
| + mm_release(tsk, mm); |
| +} |
| + |
| +void exec_mm_release(struct task_struct *tsk, struct mm_struct *mm) |
| +{ |
| + mm_release(tsk, mm); |
| +} |
| + |
| /* |
| * Allocate a new mm structure and copy contents from the |
| * mm structure of the passed in task structure. |