diff options
| -rw-r--r-- | arch/alpha/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/arc/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/avr32/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/cris/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/frv/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/ia64/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/m32r/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/m68k/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/metag/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/microblaze/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/mips/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/mn10300/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/nios2/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/openrisc/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/parisc/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/mm/copro_fault.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/s390/mm/fault.c | 6 | ||||
| -rw-r--r-- | arch/score/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/sh/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/sparc/mm/fault_32.c | 2 | ||||
| -rw-r--r-- | arch/sparc/mm/fault_64.c | 2 | ||||
| -rw-r--r-- | arch/tile/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/um/kernel/trap.c | 2 | ||||
| -rw-r--r-- | arch/x86/mm/fault.c | 2 | ||||
| -rw-r--r-- | arch/xtensa/mm/fault.c | 2 | ||||
| -rw-r--r-- | drivers/staging/lustre/lustre/llite/vvp_io.c | 2 | ||||
| -rw-r--r-- | include/linux/mm.h | 6 | ||||
| -rw-r--r-- | mm/gup.c | 4 | ||||
| -rw-r--r-- | mm/ksm.c | 2 |
30 files changed, 63 insertions, 7 deletions
diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c index 98838a05ba6d..9d0ac091a52a 100644 --- a/arch/alpha/mm/fault.c +++ b/arch/alpha/mm/fault.c | |||
| @@ -156,6 +156,8 @@ retry: | |||
| 156 | if (unlikely(fault & VM_FAULT_ERROR)) { | 156 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 157 | if (fault & VM_FAULT_OOM) | 157 | if (fault & VM_FAULT_OOM) |
| 158 | goto out_of_memory; | 158 | goto out_of_memory; |
| 159 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 160 | goto bad_area; | ||
| 159 | else if (fault & VM_FAULT_SIGBUS) | 161 | else if (fault & VM_FAULT_SIGBUS) |
| 160 | goto do_sigbus; | 162 | goto do_sigbus; |
| 161 | BUG(); | 163 | BUG(); |
diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c index 6f7e3a68803a..0f8df3b5b1b3 100644 --- a/arch/arc/mm/fault.c +++ b/arch/arc/mm/fault.c | |||
| @@ -161,6 +161,8 @@ good_area: | |||
| 161 | 161 | ||
| 162 | if (fault & VM_FAULT_OOM) | 162 | if (fault & VM_FAULT_OOM) |
| 163 | goto out_of_memory; | 163 | goto out_of_memory; |
| 164 | else if (fault & VM_FAULT_SIGSEV) | ||
| 165 | goto bad_area; | ||
| 164 | else if (fault & VM_FAULT_SIGBUS) | 166 | else if (fault & VM_FAULT_SIGBUS) |
| 165 | goto do_sigbus; | 167 | goto do_sigbus; |
| 166 | 168 | ||
diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c index 0eca93327195..d223a8b57c1e 100644 --- a/arch/avr32/mm/fault.c +++ b/arch/avr32/mm/fault.c | |||
| @@ -142,6 +142,8 @@ good_area: | |||
| 142 | if (unlikely(fault & VM_FAULT_ERROR)) { | 142 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 143 | if (fault & VM_FAULT_OOM) | 143 | if (fault & VM_FAULT_OOM) |
| 144 | goto out_of_memory; | 144 | goto out_of_memory; |
| 145 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 146 | goto bad_area; | ||
| 145 | else if (fault & VM_FAULT_SIGBUS) | 147 | else if (fault & VM_FAULT_SIGBUS) |
| 146 | goto do_sigbus; | 148 | goto do_sigbus; |
| 147 | BUG(); | 149 | BUG(); |
diff --git a/arch/cris/mm/fault.c b/arch/cris/mm/fault.c index 1790f22e71a2..2686a7aa8ec8 100644 --- a/arch/cris/mm/fault.c +++ b/arch/cris/mm/fault.c | |||
| @@ -176,6 +176,8 @@ retry: | |||
| 176 | if (unlikely(fault & VM_FAULT_ERROR)) { | 176 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 177 | if (fault & VM_FAULT_OOM) | 177 | if (fault & VM_FAULT_OOM) |
| 178 | goto out_of_memory; | 178 | goto out_of_memory; |
| 179 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 180 | goto bad_area; | ||
| 179 | else if (fault & VM_FAULT_SIGBUS) | 181 | else if (fault & VM_FAULT_SIGBUS) |
| 180 | goto do_sigbus; | 182 | goto do_sigbus; |
| 181 | BUG(); | 183 | BUG(); |
diff --git a/arch/frv/mm/fault.c b/arch/frv/mm/fault.c index 9a66372fc7c7..ec4917ddf678 100644 --- a/arch/frv/mm/fault.c +++ b/arch/frv/mm/fault.c | |||
| @@ -168,6 +168,8 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear | |||
| 168 | if (unlikely(fault & VM_FAULT_ERROR)) { | 168 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 169 | if (fault & VM_FAULT_OOM) | 169 | if (fault & VM_FAULT_OOM) |
| 170 | goto out_of_memory; | 170 | goto out_of_memory; |
| 171 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 172 | goto bad_area; | ||
| 171 | else if (fault & VM_FAULT_SIGBUS) | 173 | else if (fault & VM_FAULT_SIGBUS) |
| 172 | goto do_sigbus; | 174 | goto do_sigbus; |
| 173 | BUG(); | 175 | BUG(); |
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c index 7225dad87094..ba5ba7accd0d 100644 --- a/arch/ia64/mm/fault.c +++ b/arch/ia64/mm/fault.c | |||
| @@ -172,6 +172,8 @@ retry: | |||
| 172 | */ | 172 | */ |
| 173 | if (fault & VM_FAULT_OOM) { | 173 | if (fault & VM_FAULT_OOM) { |
| 174 | goto out_of_memory; | 174 | goto out_of_memory; |
| 175 | } else if (fault & VM_FAULT_SIGSEGV) { | ||
| 176 | goto bad_area; | ||
| 175 | } else if (fault & VM_FAULT_SIGBUS) { | 177 | } else if (fault & VM_FAULT_SIGBUS) { |
| 176 | signal = SIGBUS; | 178 | signal = SIGBUS; |
| 177 | goto bad_area; | 179 | goto bad_area; |
diff --git a/arch/m32r/mm/fault.c b/arch/m32r/mm/fault.c index e9c6a8014bd6..e3d4d4890104 100644 --- a/arch/m32r/mm/fault.c +++ b/arch/m32r/mm/fault.c | |||
| @@ -200,6 +200,8 @@ good_area: | |||
| 200 | if (unlikely(fault & VM_FAULT_ERROR)) { | 200 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 201 | if (fault & VM_FAULT_OOM) | 201 | if (fault & VM_FAULT_OOM) |
| 202 | goto out_of_memory; | 202 | goto out_of_memory; |
| 203 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 204 | goto bad_area; | ||
| 203 | else if (fault & VM_FAULT_SIGBUS) | 205 | else if (fault & VM_FAULT_SIGBUS) |
| 204 | goto do_sigbus; | 206 | goto do_sigbus; |
| 205 | BUG(); | 207 | BUG(); |
diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c index 2bd7487440c4..b2f04aee46ec 100644 --- a/arch/m68k/mm/fault.c +++ b/arch/m68k/mm/fault.c | |||
| @@ -145,6 +145,8 @@ good_area: | |||
| 145 | if (unlikely(fault & VM_FAULT_ERROR)) { | 145 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 146 | if (fault & VM_FAULT_OOM) | 146 | if (fault & VM_FAULT_OOM) |
| 147 | goto out_of_memory; | 147 | goto out_of_memory; |
| 148 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 149 | goto map_err; | ||
| 148 | else if (fault & VM_FAULT_SIGBUS) | 150 | else if (fault & VM_FAULT_SIGBUS) |
| 149 | goto bus_err; | 151 | goto bus_err; |
| 150 | BUG(); | 152 | BUG(); |
diff --git a/arch/metag/mm/fault.c b/arch/metag/mm/fault.c index 332680e5ebf2..2de5dc695a87 100644 --- a/arch/metag/mm/fault.c +++ b/arch/metag/mm/fault.c | |||
| @@ -141,6 +141,8 @@ good_area: | |||
| 141 | if (unlikely(fault & VM_FAULT_ERROR)) { | 141 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 142 | if (fault & VM_FAULT_OOM) | 142 | if (fault & VM_FAULT_OOM) |
| 143 | goto out_of_memory; | 143 | goto out_of_memory; |
| 144 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 145 | goto bad_area; | ||
| 144 | else if (fault & VM_FAULT_SIGBUS) | 146 | else if (fault & VM_FAULT_SIGBUS) |
| 145 | goto do_sigbus; | 147 | goto do_sigbus; |
| 146 | BUG(); | 148 | BUG(); |
diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c index fa4cf52aa7a6..d46a5ebb7570 100644 --- a/arch/microblaze/mm/fault.c +++ b/arch/microblaze/mm/fault.c | |||
| @@ -224,6 +224,8 @@ good_area: | |||
| 224 | if (unlikely(fault & VM_FAULT_ERROR)) { | 224 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 225 | if (fault & VM_FAULT_OOM) | 225 | if (fault & VM_FAULT_OOM) |
| 226 | goto out_of_memory; | 226 | goto out_of_memory; |
| 227 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 228 | goto bad_area; | ||
| 227 | else if (fault & VM_FAULT_SIGBUS) | 229 | else if (fault & VM_FAULT_SIGBUS) |
| 228 | goto do_sigbus; | 230 | goto do_sigbus; |
| 229 | BUG(); | 231 | BUG(); |
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c index becc42bb1849..70ab5d664332 100644 --- a/arch/mips/mm/fault.c +++ b/arch/mips/mm/fault.c | |||
| @@ -158,6 +158,8 @@ good_area: | |||
| 158 | if (unlikely(fault & VM_FAULT_ERROR)) { | 158 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 159 | if (fault & VM_FAULT_OOM) | 159 | if (fault & VM_FAULT_OOM) |
| 160 | goto out_of_memory; | 160 | goto out_of_memory; |
| 161 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 162 | goto bad_area; | ||
| 161 | else if (fault & VM_FAULT_SIGBUS) | 163 | else if (fault & VM_FAULT_SIGBUS) |
| 162 | goto do_sigbus; | 164 | goto do_sigbus; |
| 163 | BUG(); | 165 | BUG(); |
diff --git a/arch/mn10300/mm/fault.c b/arch/mn10300/mm/fault.c index 3516cbdf1ee9..0c2cc5d39c8e 100644 --- a/arch/mn10300/mm/fault.c +++ b/arch/mn10300/mm/fault.c | |||
| @@ -262,6 +262,8 @@ good_area: | |||
| 262 | if (unlikely(fault & VM_FAULT_ERROR)) { | 262 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 263 | if (fault & VM_FAULT_OOM) | 263 | if (fault & VM_FAULT_OOM) |
| 264 | goto out_of_memory; | 264 | goto out_of_memory; |
| 265 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 266 | goto bad_area; | ||
| 265 | else if (fault & VM_FAULT_SIGBUS) | 267 | else if (fault & VM_FAULT_SIGBUS) |
| 266 | goto do_sigbus; | 268 | goto do_sigbus; |
| 267 | BUG(); | 269 | BUG(); |
diff --git a/arch/nios2/mm/fault.c b/arch/nios2/mm/fault.c index 15a0bb5fc06d..34429d5a0ccd 100644 --- a/arch/nios2/mm/fault.c +++ b/arch/nios2/mm/fault.c | |||
| @@ -135,6 +135,8 @@ survive: | |||
| 135 | if (unlikely(fault & VM_FAULT_ERROR)) { | 135 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 136 | if (fault & VM_FAULT_OOM) | 136 | if (fault & VM_FAULT_OOM) |
| 137 | goto out_of_memory; | 137 | goto out_of_memory; |
| 138 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 139 | goto bad_area; | ||
| 138 | else if (fault & VM_FAULT_SIGBUS) | 140 | else if (fault & VM_FAULT_SIGBUS) |
| 139 | goto do_sigbus; | 141 | goto do_sigbus; |
| 140 | BUG(); | 142 | BUG(); |
diff --git a/arch/openrisc/mm/fault.c b/arch/openrisc/mm/fault.c index 0703acf7d327..230ac20ae794 100644 --- a/arch/openrisc/mm/fault.c +++ b/arch/openrisc/mm/fault.c | |||
| @@ -171,6 +171,8 @@ good_area: | |||
| 171 | if (unlikely(fault & VM_FAULT_ERROR)) { | 171 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 172 | if (fault & VM_FAULT_OOM) | 172 | if (fault & VM_FAULT_OOM) |
| 173 | goto out_of_memory; | 173 | goto out_of_memory; |
| 174 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 175 | goto bad_area; | ||
| 174 | else if (fault & VM_FAULT_SIGBUS) | 176 | else if (fault & VM_FAULT_SIGBUS) |
| 175 | goto do_sigbus; | 177 | goto do_sigbus; |
| 176 | BUG(); | 178 | BUG(); |
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c index 3ca9c1131cfe..e5120e653240 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c | |||
| @@ -256,6 +256,8 @@ good_area: | |||
| 256 | */ | 256 | */ |
| 257 | if (fault & VM_FAULT_OOM) | 257 | if (fault & VM_FAULT_OOM) |
| 258 | goto out_of_memory; | 258 | goto out_of_memory; |
| 259 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 260 | goto bad_area; | ||
| 259 | else if (fault & VM_FAULT_SIGBUS) | 261 | else if (fault & VM_FAULT_SIGBUS) |
| 260 | goto bad_area; | 262 | goto bad_area; |
| 261 | BUG(); | 263 | BUG(); |
diff --git a/arch/powerpc/mm/copro_fault.c b/arch/powerpc/mm/copro_fault.c index 5a236f082c78..1b5305d4bdab 100644 --- a/arch/powerpc/mm/copro_fault.c +++ b/arch/powerpc/mm/copro_fault.c | |||
| @@ -76,7 +76,7 @@ int copro_handle_mm_fault(struct mm_struct *mm, unsigned long ea, | |||
| 76 | if (*flt & VM_FAULT_OOM) { | 76 | if (*flt & VM_FAULT_OOM) { |
| 77 | ret = -ENOMEM; | 77 | ret = -ENOMEM; |
| 78 | goto out_unlock; | 78 | goto out_unlock; |
| 79 | } else if (*flt & VM_FAULT_SIGBUS) { | 79 | } else if (*flt & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) { |
| 80 | ret = -EFAULT; | 80 | ret = -EFAULT; |
| 81 | goto out_unlock; | 81 | goto out_unlock; |
| 82 | } | 82 | } |
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index eb79907f34fa..6154b0a2b063 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c | |||
| @@ -437,6 +437,8 @@ good_area: | |||
| 437 | */ | 437 | */ |
| 438 | fault = handle_mm_fault(mm, vma, address, flags); | 438 | fault = handle_mm_fault(mm, vma, address, flags); |
| 439 | if (unlikely(fault & (VM_FAULT_RETRY|VM_FAULT_ERROR))) { | 439 | if (unlikely(fault & (VM_FAULT_RETRY|VM_FAULT_ERROR))) { |
| 440 | if (fault & VM_FAULT_SIGSEGV) | ||
| 441 | goto bad_area; | ||
| 440 | rc = mm_fault_error(regs, address, fault); | 442 | rc = mm_fault_error(regs, address, fault); |
| 441 | if (rc >= MM_FAULT_RETURN) | 443 | if (rc >= MM_FAULT_RETURN) |
| 442 | goto bail; | 444 | goto bail; |
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 811937bb90be..9065d5aa3932 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
| @@ -374,6 +374,12 @@ static noinline void do_fault_error(struct pt_regs *regs, int fault) | |||
| 374 | do_no_context(regs); | 374 | do_no_context(regs); |
| 375 | else | 375 | else |
| 376 | pagefault_out_of_memory(); | 376 | pagefault_out_of_memory(); |
| 377 | } else if (fault & VM_FAULT_SIGSEGV) { | ||
| 378 | /* Kernel mode? Handle exceptions or die */ | ||
| 379 | if (!user_mode(regs)) | ||
| 380 | do_no_context(regs); | ||
| 381 | else | ||
| 382 | do_sigsegv(regs, SEGV_MAPERR); | ||
| 377 | } else if (fault & VM_FAULT_SIGBUS) { | 383 | } else if (fault & VM_FAULT_SIGBUS) { |
| 378 | /* Kernel mode? Handle exceptions or die */ | 384 | /* Kernel mode? Handle exceptions or die */ |
| 379 | if (!user_mode(regs)) | 385 | if (!user_mode(regs)) |
diff --git a/arch/score/mm/fault.c b/arch/score/mm/fault.c index 52238983527d..6860beb2a280 100644 --- a/arch/score/mm/fault.c +++ b/arch/score/mm/fault.c | |||
| @@ -114,6 +114,8 @@ good_area: | |||
| 114 | if (unlikely(fault & VM_FAULT_ERROR)) { | 114 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 115 | if (fault & VM_FAULT_OOM) | 115 | if (fault & VM_FAULT_OOM) |
| 116 | goto out_of_memory; | 116 | goto out_of_memory; |
| 117 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 118 | goto bad_area; | ||
| 117 | else if (fault & VM_FAULT_SIGBUS) | 119 | else if (fault & VM_FAULT_SIGBUS) |
| 118 | goto do_sigbus; | 120 | goto do_sigbus; |
| 119 | BUG(); | 121 | BUG(); |
diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c index 541dc6101508..a58fec9b55e0 100644 --- a/arch/sh/mm/fault.c +++ b/arch/sh/mm/fault.c | |||
| @@ -353,6 +353,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, | |||
| 353 | } else { | 353 | } else { |
| 354 | if (fault & VM_FAULT_SIGBUS) | 354 | if (fault & VM_FAULT_SIGBUS) |
| 355 | do_sigbus(regs, error_code, address); | 355 | do_sigbus(regs, error_code, address); |
| 356 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 357 | bad_area(regs, error_code, address); | ||
| 356 | else | 358 | else |
| 357 | BUG(); | 359 | BUG(); |
| 358 | } | 360 | } |
diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c index 908e8c17c902..70d817154fe8 100644 --- a/arch/sparc/mm/fault_32.c +++ b/arch/sparc/mm/fault_32.c | |||
| @@ -249,6 +249,8 @@ good_area: | |||
| 249 | if (unlikely(fault & VM_FAULT_ERROR)) { | 249 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 250 | if (fault & VM_FAULT_OOM) | 250 | if (fault & VM_FAULT_OOM) |
| 251 | goto out_of_memory; | 251 | goto out_of_memory; |
| 252 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 253 | goto bad_area; | ||
| 252 | else if (fault & VM_FAULT_SIGBUS) | 254 | else if (fault & VM_FAULT_SIGBUS) |
| 253 | goto do_sigbus; | 255 | goto do_sigbus; |
| 254 | BUG(); | 256 | BUG(); |
diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c index 18fcd7167095..479823249429 100644 --- a/arch/sparc/mm/fault_64.c +++ b/arch/sparc/mm/fault_64.c | |||
| @@ -446,6 +446,8 @@ good_area: | |||
| 446 | if (unlikely(fault & VM_FAULT_ERROR)) { | 446 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 447 | if (fault & VM_FAULT_OOM) | 447 | if (fault & VM_FAULT_OOM) |
| 448 | goto out_of_memory; | 448 | goto out_of_memory; |
| 449 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 450 | goto bad_area; | ||
| 449 | else if (fault & VM_FAULT_SIGBUS) | 451 | else if (fault & VM_FAULT_SIGBUS) |
| 450 | goto do_sigbus; | 452 | goto do_sigbus; |
| 451 | BUG(); | 453 | BUG(); |
diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c index 565e25a98334..0f61a73534e6 100644 --- a/arch/tile/mm/fault.c +++ b/arch/tile/mm/fault.c | |||
| @@ -442,6 +442,8 @@ good_area: | |||
| 442 | if (unlikely(fault & VM_FAULT_ERROR)) { | 442 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 443 | if (fault & VM_FAULT_OOM) | 443 | if (fault & VM_FAULT_OOM) |
| 444 | goto out_of_memory; | 444 | goto out_of_memory; |
| 445 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 446 | goto bad_area; | ||
| 445 | else if (fault & VM_FAULT_SIGBUS) | 447 | else if (fault & VM_FAULT_SIGBUS) |
| 446 | goto do_sigbus; | 448 | goto do_sigbus; |
| 447 | BUG(); | 449 | BUG(); |
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index 5678c3571e7c..209617302df8 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c | |||
| @@ -80,6 +80,8 @@ good_area: | |||
| 80 | if (unlikely(fault & VM_FAULT_ERROR)) { | 80 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 81 | if (fault & VM_FAULT_OOM) { | 81 | if (fault & VM_FAULT_OOM) { |
| 82 | goto out_of_memory; | 82 | goto out_of_memory; |
| 83 | } else if (fault & VM_FAULT_SIGSEGV) { | ||
| 84 | goto out; | ||
| 83 | } else if (fault & VM_FAULT_SIGBUS) { | 85 | } else if (fault & VM_FAULT_SIGBUS) { |
| 84 | err = -EACCES; | 86 | err = -EACCES; |
| 85 | goto out; | 87 | goto out; |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 38dcec403b46..e3ff27a5b634 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
| @@ -898,6 +898,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, | |||
| 898 | if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON| | 898 | if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON| |
| 899 | VM_FAULT_HWPOISON_LARGE)) | 899 | VM_FAULT_HWPOISON_LARGE)) |
| 900 | do_sigbus(regs, error_code, address, fault); | 900 | do_sigbus(regs, error_code, address, fault); |
| 901 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 902 | bad_area_nosemaphore(regs, error_code, address); | ||
| 901 | else | 903 | else |
| 902 | BUG(); | 904 | BUG(); |
| 903 | } | 905 | } |
diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c index b57c4f91f487..9e3571a6535c 100644 --- a/arch/xtensa/mm/fault.c +++ b/arch/xtensa/mm/fault.c | |||
| @@ -117,6 +117,8 @@ good_area: | |||
| 117 | if (unlikely(fault & VM_FAULT_ERROR)) { | 117 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 118 | if (fault & VM_FAULT_OOM) | 118 | if (fault & VM_FAULT_OOM) |
| 119 | goto out_of_memory; | 119 | goto out_of_memory; |
| 120 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 121 | goto bad_area; | ||
| 120 | else if (fault & VM_FAULT_SIGBUS) | 122 | else if (fault & VM_FAULT_SIGBUS) |
| 121 | goto do_sigbus; | 123 | goto do_sigbus; |
| 122 | BUG(); | 124 | BUG(); |
diff --git a/drivers/staging/lustre/lustre/llite/vvp_io.c b/drivers/staging/lustre/lustre/llite/vvp_io.c index 930f6010203e..65d610abe06e 100644 --- a/drivers/staging/lustre/lustre/llite/vvp_io.c +++ b/drivers/staging/lustre/lustre/llite/vvp_io.c | |||
| @@ -632,7 +632,7 @@ static int vvp_io_kernel_fault(struct vvp_fault_io *cfio) | |||
| 632 | return 0; | 632 | return 0; |
| 633 | } | 633 | } |
| 634 | 634 | ||
| 635 | if (cfio->fault.ft_flags & VM_FAULT_SIGBUS) { | 635 | if (cfio->fault.ft_flags & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) { |
| 636 | CDEBUG(D_PAGE, "got addr %p - SIGBUS\n", vmf->virtual_address); | 636 | CDEBUG(D_PAGE, "got addr %p - SIGBUS\n", vmf->virtual_address); |
| 637 | return -EFAULT; | 637 | return -EFAULT; |
| 638 | } | 638 | } |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 80fc92a49649..dd5ea3016fc4 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -1070,6 +1070,7 @@ static inline int page_mapped(struct page *page) | |||
| 1070 | #define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */ | 1070 | #define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */ |
| 1071 | #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */ | 1071 | #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */ |
| 1072 | #define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */ | 1072 | #define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */ |
| 1073 | #define VM_FAULT_SIGSEGV 0x0040 | ||
| 1073 | 1074 | ||
| 1074 | #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */ | 1075 | #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */ |
| 1075 | #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */ | 1076 | #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */ |
| @@ -1078,8 +1079,9 @@ static inline int page_mapped(struct page *page) | |||
| 1078 | 1079 | ||
| 1079 | #define VM_FAULT_HWPOISON_LARGE_MASK 0xf000 /* encodes hpage index for large hwpoison */ | 1080 | #define VM_FAULT_HWPOISON_LARGE_MASK 0xf000 /* encodes hpage index for large hwpoison */ |
| 1080 | 1081 | ||
| 1081 | #define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_HWPOISON | \ | 1082 | #define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | \ |
| 1082 | VM_FAULT_FALLBACK | VM_FAULT_HWPOISON_LARGE) | 1083 | VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \ |
| 1084 | VM_FAULT_FALLBACK) | ||
| 1083 | 1085 | ||
| 1084 | /* Encode hstate index for a hwpoisoned large page */ | 1086 | /* Encode hstate index for a hwpoisoned large page */ |
| 1085 | #define VM_FAULT_SET_HINDEX(x) ((x) << 12) | 1087 | #define VM_FAULT_SET_HINDEX(x) ((x) << 12) |
| @@ -296,7 +296,7 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma, | |||
| 296 | return -ENOMEM; | 296 | return -ENOMEM; |
| 297 | if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) | 297 | if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) |
| 298 | return *flags & FOLL_HWPOISON ? -EHWPOISON : -EFAULT; | 298 | return *flags & FOLL_HWPOISON ? -EHWPOISON : -EFAULT; |
| 299 | if (ret & VM_FAULT_SIGBUS) | 299 | if (ret & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) |
| 300 | return -EFAULT; | 300 | return -EFAULT; |
| 301 | BUG(); | 301 | BUG(); |
| 302 | } | 302 | } |
| @@ -571,7 +571,7 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, | |||
| 571 | return -ENOMEM; | 571 | return -ENOMEM; |
| 572 | if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) | 572 | if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) |
| 573 | return -EHWPOISON; | 573 | return -EHWPOISON; |
| 574 | if (ret & VM_FAULT_SIGBUS) | 574 | if (ret & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) |
| 575 | return -EFAULT; | 575 | return -EFAULT; |
| 576 | BUG(); | 576 | BUG(); |
| 577 | } | 577 | } |
| @@ -376,7 +376,7 @@ static int break_ksm(struct vm_area_struct *vma, unsigned long addr) | |||
| 376 | else | 376 | else |
| 377 | ret = VM_FAULT_WRITE; | 377 | ret = VM_FAULT_WRITE; |
| 378 | put_page(page); | 378 | put_page(page); |
| 379 | } while (!(ret & (VM_FAULT_WRITE | VM_FAULT_SIGBUS | VM_FAULT_OOM))); | 379 | } while (!(ret & (VM_FAULT_WRITE | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | VM_FAULT_OOM))); |
| 380 | /* | 380 | /* |
| 381 | * We must loop because handle_mm_fault() may back out if there's | 381 | * We must loop because handle_mm_fault() may back out if there's |
| 382 | * any difficulty e.g. if pte accessed bit gets updated concurrently. | 382 | * any difficulty e.g. if pte accessed bit gets updated concurrently. |
