When page fault retried, we should only do the accounting once rather than once for each page fault retry.
CC: Jeff Dike <[email protected]> CC: Richard Weinberger <[email protected]> CC: Anton Ivanov <[email protected]> CC: [email protected] Signed-off-by: Peter Xu <[email protected]> --- arch/um/kernel/trap.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index 8f18cf56b3dd..d162168490d1 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c @@ -34,6 +34,7 @@ int handle_page_fault(unsigned long address, unsigned long ip, pte_t *pte; int err = -EFAULT; unsigned int flags = FAULT_FLAG_DEFAULT; + vm_fault_t fault, major = 0; *code_out = SEGV_MAPERR; @@ -73,9 +74,8 @@ int handle_page_fault(unsigned long address, unsigned long ip, } do { - vm_fault_t fault; - fault = handle_mm_fault(vma, address, flags); + major |= fault & VM_FAULT_MAJOR; if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) goto out_nosemaphore; @@ -92,10 +92,6 @@ int handle_page_fault(unsigned long address, unsigned long ip, BUG(); } if (flags & FAULT_FLAG_ALLOW_RETRY) { - if (fault & VM_FAULT_MAJOR) - current->maj_flt++; - else - current->min_flt++; if (fault & VM_FAULT_RETRY) { flags |= FAULT_FLAG_TRIED; @@ -103,6 +99,11 @@ int handle_page_fault(unsigned long address, unsigned long ip, } } + if (major) + current->maj_flt++; + else + current->min_flt++; + pgd = pgd_offset(mm, address); p4d = p4d_offset(pgd, address); pud = pud_offset(p4d, address); -- 2.26.2

