[PATCH v3 6/7] mm/shmem, swap: fix major fault counting

Kairui Song posted 7 patches 3 months, 1 week ago
There is a newer version of this series
[PATCH v3 6/7] mm/shmem, swap: fix major fault counting
Posted by Kairui Song 3 months, 1 week ago
From: Kairui Song <kasong@tencent.com>

If the swapin failed, don't update the major fault count. There is a
long existing comment for doing it this way, now with previous cleanups,
we can finally fix it.

Signed-off-by: Kairui Song <kasong@tencent.com>
---
 mm/shmem.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/mm/shmem.c b/mm/shmem.c
index 5f2641fd1be7..ea9a105ded5d 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2316,12 +2316,6 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index,
 	/* Look it up and read it in.. */
 	folio = swap_cache_get_folio(swap, NULL, 0);
 	if (!folio) {
-		/* Or update major stats only when swapin succeeds?? */
-		if (fault_type) {
-			*fault_type |= VM_FAULT_MAJOR;
-			count_vm_event(PGMAJFAULT);
-			count_memcg_event_mm(fault_mm, PGMAJFAULT);
-		}
 		if (data_race(si->flags & SWP_SYNCHRONOUS_IO)) {
 			/* Direct mTHP swapin without swap cache or readahead */
 			folio = shmem_swapin_direct(inode, vma, index,
@@ -2341,6 +2335,11 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index,
 		}
 		if (!folio)
 			goto failed;
+		if (fault_type) {
+			*fault_type |= VM_FAULT_MAJOR;
+			count_vm_event(PGMAJFAULT);
+			count_memcg_event_mm(fault_mm, PGMAJFAULT);
+		}
 	}
 	/*
 	 * We need to split an existing large entry if swapin brought in a
-- 
2.50.0
Re: [PATCH v3 6/7] mm/shmem, swap: fix major fault counting
Posted by Baolin Wang 3 months, 1 week ago

On 2025/6/27 14:20, Kairui Song wrote:
> From: Kairui Song <kasong@tencent.com>
> 
> If the swapin failed, don't update the major fault count. There is a
> long existing comment for doing it this way, now with previous cleanups,
> we can finally fix it.

Sounds reasonable to me. Additionally, swapin failure is a rare event, 
so I think this patch will have little impact on user statistics.

Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>

> Signed-off-by: Kairui Song <kasong@tencent.com>
> ---
>   mm/shmem.c | 11 +++++------
>   1 file changed, 5 insertions(+), 6 deletions(-)
> 
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 5f2641fd1be7..ea9a105ded5d 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -2316,12 +2316,6 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index,
>   	/* Look it up and read it in.. */
>   	folio = swap_cache_get_folio(swap, NULL, 0);
>   	if (!folio) {
> -		/* Or update major stats only when swapin succeeds?? */
> -		if (fault_type) {
> -			*fault_type |= VM_FAULT_MAJOR;
> -			count_vm_event(PGMAJFAULT);
> -			count_memcg_event_mm(fault_mm, PGMAJFAULT);
> -		}
>   		if (data_race(si->flags & SWP_SYNCHRONOUS_IO)) {
>   			/* Direct mTHP swapin without swap cache or readahead */
>   			folio = shmem_swapin_direct(inode, vma, index,
> @@ -2341,6 +2335,11 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index,
>   		}
>   		if (!folio)
>   			goto failed;
> +		if (fault_type) {
> +			*fault_type |= VM_FAULT_MAJOR;
> +			count_vm_event(PGMAJFAULT);
> +			count_memcg_event_mm(fault_mm, PGMAJFAULT);
> +		}
>   	}
>   	/*
>   	 * We need to split an existing large entry if swapin brought in a