diff options
author | Nathan Lynch <nathan_lynch@mentor.com> | 2014-09-22 17:08:42 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2014-09-26 09:39:59 -0400 |
commit | 02e0409a65560da66a747d2ac6023715b04659ea (patch) | |
tree | bf87c685b08aca372e837ffdb1d0474a3225d6fd /arch/arm/kernel/process.c | |
parent | 75c349062a666deab57bdca8b5bd0779c9fb0d58 (diff) |
ARM: 8154/1: use _install_special_mapping for sigpage
_install_special_mapping allows the VMA to be identifed in
/proc/pid/maps without the use of arch_vma_name, providing a
slight net reduction in object size:
text data bss dec hex filename
2996 96 144 3236 ca4 arch/arm/kernel/process.o (before)
2956 104 144 3204 c84 arch/arm/kernel/process.o (after)
Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/process.c')
-rw-r--r-- | arch/arm/kernel/process.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 81ef686a91ca..46fbbb3701a0 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -472,19 +472,23 @@ int in_gate_area_no_mm(unsigned long addr) | |||
472 | 472 | ||
473 | const char *arch_vma_name(struct vm_area_struct *vma) | 473 | const char *arch_vma_name(struct vm_area_struct *vma) |
474 | { | 474 | { |
475 | return is_gate_vma(vma) ? "[vectors]" : | 475 | return is_gate_vma(vma) ? "[vectors]" : NULL; |
476 | (vma->vm_mm && vma->vm_start == vma->vm_mm->context.sigpage) ? | ||
477 | "[sigpage]" : NULL; | ||
478 | } | 476 | } |
479 | 477 | ||
480 | static struct page *signal_page; | 478 | static struct page *signal_page; |
481 | extern struct page *get_signal_page(void); | 479 | extern struct page *get_signal_page(void); |
482 | 480 | ||
481 | static const struct vm_special_mapping sigpage_mapping = { | ||
482 | .name = "[sigpage]", | ||
483 | .pages = &signal_page, | ||
484 | }; | ||
485 | |||
483 | int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | 486 | int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) |
484 | { | 487 | { |
485 | struct mm_struct *mm = current->mm; | 488 | struct mm_struct *mm = current->mm; |
489 | struct vm_area_struct *vma; | ||
486 | unsigned long addr; | 490 | unsigned long addr; |
487 | int ret; | 491 | int ret = 0; |
488 | 492 | ||
489 | if (!signal_page) | 493 | if (!signal_page) |
490 | signal_page = get_signal_page(); | 494 | signal_page = get_signal_page(); |
@@ -498,12 +502,16 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | |||
498 | goto up_fail; | 502 | goto up_fail; |
499 | } | 503 | } |
500 | 504 | ||
501 | ret = install_special_mapping(mm, addr, PAGE_SIZE, | 505 | vma = _install_special_mapping(mm, addr, PAGE_SIZE, |
502 | VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC, | 506 | VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC, |
503 | &signal_page); | 507 | &sigpage_mapping); |
508 | |||
509 | if (IS_ERR(vma)) { | ||
510 | ret = PTR_ERR(vma); | ||
511 | goto up_fail; | ||
512 | } | ||
504 | 513 | ||
505 | if (ret == 0) | 514 | mm->context.sigpage = addr; |
506 | mm->context.sigpage = addr; | ||
507 | 515 | ||
508 | up_fail: | 516 | up_fail: |
509 | up_write(&mm->mmap_sem); | 517 | up_write(&mm->mmap_sem); |