diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/ppc64/kernel/vdso.c | 12 | ||||
-rw-r--r-- | arch/sparc/mm/generic.c | 3 | ||||
-rw-r--r-- | arch/sparc64/mm/generic.c | 3 |
3 files changed, 13 insertions, 5 deletions
diff --git a/arch/ppc64/kernel/vdso.c b/arch/ppc64/kernel/vdso.c index efa985f05aca..4aacf521e3e4 100644 --- a/arch/ppc64/kernel/vdso.c +++ b/arch/ppc64/kernel/vdso.c | |||
@@ -176,13 +176,13 @@ static struct page * vdso_vma_nopage(struct vm_area_struct * vma, | |||
176 | return NOPAGE_SIGBUS; | 176 | return NOPAGE_SIGBUS; |
177 | 177 | ||
178 | /* | 178 | /* |
179 | * Last page is systemcfg, special handling here, no get_page() a | 179 | * Last page is systemcfg. |
180 | * this is a reserved page | ||
181 | */ | 180 | */ |
182 | if ((vma->vm_end - address) <= PAGE_SIZE) | 181 | if ((vma->vm_end - address) <= PAGE_SIZE) |
183 | return virt_to_page(systemcfg); | 182 | pg = virt_to_page(systemcfg); |
183 | else | ||
184 | pg = virt_to_page(vbase + offset); | ||
184 | 185 | ||
185 | pg = virt_to_page(vbase + offset); | ||
186 | get_page(pg); | 186 | get_page(pg); |
187 | DBG(" ->page count: %d\n", page_count(pg)); | 187 | DBG(" ->page count: %d\n", page_count(pg)); |
188 | 188 | ||
@@ -259,7 +259,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int executable_stack) | |||
259 | * gettimeofday will be totally dead. It's fine to use that for setting | 259 | * gettimeofday will be totally dead. It's fine to use that for setting |
260 | * breakpoints in the vDSO code pages though | 260 | * breakpoints in the vDSO code pages though |
261 | */ | 261 | */ |
262 | vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC; | 262 | vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC | VM_RESERVED; |
263 | vma->vm_flags |= mm->def_flags; | 263 | vma->vm_flags |= mm->def_flags; |
264 | vma->vm_page_prot = protection_map[vma->vm_flags & 0x7]; | 264 | vma->vm_page_prot = protection_map[vma->vm_flags & 0x7]; |
265 | vma->vm_ops = &vdso_vmops; | 265 | vma->vm_ops = &vdso_vmops; |
@@ -603,6 +603,8 @@ void __init vdso_init(void) | |||
603 | ClearPageReserved(pg); | 603 | ClearPageReserved(pg); |
604 | get_page(pg); | 604 | get_page(pg); |
605 | } | 605 | } |
606 | |||
607 | get_page(virt_to_page(systemcfg)); | ||
606 | } | 608 | } |
607 | 609 | ||
608 | int in_gate_area_no_task(unsigned long addr) | 610 | int in_gate_area_no_task(unsigned long addr) |
diff --git a/arch/sparc/mm/generic.c b/arch/sparc/mm/generic.c index 20ccb957fb77..659c9a71f867 100644 --- a/arch/sparc/mm/generic.c +++ b/arch/sparc/mm/generic.c | |||
@@ -73,6 +73,9 @@ int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from, | |||
73 | int space = GET_IOSPACE(pfn); | 73 | int space = GET_IOSPACE(pfn); |
74 | unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT; | 74 | unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT; |
75 | 75 | ||
76 | /* See comment in mm/memory.c remap_pfn_range */ | ||
77 | vma->vm_flags |= VM_IO | VM_RESERVED; | ||
78 | |||
76 | prot = __pgprot(pg_iobits); | 79 | prot = __pgprot(pg_iobits); |
77 | offset -= from; | 80 | offset -= from; |
78 | dir = pgd_offset(mm, from); | 81 | dir = pgd_offset(mm, from); |
diff --git a/arch/sparc64/mm/generic.c b/arch/sparc64/mm/generic.c index c954d91f01d0..afc01cec701f 100644 --- a/arch/sparc64/mm/generic.c +++ b/arch/sparc64/mm/generic.c | |||
@@ -127,6 +127,9 @@ int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from, | |||
127 | int space = GET_IOSPACE(pfn); | 127 | int space = GET_IOSPACE(pfn); |
128 | unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT; | 128 | unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT; |
129 | 129 | ||
130 | /* See comment in mm/memory.c remap_pfn_range */ | ||
131 | vma->vm_flags |= VM_IO | VM_RESERVED; | ||
132 | |||
130 | prot = __pgprot(pg_iobits); | 133 | prot = __pgprot(pg_iobits); |
131 | offset -= from; | 134 | offset -= from; |
132 | dir = pgd_offset(mm, from); | 135 | dir = pgd_offset(mm, from); |