diff mbox series

[v1] mm/rmap: cleanup partially-mapped handling in __folio_remove_rmap()

Message ID 20240618151026.521019-1-david@redhat.com (mailing list archive)
State New
Headers show
Series [v1] mm/rmap: cleanup partially-mapped handling in __folio_remove_rmap() | expand

Commit Message

David Hildenbrand June 18, 2024, 3:10 p.m. UTC
Let's simplify and reduce code indentation. In the RMAP_LEVEL_PTE case, we
already check for nr when computing partially_mapped.

For RMAP_LEVEL_PMD, it's a bit more confusing. Likely, we don't need the
"nr" check, but we could have "nr < nr_pmdmapped" also if we stumbled
into the "/* Raced ahead of another remove and an add? */" case. So
let's simply move the nr check in there.

Note that partially_mapped is always false for small folios.

No functional change intended.

Cc: Yosry Ahmed <yosryahmed@google.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 mm/rmap.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

Comments

Zi Yan June 21, 2024, 1:49 a.m. UTC | #1
On 18 Jun 2024, at 11:10, David Hildenbrand wrote:

> Let's simplify and reduce code indentation. In the RMAP_LEVEL_PTE case, we
> already check for nr when computing partially_mapped.
>
> For RMAP_LEVEL_PMD, it's a bit more confusing. Likely, we don't need the
> "nr" check, but we could have "nr < nr_pmdmapped" also if we stumbled
> into the "/* Raced ahead of another remove and an add? */" case. So
> let's simply move the nr check in there.
>
> Note that partially_mapped is always false for small folios.
>
> No functional change intended.
>
> Cc: Yosry Ahmed <yosryahmed@google.com>
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  mm/rmap.c | 10 ++++------
>  1 file changed, 4 insertions(+), 6 deletions(-)

LGTM. Reviewed-by: Zi Yan <ziy@nvidia.com>

--
Best Regards,
Yan, Zi
Yosry Ahmed June 24, 2024, 11:48 a.m. UTC | #2
On Tue, Jun 18, 2024 at 8:10 AM David Hildenbrand <david@redhat.com> wrote:
>
> Let's simplify and reduce code indentation. In the RMAP_LEVEL_PTE case, we
> already check for nr when computing partially_mapped.
>
> For RMAP_LEVEL_PMD, it's a bit more confusing. Likely, we don't need the
> "nr" check, but we could have "nr < nr_pmdmapped" also if we stumbled
> into the "/* Raced ahead of another remove and an add? */" case. So
> let's simply move the nr check in there.
>
> Note that partially_mapped is always false for small folios.
>
> No functional change intended.
>
> Cc: Yosry Ahmed <yosryahmed@google.com>
> Signed-off-by: David Hildenbrand <david@redhat.com>

Makes sense to me. FWIW:

Reviewed-by: Yosry Ahmed <yosryahmed@google.com>

> ---
>  mm/rmap.c | 10 ++++------
>  1 file changed, 4 insertions(+), 6 deletions(-)
>
> diff --git a/mm/rmap.c b/mm/rmap.c
> index afec4b6800caf..aa900e46cdf82 100644
> --- a/mm/rmap.c
> +++ b/mm/rmap.c
> @@ -1551,11 +1551,12 @@ static __always_inline void __folio_remove_rmap(struct folio *folio,
>                         }
>                 }
>
> -               partially_mapped = nr < nr_pmdmapped;
> +               partially_mapped = nr && nr < nr_pmdmapped;
>                 break;
>         }
>
> -       if (nr) {
> +       if (partially_mapped && folio_test_anon(folio) &&
> +           list_empty(&folio->_deferred_list))
>                 /*
>                  * Queue anon large folio for deferred split if at least one
>                  * page of the folio is unmapped and at least one page
> @@ -1563,10 +1564,7 @@ static __always_inline void __folio_remove_rmap(struct folio *folio,
>                  *
>                  * Check partially_mapped first to ensure it is a large folio.
>                  */
> -               if (folio_test_anon(folio) && partially_mapped &&
> -                   list_empty(&folio->_deferred_list))
> -                       deferred_split_folio(folio);
> -       }
> +               deferred_split_folio(folio);

FWIW, I prefer moving the comment out of the one-line if block as you
originally suggested in [1].

