linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: linux-mm@kvack.org, linux-kernel@vger.kernel.org
Cc: Peter Xu <peterx@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Gerald Schaefer <gerald.schaefer@de.ibm.com>,
	Andrea Arcangeli <aarcange@redhat.com>,
	Will Deacon <will@kernel.org>,
	Michael Ellerman <mpe@ellerman.id.au>
Subject: [PATCH 25/26] mm: Clean up the last pieces of page fault accountings
Date: Fri, 26 Jun 2020 18:36:45 -0400	[thread overview]
Message-ID: <20200626223645.200199-1-peterx@redhat.com> (raw)
In-Reply-To: <20200626223130.199227-1-peterx@redhat.com>

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 <peterx@redhat.com>
---
 arch/powerpc/mm/copro_fault.c |  5 -----
 arch/um/kernel/trap.c         |  4 ----
 mm/gup.c                      | 13 -------------
 mm/memory.c                   | 19 ++++++++++++-------
 4 files changed, 12 insertions(+), 29 deletions(-)

diff --git a/arch/powerpc/mm/copro_fault.c b/arch/powerpc/mm/copro_fault.c
index c0478bef1f14..2e59be1a9359 100644
--- a/arch/powerpc/mm/copro_fault.c
+++ b/arch/powerpc/mm/copro_fault.c
@@ -76,11 +76,6 @@ int copro_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
 		BUG();
 	}
 
-	if (*flt & VM_FAULT_MAJOR)
-		current->maj_flt++;
-	else
-		current->min_flt++;
-
 out_unlock:
 	up_read(&mm->mmap_sem);
 	return ret;
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c
index 32cc8f59322b..c881831de357 100644
--- a/arch/um/kernel/trap.c
+++ b/arch/um/kernel/trap.c
@@ -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;
 
diff --git a/mm/gup.c b/mm/gup.c
index 1a48c639ea49..17b4d0c45a6b 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -885,13 +885,6 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma,
 		BUG();
 	}
 
-	if (tsk) {
-		if (ret & VM_FAULT_MAJOR)
-			tsk->maj_flt++;
-		else
-			tsk->min_flt++;
-	}
-
 	if (ret & VM_FAULT_RETRY) {
 		if (locked && !(fault_flags & FAULT_FLAG_RETRY_NOWAIT))
 			*locked = 0;
@@ -1239,12 +1232,6 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm,
 		goto retry;
 	}
 
-	if (tsk) {
-		if (major)
-			tsk->maj_flt++;
-		else
-			tsk->min_flt++;
-	}
 	return 0;
 }
 EXPORT_SYMBOL_GPL(fixup_user_fault);
