Skip to content

Commit a2beb5f

Browse files
xzpetertorvalds
authored andcommitted
mm: clean up the last pieces of page fault accountings
Here're the last pieces of page fault accounting that were still done outside handle_mm_fault() where we still have regs==NULL when calling handle_mm_fault(): arch/powerpc/mm/copro_fault.c: copro_handle_mm_fault arch/sparc/mm/fault_32.c: force_user_fault arch/um/kernel/trap.c: handle_page_fault mm/gup.c: faultin_page fixup_user_fault mm/hmm.c: hmm_vma_fault mm/ksm.c: break_ksm Some of them has the issue of duplicated accounting for page fault retries. Some of them didn't do the accounting at all. This patch cleans all these up by letting handle_mm_fault() to do per-task page fault accounting even if regs==NULL (though we'll still skip the perf event accountings). With that, we can safely remove all the outliers now. There's another functional change in that now we account the page faults to the caller of gup, rather than the task_struct that passed into the gup code. More information of this can be found at [1]. After this patch, below things should never be touched again outside handle_mm_fault(): - task_struct.[maj|min]_flt - PERF_COUNT_SW_PAGE_FAULTS_[MAJ|MIN] [1] https://lore.kernel.org/lkml/CAHk-=wj_V2Tps2QrMn20_W0OJF9xqNh52XSGA42s-ZJ8Y+GyKw@mail.gmail.com/ Signed-off-by: Peter Xu <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Cc: Albert Ou <[email protected]> Cc: Alexander Gordeev <[email protected]> Cc: Andy Lutomirski <[email protected]> Cc: Benjamin Herrenschmidt <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Brian Cain <[email protected]> Cc: Catalin Marinas <[email protected]> Cc: Christian Borntraeger <[email protected]> Cc: Chris Zankel <[email protected]> Cc: Dave Hansen <[email protected]> Cc: David S. Miller <[email protected]> Cc: Geert Uytterhoeven <[email protected]> Cc: Gerald Schaefer <[email protected]> Cc: Greentime Hu <[email protected]> Cc: Guo Ren <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: Helge Deller <[email protected]> Cc: H. Peter Anvin <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Ivan Kokshaysky <[email protected]> Cc: James E.J. Bottomley <[email protected]> Cc: John Hubbard <[email protected]> Cc: Jonas Bonn <[email protected]> Cc: Ley Foon Tan <[email protected]> Cc: "Luck, Tony" <[email protected]> Cc: Matt Turner <[email protected]> Cc: Max Filippov <[email protected]> Cc: Michael Ellerman <[email protected]> Cc: Michal Simek <[email protected]> Cc: Nick Hu <[email protected]> Cc: Palmer Dabbelt <[email protected]> Cc: Paul Mackerras <[email protected]> Cc: Paul Walmsley <[email protected]> Cc: Pekka Enberg <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Richard Henderson <[email protected]> Cc: Rich Felker <[email protected]> Cc: Russell King <[email protected]> Cc: Stafford Horne <[email protected]> Cc: Stefan Kristiansson <[email protected]> Cc: Thomas Bogendoerfer <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Vasily Gorbik <[email protected]> Cc: Vincent Chen <[email protected]> Cc: Vineet Gupta <[email protected]> Cc: Will Deacon <[email protected]> Cc: Yoshinori Sato <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Linus Torvalds <[email protected]>
1 parent 484e51e commit a2beb5f

File tree

4 files changed

+10
-29
lines changed

4 files changed

+10
-29
lines changed

arch/powerpc/mm/copro_fault.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,6 @@ int copro_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
7676
BUG();
7777
}
7878

79-
if (*flt & VM_FAULT_MAJOR)
80-
current->maj_flt++;
81-
else
82-
current->min_flt++;
83-
8479
out_unlock:
8580
mmap_read_unlock(mm);
8681
return ret;

arch/um/kernel/trap.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,6 @@ int handle_page_fault(unsigned long address, unsigned long ip,
8888
BUG();
8989
}
9090
if (flags & FAULT_FLAG_ALLOW_RETRY) {
91-
if (fault & VM_FAULT_MAJOR)
92-
current->maj_flt++;
93-
else
94-
current->min_flt++;
9591
if (fault & VM_FAULT_RETRY) {
9692
flags |= FAULT_FLAG_TRIED;
9793

mm/gup.c

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -893,13 +893,6 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma,
893893
BUG();
894894
}
895895

896-
if (tsk) {
897-
if (ret & VM_FAULT_MAJOR)
898-
tsk->maj_flt++;
899-
else
900-
tsk->min_flt++;
901-
}
902-
903896
if (ret & VM_FAULT_RETRY) {
904897
if (locked && !(fault_flags & FAULT_FLAG_RETRY_NOWAIT))
905898
*locked = 0;
@@ -1255,12 +1248,6 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm,
12551248
goto retry;
12561249
}
12571250

1258-
if (tsk) {
1259-
if (major)
1260-
tsk->maj_flt++;
1261-
else
1262-
tsk->min_flt++;
1263-
}
12641251
return 0;
12651252
}
12661253
EXPORT_SYMBOL_GPL(fixup_user_fault);

mm/memory.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4400,20 +4400,23 @@ static inline void mm_account_fault(struct pt_regs *regs,
44004400
*/
44014401
major = (ret & VM_FAULT_MAJOR) || (flags & FAULT_FLAG_TRIED);
44024402

4403+
if (major)
4404+
current->maj_flt++;
4405+
else
4406+
current->min_flt++;
4407+
44034408
/*
4404-
* If the fault is done for GUP, regs will be NULL, and we will skip
4405-
* the fault accounting.
4409+
* If the fault is done for GUP, regs will be NULL. We only do the
4410+
* accounting for the per thread fault counters who triggered the
4411+
* fault, and we skip the perf event updates.
44064412
*/
44074413
if (!regs)
44084414
return;
44094415

4410-
if (major) {
4411-
current->maj_flt++;
4416+
if (major)
44124417
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address);
4413-
} else {
4414-
current->min_flt++;
4418+
else
44154419
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address);
4416-
}
44174420
}
44184421

44194422
/*

0 commit comments

Comments
 (0)