[1]https://lore.kernel.org/lkml/1a408ed1-7e81-457e-a205-db274b4d6b78@redhat.com/

>         __folio_mod_stat(folio, -nr, -nr_pmdmapped);
>
>         /*
> --
> 2.45.2
>
David Hildenbrand July 10, 2024, 9:40 p.m. UTC | #3
On 24.06.24 13:48, Yosry Ahmed wrote:
> On Tue, Jun 18, 2024 at 8:10 AM David Hildenbrand <david@redhat.com> wrote:
>>
>> Let's simplify and reduce code indentation. In the RMAP_LEVEL_PTE case, we
>> already check for nr when computing partially_mapped.
>>
>> For RMAP_LEVEL_PMD, it's a bit more confusing. Likely, we don't need the
>> "nr" check, but we could have "nr < nr_pmdmapped" also if we stumbled
>> into the "/* Raced ahead of another remove and an add? */" case. So
>> let's simply move the nr check in there.
>>
>> Note that partially_mapped is always false for small folios.
>>
>> No functional change intended.
>>
>> Cc: Yosry Ahmed <yosryahmed@google.com>
>> Signed-off-by: David Hildenbrand <david@redhat.com>
> 
> Makes sense to me. FWIW:
> 
> Reviewed-by: Yosry Ahmed <yosryahmed@google.com>
> 
>> ---
>>   mm/rmap.c | 10 ++++------
>>   1 file changed, 4 insertions(+), 6 deletions(-)
>>
>> diff --git a/mm/rmap.c b/mm/rmap.c
>> index afec4b6800caf..aa900e46cdf82 100644
>> --- a/mm/rmap.c
>> +++ b/mm/rmap.c
>> @@ -1551,11 +1551,12 @@ static __always_inline void __folio_remove_rmap(struct folio *folio,
>>                          }
>>                  }
>>
>> -               partially_mapped = nr < nr_pmdmapped;
>> +               partially_mapped = nr && nr < nr_pmdmapped;
>>                  break;
>>          }
>>
>> -       if (nr) {
>> +       if (partially_mapped && folio_test_anon(folio) &&
>> +           list_empty(&folio->_deferred_list))
>>                  /*
>>                   * Queue anon large folio for deferred split if at least one
>>                   * page of the folio is unmapped and at least one page
>> @@ -1563,10 +1564,7 @@ static __always_inline void __folio_remove_rmap(struct folio *folio,
>>                   *
>>                   * Check partially_mapped first to ensure it is a large folio.
>>                   */
>> -               if (folio_test_anon(folio) && partially_mapped &&
>> -                   list_empty(&folio->_deferred_list))
>> -                       deferred_split_folio(folio);
>> -       }
>> +               deferred_split_folio(folio);
> 
> FWIW, I prefer moving the comment out of the one-line if block as you
> originally suggested in [1].
> 
> [1]https://lore.kernel.org/lkml/1a408ed1-7e81-457e-a205-db274b4d6b78@redhat.com/

Sorry for the late reply, crazy times here.

Let me do that and resend, thanks!
diff mbox series

Patch

diff --git a/mm/rmap.c b/mm/rmap.c
index afec4b6800caf..aa900e46cdf82 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -1551,11 +1551,12 @@  static __always_inline void __folio_remove_rmap(struct folio *folio,
 			}
 		}
 
-		partially_mapped = nr < nr_pmdmapped;
+		partially_mapped = nr && nr < nr_pmdmapped;
 		break;
 	}
 
-	if (nr) {
+	if (partially_mapped && folio_test_anon(folio) &&
+	    list_empty(&folio->_deferred_list))
 		/*
 		 * Queue anon large folio for deferred split if at least one
 		 * page of the folio is unmapped and at least one page
@@ -1563,10 +1564,7 @@  static __always_inline void __folio_remove_rmap(struct folio *folio,
 		 *
 		 * Check partially_mapped first to ensure it is a large folio.
 		 */
-		if (folio_test_anon(folio) && partially_mapped &&
-		    list_empty(&folio->_deferred_list))
-			deferred_split_folio(folio);
-	}
+		deferred_split_folio(folio);
 	__folio_mod_stat(folio, -nr, -nr_pmdmapped);
 
 	/*