diff options
Diffstat (limited to 'arch/x86_64/mm/fault.c')
-rw-r--r-- | arch/x86_64/mm/fault.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/arch/x86_64/mm/fault.c b/arch/x86_64/mm/fault.c index 635e58d443d7..84f11728fc76 100644 --- a/arch/x86_64/mm/fault.c +++ b/arch/x86_64/mm/fault.c | |||
@@ -317,7 +317,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, | |||
317 | struct vm_area_struct * vma; | 317 | struct vm_area_struct * vma; |
318 | unsigned long address; | 318 | unsigned long address; |
319 | const struct exception_table_entry *fixup; | 319 | const struct exception_table_entry *fixup; |
320 | int write; | 320 | int write, fault; |
321 | unsigned long flags; | 321 | unsigned long flags; |
322 | siginfo_t info; | 322 | siginfo_t info; |
323 | 323 | ||
@@ -450,19 +450,18 @@ good_area: | |||
450 | * make sure we exit gracefully rather than endlessly redo | 450 | * make sure we exit gracefully rather than endlessly redo |
451 | * the fault. | 451 | * the fault. |
452 | */ | 452 | */ |
453 | switch (handle_mm_fault(mm, vma, address, write)) { | 453 | fault = handle_mm_fault(mm, vma, address, write); |
454 | case VM_FAULT_MINOR: | 454 | if (unlikely(fault & VM_FAULT_ERROR)) { |
455 | tsk->min_flt++; | 455 | if (fault & VM_FAULT_OOM) |
456 | break; | 456 | goto out_of_memory; |
457 | case VM_FAULT_MAJOR: | 457 | else if (fault & VM_FAULT_SIGBUS) |
458 | tsk->maj_flt++; | 458 | goto do_sigbus; |
459 | break; | 459 | BUG(); |
460 | case VM_FAULT_SIGBUS: | ||
461 | goto do_sigbus; | ||
462 | default: | ||
463 | goto out_of_memory; | ||
464 | } | 460 | } |
465 | 461 | if (fault & VM_FAULT_MAJOR) | |
462 | tsk->maj_flt++; | ||
463 | else | ||
464 | tsk->min_flt++; | ||
466 | up_read(&mm->mmap_sem); | 465 | up_read(&mm->mmap_sem); |
467 | return; | 466 | return; |
468 | 467 | ||