| From 7740ec601b1dcb009da47876eddcf5c5e793ce3e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 2 Jan 2019 13:43:22 +0100 |
| Subject: s390/vdso: correct vdso mapping for compat tasks |
| |
| From: Vasily Gorbik <gor@linux.ibm.com> |
| |
| [ Upstream commit 190f056fba230abee80712eb810939ef9a8c462f ] |
| |
| While "s390/vdso: avoid 64-bit vdso mapping for compat tasks" fixed |
| 64-bit vdso mapping for compat tasks under gdb it introduced another |
| problem. "compat_mm" flag is not inherited during fork and when |
| 31-bit process forks a child (but does not perform exec) it ends up |
| with 64-bit vdso. To address that, init_new_context (which is called |
| during fork and exec) now initialize compat_mm based on thread TIF_31BIT |
| flag. Later compat_mm is adjusted in arch_setup_additional_pages, which |
| is called during exec. |
| |
| Fixes: d1befa65823e ("s390/vdso: avoid 64-bit vdso mapping for compat tasks") |
| Reported-by: Stefan Liebler <stli@linux.ibm.com> |
| Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Cc: <stable@vger.kernel.org> # v4.20+ |
| Signed-off-by: Vasily Gorbik <gor@linux.ibm.com> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/s390/include/asm/mmu_context.h | 2 +- |
| arch/s390/kernel/vdso.c | 5 ++--- |
| 2 files changed, 3 insertions(+), 4 deletions(-) |
| |
| diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h |
| index e4462202200d7..8d04e6f3f7964 100644 |
| --- a/arch/s390/include/asm/mmu_context.h |
| +++ b/arch/s390/include/asm/mmu_context.h |
| @@ -25,7 +25,7 @@ static inline int init_new_context(struct task_struct *tsk, |
| atomic_set(&mm->context.flush_count, 0); |
| mm->context.gmap_asce = 0; |
| mm->context.flush_mm = 0; |
| - mm->context.compat_mm = 0; |
| + mm->context.compat_mm = test_thread_flag(TIF_31BIT); |
| #ifdef CONFIG_PGSTE |
| mm->context.alloc_pgste = page_table_allocate_pgste || |
| test_thread_flag(TIF_PGSTE) || |
| diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c |
| index ec31b48a42a52..7ab7d256d1eb7 100644 |
| --- a/arch/s390/kernel/vdso.c |
| +++ b/arch/s390/kernel/vdso.c |
| @@ -224,10 +224,9 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) |
| |
| vdso_pages = vdso64_pages; |
| #ifdef CONFIG_COMPAT |
| - if (is_compat_task()) { |
| + mm->context.compat_mm = is_compat_task(); |
| + if (mm->context.compat_mm) |
| vdso_pages = vdso32_pages; |
| - mm->context.compat_mm = 1; |
| - } |
| #endif |
| /* |
| * vDSO has a problem and was disabled, just don't "enable" it for |
| -- |
| 2.20.1 |
| |