Commit 7461a4f7 authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman

powerpc/vdso: Use VDSO size in arch_setup_additional_pages()

In arch_setup_additional_pages(), instead of using number of VDSO
pages and recalculate VDSO size, directly use the VDSO size.

As vdso_ready is set, vdso_pages can't be 0 so just remove the test.
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/4edfa548c3885a430b765335dc720105716e273f.1601197618.git.christophe.leroy@csgroup.eu
parent 4fe0e3c1
...@@ -126,7 +126,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) ...@@ -126,7 +126,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
{ {
struct mm_struct *mm = current->mm; struct mm_struct *mm = current->mm;
struct page **vdso_pagelist; struct page **vdso_pagelist;
unsigned long vdso_pages; unsigned long vdso_size;
unsigned long vdso_base; unsigned long vdso_base;
int rc; int rc;
...@@ -135,11 +135,11 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) ...@@ -135,11 +135,11 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
if (is_32bit_task()) { if (is_32bit_task()) {
vdso_pagelist = vdso32_pagelist; vdso_pagelist = vdso32_pagelist;
vdso_pages = vdso32_pages; vdso_size = &vdso32_end - &vdso32_start;
vdso_base = VDSO32_MBASE; vdso_base = VDSO32_MBASE;
} else { } else {
vdso_pagelist = vdso64_pagelist; vdso_pagelist = vdso64_pagelist;
vdso_pages = vdso64_pages; vdso_size = &vdso64_end - &vdso64_start;
/* /*
* On 64bit we don't have a preferred map address. This * On 64bit we don't have a preferred map address. This
* allows get_unmapped_area to find an area near other mmaps * allows get_unmapped_area to find an area near other mmaps
...@@ -150,13 +150,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) ...@@ -150,13 +150,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
current->mm->context.vdso_base = 0; current->mm->context.vdso_base = 0;
/* vDSO has a problem and was disabled, just don't "enable" it for the
* process
*/
if (vdso_pages == 0)
return 0;
/* Add a page to the vdso size for the data page */ /* Add a page to the vdso size for the data page */
vdso_pages ++; vdso_size += PAGE_SIZE;
/* /*
* pick a base address for the vDSO in process space. We try to put it * pick a base address for the vDSO in process space. We try to put it
...@@ -167,8 +162,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) ...@@ -167,8 +162,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
if (mmap_write_lock_killable(mm)) if (mmap_write_lock_killable(mm))
return -EINTR; return -EINTR;
vdso_base = get_unmapped_area(NULL, vdso_base, vdso_base = get_unmapped_area(NULL, vdso_base,
(vdso_pages << PAGE_SHIFT) + vdso_size + ((VDSO_ALIGNMENT - 1) & PAGE_MASK),
((VDSO_ALIGNMENT - 1) & PAGE_MASK),
0, 0); 0, 0);
if (IS_ERR_VALUE(vdso_base)) { if (IS_ERR_VALUE(vdso_base)) {
rc = vdso_base; rc = vdso_base;
...@@ -195,7 +189,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) ...@@ -195,7 +189,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
* It's fine to use that for setting breakpoints in the vDSO code * It's fine to use that for setting breakpoints in the vDSO code
* pages though. * pages though.
*/ */
rc = install_special_mapping(mm, vdso_base, vdso_pages << PAGE_SHIFT, rc = install_special_mapping(mm, vdso_base, vdso_size,
VM_READ|VM_EXEC| VM_READ|VM_EXEC|
VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,
vdso_pagelist); vdso_pagelist);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment