diff options
Diffstat (limited to 'arch/arm/kernel/process.c')
-rw-r--r-- | arch/arm/kernel/process.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 16ed3f7c4980..536c85fe72a8 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -474,17 +474,18 @@ const char *arch_vma_name(struct vm_area_struct *vma) | |||
474 | "[sigpage]" : NULL; | 474 | "[sigpage]" : NULL; |
475 | } | 475 | } |
476 | 476 | ||
477 | static struct page *signal_page; | ||
477 | extern struct page *get_signal_page(void); | 478 | extern struct page *get_signal_page(void); |
478 | 479 | ||
479 | int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | 480 | int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) |
480 | { | 481 | { |
481 | struct mm_struct *mm = current->mm; | 482 | struct mm_struct *mm = current->mm; |
482 | struct page *page; | ||
483 | unsigned long addr; | 483 | unsigned long addr; |
484 | int ret; | 484 | int ret; |
485 | 485 | ||
486 | page = get_signal_page(); | 486 | if (!signal_page) |
487 | if (!page) | 487 | signal_page = get_signal_page(); |
488 | if (!signal_page) | ||
488 | return -ENOMEM; | 489 | return -ENOMEM; |
489 | 490 | ||
490 | down_write(&mm->mmap_sem); | 491 | down_write(&mm->mmap_sem); |
@@ -496,7 +497,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | |||
496 | 497 | ||
497 | ret = install_special_mapping(mm, addr, PAGE_SIZE, | 498 | ret = install_special_mapping(mm, addr, PAGE_SIZE, |
498 | VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC, | 499 | VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC, |
499 | &page); | 500 | &signal_page); |
500 | 501 | ||
501 | if (ret == 0) | 502 | if (ret == 0) |
502 | mm->context.sigpage = addr; | 503 | mm->context.sigpage = addr; |