diff --git a/mm/memory.c b/mm/memory.c
index 4a9b333b079e..0b3c747cd2b3 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -4350,6 +4350,8 @@ static vm_fault_t __handle_mm_fault(struct vm_area_struct *vma,
 /**
  * mm_account_fault - Do page fault accountings
  * @regs: the pt_regs struct pointer.  When set to NULL, will skip accounting
+ *        of perf event counters, but we'll still do the per-task accounting to
+ *        the task who triggered this page fault.
  * @address: faulted address.
  * @major: whether this is a major fault.
  *
@@ -4365,16 +4367,18 @@ static vm_fault_t __handle_mm_fault(struct vm_area_struct *vma,
 static inline void mm_account_fault(struct pt_regs *regs,
 				    unsigned long address, bool major)
 {
+	if (major)
+		current->maj_flt++;
+	else
+		current->min_flt++;
+
 	if (!regs)
 		return;
 
-	if (major) {
-		current->maj_flt++;
+	if (major)
 		perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address);
-	} else {
-		current->min_flt++;
+	else
 		perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address);
-	}
 }
 
 /*
@@ -4447,8 +4451,9 @@ vm_fault_t handle_mm_fault(struct vm_area_struct *vma, unsigned long address,
 	 *    fault is VM_FAULT_MAJOR, or if it was a retry (which implies that
 	 *    we couldn't handle it immediately previously).
 	 *
-	 *  - If the fault is done for GUP, regs will be NULL and no accounting
-	 *    will be done.
+	 *  - If the fault is done for GUP, regs will be NULL and we only do
+	 *    the accounting for the per thread fault counters who triggered
+	 *    the fault, and we skip the perf event updates.
 	 */
 	mm_account_fault(regs, address, (ret & VM_FAULT_MAJOR) ||
 			 (flags & FAULT_FLAG_TRIED));
-- 
2.26.2


  parent reply	other threads:[~2020-06-26 22:36 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-26 22:31 [PATCH 00/26] mm: Page fault accounting cleanups Peter Xu
2020-06-26 22:31 ` [PATCH 01/26] mm: Do page fault accounting in handle_mm_fault Peter Xu
2020-06-29  1:52   ` John Hubbard
2020-06-29 14:56     ` Peter Xu
2020-06-26 22:31 ` [PATCH 02/26] mm/alpha: Use general page fault accounting Peter Xu
2020-06-26 22:31 ` [PATCH 03/26] mm/arc: " Peter Xu
2020-06-26 22:31 ` [PATCH 04/26] mm/arm: " Peter Xu
2020-06-26 22:31 ` [PATCH 05/26] mm/arm64: " Peter Xu
2020-06-26 22:31 ` [PATCH 06/26] mm/csky: " Peter Xu
2020-06-26 22:31 ` [PATCH 07/26] mm/hexagon: " Peter Xu
2020-06-26 22:31 ` [PATCH 08/26] mm/ia64: " Peter Xu
2020-06-26 22:31 ` [PATCH 09/26] mm/m68k: " Peter Xu
2020-06-26 22:31 ` [PATCH 10/26] mm/microblaze: " Peter Xu
2020-06-26 22:31 ` [PATCH 11/26] mm/mips: " Peter Xu
2020-06-26 22:31 ` [PATCH 12/26] mm/nds32: " Peter Xu
2020-06-27  2:59   ` Greentime Hu
2020-06-26 22:36 ` [PATCH 13/26] mm/nios2: " Peter Xu
2020-06-26 22:36 ` [PATCH 14/26] mm/openrisc: " Peter Xu
2020-06-26 22:36 ` [PATCH 15/26] mm/parisc: " Peter Xu
2020-06-26 22:36 ` [PATCH 16/26] mm/powerpc: " Peter Xu
2020-07-03 11:08   ` Michael Ellerman
2020-06-26 22:36 ` [PATCH 17/26] mm/riscv: " Peter Xu
2020-07-01 11:46   ` Pekka Enberg
2020-07-02 15:51     ` Peter Xu
2020-07-11 19:43   ` Palmer Dabbelt
2020-07-14 15:12     ` Pekka Enberg
2020-06-26 22:36 ` [PATCH 18/26] mm/s390: " Peter Xu
2020-06-26 22:36 ` [PATCH 19/26] mm/sh: " Peter Xu
2020-06-26 22:36 ` [PATCH 20/26] mm/sparc32: " Peter Xu
2020-06-26 22:36 ` [PATCH 21/26] mm/sparc64: " Peter Xu
2020-06-26 22:36 ` [PATCH 22/26] mm/unicore32: " Peter Xu
2020-06-26 22:36 ` [PATCH 23/26] mm/x86: " Peter Xu
2020-06-26 22:36 ` [PATCH 24/26] mm/xtensa: " Peter Xu
2020-06-26 22:36 ` Peter Xu [this message]
2020-06-26 22:36 ` [PATCH 26/26] mm/gup: Remove task_struct pointer for all gup code Peter Xu
  -- strict thread matches above, loose matches on Subject: below --
2020-06-19 16:05 [PATCH 00/26] mm: Page fault accounting cleanups Peter Xu
2020-06-19 16:14 ` [PATCH 25/26] mm: Clean up the last pieces of page fault accountings Peter Xu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200626223645.200199-1-peterx@redhat.com \
    --to=peterx@redhat.com \
    --cc=aarcange@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=gerald.schaefer@de.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mpe@ellerman.id.au \
    --cc=torvalds@linux-foundation.org \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).