Use the general page fault accounting by passing regs into handle_mm_fault(). It naturally solve the issue of multiple page fault accounting when page fault retry happened.
Unified · Split
| @@ -422,7 +422,7 @@ good_area: · 421 unmodified lines | |||
| 422 | goto bad_area; | 422 | goto bad_area; |
| 423 | } | 423 | } |
| 424 | 424 | ||
| 425 | fault = handle_mm_fault(vma, address, flags, NULL); | 425 | fault = handle_mm_fault(vma, address, flags, regs); |
| 426 | 426 | ||
| 427 | if (fault_signal_pending(fault, regs)) | 427 | if (fault_signal_pending(fault, regs)) |
| 428 | goto exit_exception; | 428 | goto exit_exception; |
| @@ -438,15 +438,6 @@ good_area: · 9 unmodified lines | |||
| 438 | } | 438 | } |
| 439 | 439 | ||
| 440 | if (flags & FAULT_FLAG_ALLOW_RETRY) { | 440 | if (flags & FAULT_FLAG_ALLOW_RETRY) { |
| 441 | if (fault & VM_FAULT_MAJOR) { | ||
| 442 | current->maj_flt++; | ||
| 443 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, | ||
| 444 | 1, regs, address); | ||
| 445 | } else { | ||
| 446 | current->min_flt++; | ||
| 447 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, | ||
| 448 | 1, regs, address); | ||
| 449 | } | ||
| 450 | if (fault & VM_FAULT_RETRY) { | 441 | if (fault & VM_FAULT_RETRY) { |
| 451 | flags |= FAULT_FLAG_TRIED; | 442 | flags |= FAULT_FLAG_TRIED; |
| 452 | 443 | ||