diff options
| -rw-r--r-- | arch/x86/vdso/vma.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/arch/x86/vdso/vma.c b/arch/x86/vdso/vma.c index 19a6cfaf5db9..257ba4a10abf 100644 --- a/arch/x86/vdso/vma.c +++ b/arch/x86/vdso/vma.c | |||
| @@ -21,7 +21,8 @@ unsigned int __read_mostly vdso_enabled = 1; | |||
| 21 | extern char vdso_start[], vdso_end[]; | 21 | extern char vdso_start[], vdso_end[]; |
| 22 | extern unsigned short vdso_sync_cpuid; | 22 | extern unsigned short vdso_sync_cpuid; |
| 23 | 23 | ||
| 24 | struct page **vdso_pages; | 24 | static struct page **vdso_pages; |
| 25 | static unsigned vdso_size; | ||
| 25 | 26 | ||
| 26 | static inline void *var_ref(void *p, char *name) | 27 | static inline void *var_ref(void *p, char *name) |
| 27 | { | 28 | { |
| @@ -38,6 +39,7 @@ static int __init init_vdso_vars(void) | |||
| 38 | int i; | 39 | int i; |
| 39 | char *vbase; | 40 | char *vbase; |
| 40 | 41 | ||
| 42 | vdso_size = npages << PAGE_SHIFT; | ||
| 41 | vdso_pages = kmalloc(sizeof(struct page *) * npages, GFP_KERNEL); | 43 | vdso_pages = kmalloc(sizeof(struct page *) * npages, GFP_KERNEL); |
| 42 | if (!vdso_pages) | 44 | if (!vdso_pages) |
| 43 | goto oom; | 45 | goto oom; |
| @@ -101,20 +103,19 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int exstack) | |||
| 101 | struct mm_struct *mm = current->mm; | 103 | struct mm_struct *mm = current->mm; |
| 102 | unsigned long addr; | 104 | unsigned long addr; |
| 103 | int ret; | 105 | int ret; |
| 104 | unsigned len = round_up(vdso_end - vdso_start, PAGE_SIZE); | ||
| 105 | 106 | ||
| 106 | if (!vdso_enabled) | 107 | if (!vdso_enabled) |
| 107 | return 0; | 108 | return 0; |
| 108 | 109 | ||
| 109 | down_write(&mm->mmap_sem); | 110 | down_write(&mm->mmap_sem); |
| 110 | addr = vdso_addr(mm->start_stack, len); | 111 | addr = vdso_addr(mm->start_stack, vdso_size); |
| 111 | addr = get_unmapped_area(NULL, addr, len, 0, 0); | 112 | addr = get_unmapped_area(NULL, addr, vdso_size, 0, 0); |
| 112 | if (IS_ERR_VALUE(addr)) { | 113 | if (IS_ERR_VALUE(addr)) { |
| 113 | ret = addr; | 114 | ret = addr; |
| 114 | goto up_fail; | 115 | goto up_fail; |
| 115 | } | 116 | } |
| 116 | 117 | ||
| 117 | ret = install_special_mapping(mm, addr, len, | 118 | ret = install_special_mapping(mm, addr, vdso_size, |
| 118 | VM_READ|VM_EXEC| | 119 | VM_READ|VM_EXEC| |
| 119 | VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| | 120 | VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| |
| 120 | VM_ALWAYSDUMP, | 121 | VM_ALWAYSDUMP, |
