diff options
-rw-r--r-- | arch/ia64/kernel/ia64_ksyms.c | 1 | ||||
-rw-r--r-- | arch/ia64/kernel/kprobes.c | 2 | ||||
-rw-r--r-- | arch/ia64/kernel/traps.c | 18 | ||||
-rw-r--r-- | drivers/message/fusion/mptbase.c | 6 | ||||
-rw-r--r-- | drivers/message/fusion/mptbase.h | 2 | ||||
-rw-r--r-- | fs/exec.c | 12 | ||||
-rw-r--r-- | include/asm-ia64/page.h | 3 | ||||
-rw-r--r-- | include/linux/mm.h | 2 | ||||
-rw-r--r-- | mm/fremap.c | 24 | ||||
-rw-r--r-- | mm/memory.c | 48 |
10 files changed, 44 insertions, 74 deletions
diff --git a/arch/ia64/kernel/ia64_ksyms.c b/arch/ia64/kernel/ia64_ksyms.c index 01572814abe4..5db9d3bcbbcb 100644 --- a/arch/ia64/kernel/ia64_ksyms.c +++ b/arch/ia64/kernel/ia64_ksyms.c | |||
@@ -42,6 +42,7 @@ EXPORT_SYMBOL(clear_page); | |||
42 | 42 | ||
43 | #ifdef CONFIG_VIRTUAL_MEM_MAP | 43 | #ifdef CONFIG_VIRTUAL_MEM_MAP |
44 | #include <linux/bootmem.h> | 44 | #include <linux/bootmem.h> |
45 | EXPORT_SYMBOL(min_low_pfn); /* defined by bootmem.c, but not exported by generic code */ | ||
45 | EXPORT_SYMBOL(max_low_pfn); /* defined by bootmem.c, but not exported by generic code */ | 46 | EXPORT_SYMBOL(max_low_pfn); /* defined by bootmem.c, but not exported by generic code */ |
46 | #endif | 47 | #endif |
47 | 48 | ||
diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c index 801eeaeaf3de..2895d6e6062f 100644 --- a/arch/ia64/kernel/kprobes.c +++ b/arch/ia64/kernel/kprobes.c | |||
@@ -740,7 +740,7 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | |||
740 | switch(val) { | 740 | switch(val) { |
741 | case DIE_BREAK: | 741 | case DIE_BREAK: |
742 | /* err is break number from ia64_bad_break() */ | 742 | /* err is break number from ia64_bad_break() */ |
743 | if (args->err == 0x80200 || args->err == 0x80300) | 743 | if (args->err == 0x80200 || args->err == 0x80300 || args->err == 0) |
744 | if (pre_kprobes_handler(args)) | 744 | if (pre_kprobes_handler(args)) |
745 | ret = NOTIFY_STOP; | 745 | ret = NOTIFY_STOP; |
746 | break; | 746 | break; |
diff --git a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c index fba5fdd1f968..d3e0ecb56d62 100644 --- a/arch/ia64/kernel/traps.c +++ b/arch/ia64/kernel/traps.c | |||
@@ -132,24 +132,6 @@ __kprobes ia64_bad_break (unsigned long break_num, struct pt_regs *regs) | |||
132 | siginfo_t siginfo; | 132 | siginfo_t siginfo; |
133 | int sig, code; | 133 | int sig, code; |
134 | 134 | ||
135 | /* break.b always sets cr.iim to 0, which causes problems for | ||
136 | * debuggers. Get the real break number from the original instruction, | ||
137 | * but only for kernel code. User space break.b is left alone, to | ||
138 | * preserve the existing behaviour. All break codings have the same | ||
139 | * format, so there is no need to check the slot type. | ||
140 | */ | ||
141 | if (break_num == 0 && !user_mode(regs)) { | ||
142 | struct ia64_psr *ipsr = ia64_psr(regs); | ||
143 | unsigned long *bundle = (unsigned long *)regs->cr_iip; | ||
144 | unsigned long slot; | ||
145 | switch (ipsr->ri) { | ||
146 | case 0: slot = (bundle[0] >> 5); break; | ||
147 | case 1: slot = (bundle[0] >> 46) | (bundle[1] << 18); break; | ||
148 | default: slot = (bundle[1] >> 23); break; | ||
149 | } | ||
150 | break_num = ((slot >> 36 & 1) << 20) | (slot >> 6 & 0xfffff); | ||
151 | } | ||
152 | |||
153 | /* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */ | 135 | /* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */ |
154 | siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri); | 136 | siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri); |
155 | siginfo.si_imm = break_num; | 137 | siginfo.si_imm = break_num; |
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 74022316fc63..65c2ec5c421b 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
@@ -91,9 +91,9 @@ static int mfcounter = 0; | |||
91 | * Public data... | 91 | * Public data... |
92 | */ | 92 | */ |
93 | int mpt_lan_index = -1; | 93 | int mpt_lan_index = -1; |
94 | static int mpt_stm_index = -1; | 94 | int mpt_stm_index = -1; |
95 | 95 | ||
96 | static struct proc_dir_entry *mpt_proc_root_dir; | 96 | struct proc_dir_entry *mpt_proc_root_dir; |
97 | 97 | ||
98 | #define WHOINIT_UNKNOWN 0xAA | 98 | #define WHOINIT_UNKNOWN 0xAA |
99 | 99 | ||
@@ -6271,6 +6271,7 @@ EXPORT_SYMBOL(mpt_resume); | |||
6271 | EXPORT_SYMBOL(mpt_suspend); | 6271 | EXPORT_SYMBOL(mpt_suspend); |
6272 | #endif | 6272 | #endif |
6273 | EXPORT_SYMBOL(ioc_list); | 6273 | EXPORT_SYMBOL(ioc_list); |
6274 | EXPORT_SYMBOL(mpt_proc_root_dir); | ||
6274 | EXPORT_SYMBOL(mpt_register); | 6275 | EXPORT_SYMBOL(mpt_register); |
6275 | EXPORT_SYMBOL(mpt_deregister); | 6276 | EXPORT_SYMBOL(mpt_deregister); |
6276 | EXPORT_SYMBOL(mpt_event_register); | 6277 | EXPORT_SYMBOL(mpt_event_register); |
@@ -6288,6 +6289,7 @@ EXPORT_SYMBOL(mpt_verify_adapter); | |||
6288 | EXPORT_SYMBOL(mpt_GetIocState); | 6289 | EXPORT_SYMBOL(mpt_GetIocState); |
6289 | EXPORT_SYMBOL(mpt_print_ioc_summary); | 6290 | EXPORT_SYMBOL(mpt_print_ioc_summary); |
6290 | EXPORT_SYMBOL(mpt_lan_index); | 6291 | EXPORT_SYMBOL(mpt_lan_index); |
6292 | EXPORT_SYMBOL(mpt_stm_index); | ||
6291 | EXPORT_SYMBOL(mpt_HardResetHandler); | 6293 | EXPORT_SYMBOL(mpt_HardResetHandler); |
6292 | EXPORT_SYMBOL(mpt_config); | 6294 | EXPORT_SYMBOL(mpt_config); |
6293 | EXPORT_SYMBOL(mpt_toolbox); | 6295 | EXPORT_SYMBOL(mpt_toolbox); |
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index 8ad277a9afa1..5f5b3fb5b4d7 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h | |||
@@ -1006,8 +1006,10 @@ extern int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode); | |||
1006 | * Public data decl's... | 1006 | * Public data decl's... |
1007 | */ | 1007 | */ |
1008 | extern struct list_head ioc_list; | 1008 | extern struct list_head ioc_list; |
1009 | extern struct proc_dir_entry *mpt_proc_root_dir; | ||
1009 | 1010 | ||
1010 | extern int mpt_lan_index; /* needed by mptlan.c */ | 1011 | extern int mpt_lan_index; /* needed by mptlan.c */ |
1012 | extern int mpt_stm_index; /* needed by mptstm.c */ | ||
1011 | 1013 | ||
1012 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 1014 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
1013 | #endif /* } __KERNEL__ */ | 1015 | #endif /* } __KERNEL__ */ |
@@ -306,9 +306,6 @@ void install_arg_page(struct vm_area_struct *vma, | |||
306 | struct page *page, unsigned long address) | 306 | struct page *page, unsigned long address) |
307 | { | 307 | { |
308 | struct mm_struct *mm = vma->vm_mm; | 308 | struct mm_struct *mm = vma->vm_mm; |
309 | pgd_t * pgd; | ||
310 | pud_t * pud; | ||
311 | pmd_t * pmd; | ||
312 | pte_t * pte; | 309 | pte_t * pte; |
313 | spinlock_t *ptl; | 310 | spinlock_t *ptl; |
314 | 311 | ||
@@ -316,14 +313,7 @@ void install_arg_page(struct vm_area_struct *vma, | |||
316 | goto out; | 313 | goto out; |
317 | 314 | ||
318 | flush_dcache_page(page); | 315 | flush_dcache_page(page); |
319 | pgd = pgd_offset(mm, address); | 316 | pte = get_locked_pte(mm, address, &ptl); |
320 | pud = pud_alloc(mm, pgd, address); | ||
321 | if (!pud) | ||
322 | goto out; | ||
323 | pmd = pmd_alloc(mm, pud, address); | ||
324 | if (!pmd) | ||
325 | goto out; | ||
326 | pte = pte_alloc_map_lock(mm, pmd, address, &ptl); | ||
327 | if (!pte) | 317 | if (!pte) |
328 | goto out; | 318 | goto out; |
329 | if (!pte_none(*pte)) { | 319 | if (!pte_none(*pte)) { |
diff --git a/include/asm-ia64/page.h b/include/asm-ia64/page.h index 9dd9da105278..5e6362a786b7 100644 --- a/include/asm-ia64/page.h +++ b/include/asm-ia64/page.h | |||
@@ -110,8 +110,9 @@ extern int ia64_pfn_valid (unsigned long pfn); | |||
110 | # define pfn_to_page(pfn) (mem_map + (pfn)) | 110 | # define pfn_to_page(pfn) (mem_map + (pfn)) |
111 | #elif defined(CONFIG_DISCONTIGMEM) | 111 | #elif defined(CONFIG_DISCONTIGMEM) |
112 | extern struct page *vmem_map; | 112 | extern struct page *vmem_map; |
113 | extern unsigned long min_low_pfn; | ||
113 | extern unsigned long max_low_pfn; | 114 | extern unsigned long max_low_pfn; |
114 | # define pfn_valid(pfn) (((pfn) < max_low_pfn) && ia64_pfn_valid(pfn)) | 115 | # define pfn_valid(pfn) (((pfn) >= min_low_pfn) && ((pfn) < max_low_pfn) && ia64_pfn_valid(pfn)) |
115 | # define page_to_pfn(page) ((unsigned long) (page - vmem_map)) | 116 | # define page_to_pfn(page) ((unsigned long) (page - vmem_map)) |
116 | # define pfn_to_page(pfn) (vmem_map + (pfn)) | 117 | # define pfn_to_page(pfn) (vmem_map + (pfn)) |
117 | #endif | 118 | #endif |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 74f90d7eb5ef..0e73f1539d08 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -742,6 +742,8 @@ struct shrinker; | |||
742 | extern struct shrinker *set_shrinker(int, shrinker_t); | 742 | extern struct shrinker *set_shrinker(int, shrinker_t); |
743 | extern void remove_shrinker(struct shrinker *shrinker); | 743 | extern void remove_shrinker(struct shrinker *shrinker); |
744 | 744 | ||
745 | extern pte_t *FASTCALL(get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl)); | ||
746 | |||
745 | int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address); | 747 | int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address); |
746 | int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address); | 748 | int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address); |
747 | int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address); | 749 | int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address); |
diff --git a/mm/fremap.c b/mm/fremap.c index f851775e09c2..9f381e58bf44 100644 --- a/mm/fremap.c +++ b/mm/fremap.c | |||
@@ -55,20 +55,10 @@ int install_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
55 | pgoff_t size; | 55 | pgoff_t size; |
56 | int err = -ENOMEM; | 56 | int err = -ENOMEM; |
57 | pte_t *pte; | 57 | pte_t *pte; |
58 | pmd_t *pmd; | ||
59 | pud_t *pud; | ||
60 | pgd_t *pgd; | ||
61 | pte_t pte_val; | 58 | pte_t pte_val; |
62 | spinlock_t *ptl; | 59 | spinlock_t *ptl; |
63 | 60 | ||
64 | pgd = pgd_offset(mm, addr); | 61 | pte = get_locked_pte(mm, addr, &ptl); |
65 | pud = pud_alloc(mm, pgd, addr); | ||
66 | if (!pud) | ||
67 | goto out; | ||
68 | pmd = pmd_alloc(mm, pud, addr); | ||
69 | if (!pmd) | ||
70 | goto out; | ||
71 | pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); | ||
72 | if (!pte) | 62 | if (!pte) |
73 | goto out; | 63 | goto out; |
74 | 64 | ||
@@ -110,20 +100,10 @@ int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma, | |||
110 | { | 100 | { |
111 | int err = -ENOMEM; | 101 | int err = -ENOMEM; |
112 | pte_t *pte; | 102 | pte_t *pte; |
113 | pmd_t *pmd; | ||
114 | pud_t *pud; | ||
115 | pgd_t *pgd; | ||
116 | pte_t pte_val; | 103 | pte_t pte_val; |
117 | spinlock_t *ptl; | 104 | spinlock_t *ptl; |
118 | 105 | ||
119 | pgd = pgd_offset(mm, addr); | 106 | pte = get_locked_pte(mm, addr, &ptl); |
120 | pud = pud_alloc(mm, pgd, addr); | ||
121 | if (!pud) | ||
122 | goto out; | ||
123 | pmd = pmd_alloc(mm, pud, addr); | ||
124 | if (!pmd) | ||
125 | goto out; | ||
126 | pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); | ||
127 | if (!pte) | 107 | if (!pte) |
128 | goto out; | 108 | goto out; |
129 | 109 | ||
diff --git a/mm/memory.c b/mm/memory.c index 990e7dc666f8..5bfa52a98630 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -1146,6 +1146,18 @@ int zeromap_page_range(struct vm_area_struct *vma, | |||
1146 | return err; | 1146 | return err; |
1147 | } | 1147 | } |
1148 | 1148 | ||
1149 | pte_t *get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl) | ||
1150 | { | ||
1151 | pgd_t * pgd = pgd_offset(mm, addr); | ||
1152 | pud_t * pud = pud_alloc(mm, pgd, addr); | ||
1153 | if (pud) { | ||
1154 | pmd_t * pmd = pmd_alloc(mm, pgd, addr); | ||
1155 | if (pmd) | ||
1156 | return pte_alloc_map_lock(mm, pmd, addr, ptl); | ||
1157 | } | ||
1158 | return NULL; | ||
1159 | } | ||
1160 | |||
1149 | /* | 1161 | /* |
1150 | * This is the old fallback for page remapping. | 1162 | * This is the old fallback for page remapping. |
1151 | * | 1163 | * |
@@ -1156,10 +1168,7 @@ int zeromap_page_range(struct vm_area_struct *vma, | |||
1156 | static int insert_page(struct mm_struct *mm, unsigned long addr, struct page *page, pgprot_t prot) | 1168 | static int insert_page(struct mm_struct *mm, unsigned long addr, struct page *page, pgprot_t prot) |
1157 | { | 1169 | { |
1158 | int retval; | 1170 | int retval; |
1159 | pgd_t * pgd; | 1171 | pte_t *pte; |
1160 | pud_t * pud; | ||
1161 | pmd_t * pmd; | ||
1162 | pte_t * pte; | ||
1163 | spinlock_t *ptl; | 1172 | spinlock_t *ptl; |
1164 | 1173 | ||
1165 | retval = -EINVAL; | 1174 | retval = -EINVAL; |
@@ -1167,14 +1176,7 @@ static int insert_page(struct mm_struct *mm, unsigned long addr, struct page *pa | |||
1167 | goto out; | 1176 | goto out; |
1168 | retval = -ENOMEM; | 1177 | retval = -ENOMEM; |
1169 | flush_dcache_page(page); | 1178 | flush_dcache_page(page); |
1170 | pgd = pgd_offset(mm, addr); | 1179 | pte = get_locked_pte(mm, addr, &ptl); |
1171 | pud = pud_alloc(mm, pgd, addr); | ||
1172 | if (!pud) | ||
1173 | goto out; | ||
1174 | pmd = pmd_alloc(mm, pud, addr); | ||
1175 | if (!pmd) | ||
1176 | goto out; | ||
1177 | pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); | ||
1178 | if (!pte) | 1180 | if (!pte) |
1179 | goto out; | 1181 | goto out; |
1180 | retval = -EBUSY; | 1182 | retval = -EBUSY; |
@@ -1392,8 +1394,15 @@ static inline void cow_user_page(struct page *dst, struct page *src, unsigned lo | |||
1392 | */ | 1394 | */ |
1393 | if (unlikely(!src)) { | 1395 | if (unlikely(!src)) { |
1394 | void *kaddr = kmap_atomic(dst, KM_USER0); | 1396 | void *kaddr = kmap_atomic(dst, KM_USER0); |
1395 | unsigned long left = __copy_from_user_inatomic(kaddr, (void __user *)va, PAGE_SIZE); | 1397 | void __user *uaddr = (void __user *)(va & PAGE_MASK); |
1396 | if (left) | 1398 | |
1399 | /* | ||
1400 | * This really shouldn't fail, because the page is there | ||
1401 | * in the page tables. But it might just be unreadable, | ||
1402 | * in which case we just give up and fill the result with | ||
1403 | * zeroes. | ||
1404 | */ | ||
1405 | if (__copy_from_user_inatomic(kaddr, uaddr, PAGE_SIZE)) | ||
1397 | memset(kaddr, 0, PAGE_SIZE); | 1406 | memset(kaddr, 0, PAGE_SIZE); |
1398 | kunmap_atomic(kaddr, KM_USER0); | 1407 | kunmap_atomic(kaddr, KM_USER0); |
1399 | return; | 1408 | return; |
@@ -1424,12 +1433,11 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
1424 | unsigned long address, pte_t *page_table, pmd_t *pmd, | 1433 | unsigned long address, pte_t *page_table, pmd_t *pmd, |
1425 | spinlock_t *ptl, pte_t orig_pte) | 1434 | spinlock_t *ptl, pte_t orig_pte) |
1426 | { | 1435 | { |
1427 | struct page *old_page, *src_page, *new_page; | 1436 | struct page *old_page, *new_page; |
1428 | pte_t entry; | 1437 | pte_t entry; |
1429 | int ret = VM_FAULT_MINOR; | 1438 | int ret = VM_FAULT_MINOR; |
1430 | 1439 | ||
1431 | old_page = vm_normal_page(vma, address, orig_pte); | 1440 | old_page = vm_normal_page(vma, address, orig_pte); |
1432 | src_page = old_page; | ||
1433 | if (!old_page) | 1441 | if (!old_page) |
1434 | goto gotten; | 1442 | goto gotten; |
1435 | 1443 | ||
@@ -1457,7 +1465,7 @@ gotten: | |||
1457 | 1465 | ||
1458 | if (unlikely(anon_vma_prepare(vma))) | 1466 | if (unlikely(anon_vma_prepare(vma))) |
1459 | goto oom; | 1467 | goto oom; |
1460 | if (src_page == ZERO_PAGE(address)) { | 1468 | if (old_page == ZERO_PAGE(address)) { |
1461 | new_page = alloc_zeroed_user_highpage(vma, address); | 1469 | new_page = alloc_zeroed_user_highpage(vma, address); |
1462 | if (!new_page) | 1470 | if (!new_page) |
1463 | goto oom; | 1471 | goto oom; |
@@ -1465,7 +1473,7 @@ gotten: | |||
1465 | new_page = alloc_page_vma(GFP_HIGHUSER, vma, address); | 1473 | new_page = alloc_page_vma(GFP_HIGHUSER, vma, address); |
1466 | if (!new_page) | 1474 | if (!new_page) |
1467 | goto oom; | 1475 | goto oom; |
1468 | cow_user_page(new_page, src_page, address); | 1476 | cow_user_page(new_page, old_page, address); |
1469 | } | 1477 | } |
1470 | 1478 | ||
1471 | /* | 1479 | /* |
@@ -2001,6 +2009,8 @@ static int do_no_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2001 | int anon = 0; | 2009 | int anon = 0; |
2002 | 2010 | ||
2003 | pte_unmap(page_table); | 2011 | pte_unmap(page_table); |
2012 | BUG_ON(vma->vm_flags & VM_PFNMAP); | ||
2013 | |||
2004 | if (vma->vm_file) { | 2014 | if (vma->vm_file) { |
2005 | mapping = vma->vm_file->f_mapping; | 2015 | mapping = vma->vm_file->f_mapping; |
2006 | sequence = mapping->truncate_count; | 2016 | sequence = mapping->truncate_count; |
@@ -2033,7 +2043,7 @@ retry: | |||
2033 | page = alloc_page_vma(GFP_HIGHUSER, vma, address); | 2043 | page = alloc_page_vma(GFP_HIGHUSER, vma, address); |
2034 | if (!page) | 2044 | if (!page) |
2035 | goto oom; | 2045 | goto oom; |
2036 | cow_user_page(page, new_page, address); | 2046 | copy_user_highpage(page, new_page, address); |
2037 | page_cache_release(new_page); | 2047 | page_cache_release(new_page); |
2038 | new_page = page; | 2048 | new_page = page; |
2039 | anon = 1; | 2049 | anon = 1; |