diff options
Diffstat (limited to 'arch/s390/mm')
-rw-r--r-- | arch/s390/mm/fault.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index d855cdbf8fb8..54055194e9af 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
@@ -307,6 +307,7 @@ do_exception(struct pt_regs *regs, unsigned long error_code, int write) | |||
307 | unsigned long address; | 307 | unsigned long address; |
308 | int space; | 308 | int space; |
309 | int si_code; | 309 | int si_code; |
310 | int fault; | ||
310 | 311 | ||
311 | if (notify_page_fault(regs, error_code)) | 312 | if (notify_page_fault(regs, error_code)) |
312 | return; | 313 | return; |
@@ -377,23 +378,22 @@ survive: | |||
377 | * make sure we exit gracefully rather than endlessly redo | 378 | * make sure we exit gracefully rather than endlessly redo |
378 | * the fault. | 379 | * the fault. |
379 | */ | 380 | */ |
380 | switch (handle_mm_fault(mm, vma, address, write)) { | 381 | fault = handle_mm_fault(mm, vma, address, write); |
381 | case VM_FAULT_MINOR: | 382 | if (unlikely(fault & VM_FAULT_ERROR)) { |
382 | tsk->min_flt++; | 383 | if (fault & VM_FAULT_OOM) { |
383 | break; | 384 | if (do_out_of_memory(regs, error_code, address)) |
384 | case VM_FAULT_MAJOR: | 385 | goto survive; |
385 | tsk->maj_flt++; | 386 | return; |
386 | break; | 387 | } else if (fault & VM_FAULT_SIGBUS) { |
387 | case VM_FAULT_SIGBUS: | 388 | do_sigbus(regs, error_code, address); |
388 | do_sigbus(regs, error_code, address); | 389 | return; |
389 | return; | 390 | } |
390 | case VM_FAULT_OOM: | ||
391 | if (do_out_of_memory(regs, error_code, address)) | ||
392 | goto survive; | ||
393 | return; | ||
394 | default: | ||
395 | BUG(); | 391 | BUG(); |
396 | } | 392 | } |
393 | if (fault & VM_FAULT_MAJOR) | ||
394 | tsk->maj_flt++; | ||
395 | else | ||
396 | tsk->min_flt++; | ||
397 | 397 | ||
398 | up_read(&mm->mmap_sem); | 398 | up_read(&mm->mmap_sem); |
399 | /* | 399 | /* |