linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH 5/5] Revert "mm/migrate: __unmap_and_move() push good newpage to LRU"
@ 2023-06-18  6:58 Yosry Ahmed
  2023-06-19  1:57 ` Huang, Ying
  0 siblings, 1 reply; 8+ messages in thread
From: Yosry Ahmed @ 2023-06-18  6:58 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Yu Zhao, Jan Alexander Steffens (heftig),
	Steven Barrett, Brian Geffon, T.J. Alumbaugh, Gaosheng Cui,
	Suren Baghdasaryan, Matthew Wilcox (Oracle),
	Liam R. Howlett, David Hildenbrand, Jason Gunthorpe,
	Mathieu Desnoyers, David Howells, Hugh Dickins, Greg Thelen,
	linux-mm, linux-kernel, Yosry Ahmed

This reverts commit c3096e6782b733158bf34f6bbb4567808d4e0740.

That commit made sure we immediately add the new page to the LRU before
remove_migration_ptes() is called in migrate_move_folio() (used to be
__unmap_and_move() back then), such that the rmap walk will rebuild the
correct mlock_count for the page again. This was needed because the
mlock_count was lost when the page is isolated. This is no longer the
case since mlock_count no longer overlays page->lru.

Revert the commit (the code was foliated afterward the commit, so the
revert is updated as such).

Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
---
 mm/migrate.c | 24 +++++++++---------------
 1 file changed, 9 insertions(+), 15 deletions(-)

diff --git a/mm/migrate.c b/mm/migrate.c
index 01cac26a3127..68f693731865 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1279,19 +1279,6 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
 	if (unlikely(!is_lru))
 		goto out_unlock_both;
 
-	/*
-	 * When successful, push dst to LRU immediately: so that if it
-	 * turns out to be an mlocked page, remove_migration_ptes() will
-	 * automatically build up the correct dst->mlock_count for it.
-	 *
-	 * We would like to do something similar for the old page, when
-	 * unsuccessful, and other cases when a page has been temporarily
-	 * isolated from the unevictable LRU: but this case is the easiest.
-	 */
-	folio_add_lru(dst);
-	if (page_was_mapped)
-		lru_add_drain();
-
 	if (page_was_mapped)
 		remove_migration_ptes(src, dst, false);
 
@@ -1301,9 +1288,16 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
 	/*
 	 * If migration is successful, decrease refcount of dst,
 	 * which will not free the page because new page owner increased
-	 * refcounter.
+	 * refcounter. As well, if it is LRU folio, add the folio to LRU
+	 * list in here. Use the old state of the isolated source folio to
+	 * determine if we migrated a LRU folio. dst was already unlocked
+	 * and possibly modified by its owner - don't rely on the folio
+	 * state.
 	 */
-	folio_put(dst);
+	if (unlikely(!is_lru))
+		folio_put(dst);
+	else
+		folio_putback_lru(dst);
 
 	/*
 	 * A folio that has been migrated has all references removed
-- 
2.41.0.162.gfafddb0af9-goog



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 5/5] Revert "mm/migrate: __unmap_and_move() push good newpage to LRU"
  2023-06-18  6:58 [RFC PATCH 5/5] Revert "mm/migrate: __unmap_and_move() push good newpage to LRU" Yosry Ahmed
@ 2023-06-19  1:57 ` Huang, Ying
  2023-06-19  3:59   ` Yosry Ahmed
  0 siblings, 1 reply; 8+ messages in thread
From: Huang, Ying @ 2023-06-19  1:57 UTC (permalink / raw)
  To: Yosry Ahmed
  Cc: Andrew Morton, Yu Zhao, Jan Alexander Steffens (heftig),
	Steven Barrett, Brian Geffon, T.J. Alumbaugh, Gaosheng Cui,
	Suren Baghdasaryan, Matthew Wilcox (Oracle),
	Liam R. Howlett, David Hildenbrand, Jason Gunthorpe,
	Mathieu Desnoyers, David Howells, Hugh Dickins, Greg Thelen,
	linux-mm, linux-kernel

Hi, Yosry,

Yosry Ahmed <yosryahmed@google.com> writes:

> This reverts commit c3096e6782b733158bf34f6bbb4567808d4e0740.
>
> That commit made sure we immediately add the new page to the LRU before
> remove_migration_ptes() is called in migrate_move_folio() (used to be
> __unmap_and_move() back then), such that the rmap walk will rebuild the
> correct mlock_count for the page again. This was needed because the
> mlock_count was lost when the page is isolated. This is no longer the
> case since mlock_count no longer overlays page->lru.
>
> Revert the commit (the code was foliated afterward the commit, so the
> revert is updated as such).
>
> Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
> ---
>  mm/migrate.c | 24 +++++++++---------------
>  1 file changed, 9 insertions(+), 15 deletions(-)
>
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 01cac26a3127..68f693731865 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1279,19 +1279,6 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
>  	if (unlikely(!is_lru))
>  		goto out_unlock_both;

The patch itself looks good to me!  Thanks!

Reviewed-by: "Huang, Ying" <ying.huang@intel.com>

And, it seems that we can remove the above 2 lines and "out_unlock_both"
label now.  That can make the code simpler a little.  Right?

Best Regards,
Huang, Ying

> -	/*
> -	 * When successful, push dst to LRU immediately: so that if it
> -	 * turns out to be an mlocked page, remove_migration_ptes() will
> -	 * automatically build up the correct dst->mlock_count for it.
> -	 *
> -	 * We would like to do something similar for the old page, when
> -	 * unsuccessful, and other cases when a page has been temporarily
> -	 * isolated from the unevictable LRU: but this case is the easiest.
> -	 */
> -	folio_add_lru(dst);
> -	if (page_was_mapped)
> -		lru_add_drain();
> -
>  	if (page_was_mapped)
>  		remove_migration_ptes(src, dst, false);
>  
> @@ -1301,9 +1288,16 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
>  	/*
>  	 * If migration is successful, decrease refcount of dst,
>  	 * which will not free the page because new page owner increased
> -	 * refcounter.
> +	 * refcounter. As well, if it is LRU folio, add the folio to LRU
> +	 * list in here. Use the old state of the isolated source folio to
> +	 * determine if we migrated a LRU folio. dst was already unlocked
> +	 * and possibly modified by its owner - don't rely on the folio
> +	 * state.
>  	 */
> -	folio_put(dst);
> +	if (unlikely(!is_lru))
> +		folio_put(dst);
> +	else
> +		folio_putback_lru(dst);
>  
>  	/*
>  	 * A folio that has been migrated has all references removed


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 5/5] Revert "mm/migrate: __unmap_and_move() push good newpage to LRU"
  2023-06-19  1:57 ` Huang, Ying
@ 2023-06-19  3:59   ` Yosry Ahmed
  2023-06-19  4:27     ` Huang, Ying
  2023-06-19  7:56     ` David Hildenbrand
  0 siblings, 2 replies; 8+ messages in thread
From: Yosry Ahmed @ 2023-06-19  3:59 UTC (permalink / raw)
  To: Huang, Ying
  Cc: Andrew Morton, Yu Zhao, Jan Alexander Steffens (heftig),
	Steven Barrett, Brian Geffon, T.J. Alumbaugh, Gaosheng Cui,
	Suren Baghdasaryan, Matthew Wilcox (Oracle),
	Liam R. Howlett, David Hildenbrand, Jason Gunthorpe,
	Mathieu Desnoyers, David Howells, Hugh Dickins, Greg Thelen,
	linux-mm, linux-kernel

On Sun, Jun 18, 2023 at 7:00 PM Huang, Ying <ying.huang@intel.com> wrote:
>
> Hi, Yosry,
>
> Yosry Ahmed <yosryahmed@google.com> writes:
>
> > This reverts commit c3096e6782b733158bf34f6bbb4567808d4e0740.
> >
> > That commit made sure we immediately add the new page to the LRU before
> > remove_migration_ptes() is called in migrate_move_folio() (used to be
> > __unmap_and_move() back then), such that the rmap walk will rebuild the
> > correct mlock_count for the page again. This was needed because the
> > mlock_count was lost when the page is isolated. This is no longer the
> > case since mlock_count no longer overlays page->lru.
> >
> > Revert the commit (the code was foliated afterward the commit, so the
> > revert is updated as such).
> >
> > Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
> > ---
> >  mm/migrate.c | 24 +++++++++---------------
> >  1 file changed, 9 insertions(+), 15 deletions(-)
> >
> > diff --git a/mm/migrate.c b/mm/migrate.c
> > index 01cac26a3127..68f693731865 100644
> > --- a/mm/migrate.c
> > +++ b/mm/migrate.c
> > @@ -1279,19 +1279,6 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
> >       if (unlikely(!is_lru))
> >               goto out_unlock_both;
>
> The patch itself looks good to me!  Thanks!
>
> Reviewed-by: "Huang, Ying" <ying.huang@intel.com>

Thanks for taking a look!

>
> And, it seems that we can remove the above 2 lines and "out_unlock_both"
> label now.  That can make the code simpler a little.  Right?

I am not familiar with this code. If we remove the above condition
then pages that have is_lru == 0 (i.e __PageMovable(src) is true) and
page_was_mapped == 1 will call remove_migration_ptes(). This wouldn't
happen without removing the above 2 lines. If this combination is
impossible (is_lru == 0 && page_was_mapped == 1), then yeah we can
remove the above condition.

It looks like __SetPageMovable() is only called by zsmalloc, z3fold,
and balloon_page_insert(). The former 2 will never have those pages
mapped into userspace. I am not familiar with balloon_page_insert(),
but my gut feeling is that those are pages used by the driver and are
also not mapped into userspace.

So I guess we can just remove the condition, but a confirmation for
the above would be reassuring :)

>
> Best Regards,
> Huang, Ying
>
> > -     /*
> > -      * When successful, push dst to LRU immediately: so that if it
> > -      * turns out to be an mlocked page, remove_migration_ptes() will
> > -      * automatically build up the correct dst->mlock_count for it.
> > -      *
> > -      * We would like to do something similar for the old page, when
> > -      * unsuccessful, and other cases when a page has been temporarily
> > -      * isolated from the unevictable LRU: but this case is the easiest.
> > -      */
> > -     folio_add_lru(dst);
> > -     if (page_was_mapped)
> > -             lru_add_drain();
> > -
> >       if (page_was_mapped)
> >               remove_migration_ptes(src, dst, false);
> >
> > @@ -1301,9 +1288,16 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
> >       /*
> >        * If migration is successful, decrease refcount of dst,
> >        * which will not free the page because new page owner increased
> > -      * refcounter.
> > +      * refcounter. As well, if it is LRU folio, add the folio to LRU
> > +      * list in here. Use the old state of the isolated source folio to
> > +      * determine if we migrated a LRU folio. dst was already unlocked
> > +      * and possibly modified by its owner - don't rely on the folio
> > +      * state.
> >        */
> > -     folio_put(dst);
> > +     if (unlikely(!is_lru))
> > +             folio_put(dst);
> > +     else
> > +             folio_putback_lru(dst);
> >
> >       /*
> >        * A folio that has been migrated has all references removed
>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 5/5] Revert "mm/migrate: __unmap_and_move() push good newpage to LRU"
  2023-06-19  3:59   ` Yosry Ahmed
@ 2023-06-19  4:27     ` Huang, Ying
  2023-06-19  4:34       ` Yosry Ahmed
  2023-06-19  7:56     ` David Hildenbrand
  1 sibling, 1 reply; 8+ messages in thread
From: Huang, Ying @ 2023-06-19  4:27 UTC (permalink / raw)
  To: Yosry Ahmed
  Cc: Andrew Morton, Yu Zhao, Jan Alexander Steffens (heftig),
	Steven Barrett, Brian Geffon, T.J. Alumbaugh, Gaosheng Cui,
	Suren Baghdasaryan, Matthew Wilcox (Oracle),
	Liam R. Howlett, David Hildenbrand, Jason Gunthorpe,
	Mathieu Desnoyers, David Howells, Hugh Dickins, Greg Thelen,
	linux-mm, linux-kernel

Yosry Ahmed <yosryahmed@google.com> writes:

> On Sun, Jun 18, 2023 at 7:00 PM Huang, Ying <ying.huang@intel.com> wrote:
>>
>> Hi, Yosry,
>>
>> Yosry Ahmed <yosryahmed@google.com> writes:
>>
>> > This reverts commit c3096e6782b733158bf34f6bbb4567808d4e0740.
>> >
>> > That commit made sure we immediately add the new page to the LRU before
>> > remove_migration_ptes() is called in migrate_move_folio() (used to be
>> > __unmap_and_move() back then), such that the rmap walk will rebuild the
>> > correct mlock_count for the page again. This was needed because the
>> > mlock_count was lost when the page is isolated. This is no longer the
>> > case since mlock_count no longer overlays page->lru.
>> >
>> > Revert the commit (the code was foliated afterward the commit, so the
>> > revert is updated as such).
>> >
>> > Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
>> > ---
>> >  mm/migrate.c | 24 +++++++++---------------
>> >  1 file changed, 9 insertions(+), 15 deletions(-)
>> >
>> > diff --git a/mm/migrate.c b/mm/migrate.c
>> > index 01cac26a3127..68f693731865 100644
>> > --- a/mm/migrate.c
>> > +++ b/mm/migrate.c
>> > @@ -1279,19 +1279,6 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
>> >       if (unlikely(!is_lru))
>> >               goto out_unlock_both;
>>
>> The patch itself looks good to me!  Thanks!
>>
>> Reviewed-by: "Huang, Ying" <ying.huang@intel.com>
>
> Thanks for taking a look!
>
>>
>> And, it seems that we can remove the above 2 lines and "out_unlock_both"
>> label now.  That can make the code simpler a little.  Right?
>
> I am not familiar with this code. If we remove the above condition
> then pages that have is_lru == 0 (i.e __PageMovable(src) is true) and
> page_was_mapped == 1 will call remove_migration_ptes(). This wouldn't
> happen without removing the above 2 lines. If this combination is
> impossible (is_lru == 0 && page_was_mapped == 1), then yeah we can
> remove the above condition.
>
> It looks like __SetPageMovable() is only called by zsmalloc, z3fold,
> and balloon_page_insert(). The former 2 will never have those pages
> mapped into userspace. I am not familiar with balloon_page_insert(),
> but my gut feeling is that those are pages used by the driver and are
> also not mapped into userspace.

You can take a look at migrate_folio_unmap(), where "page_was_mapped"
will not be set to 1 if !is_lru.

Best Regards,
Huang, Ying

> So I guess we can just remove the condition, but a confirmation for
> the above would be reassuring :)
>
>>
>> Best Regards,
>> Huang, Ying
>>
>> > -     /*
>> > -      * When successful, push dst to LRU immediately: so that if it
>> > -      * turns out to be an mlocked page, remove_migration_ptes() will
>> > -      * automatically build up the correct dst->mlock_count for it.
>> > -      *
>> > -      * We would like to do something similar for the old page, when
>> > -      * unsuccessful, and other cases when a page has been temporarily
>> > -      * isolated from the unevictable LRU: but this case is the easiest.
>> > -      */
>> > -     folio_add_lru(dst);
>> > -     if (page_was_mapped)
>> > -             lru_add_drain();
>> > -
>> >       if (page_was_mapped)
>> >               remove_migration_ptes(src, dst, false);
>> >
>> > @@ -1301,9 +1288,16 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
>> >       /*
>> >        * If migration is successful, decrease refcount of dst,
>> >        * which will not free the page because new page owner increased
>> > -      * refcounter.
>> > +      * refcounter. As well, if it is LRU folio, add the folio to LRU
>> > +      * list in here. Use the old state of the isolated source folio to
>> > +      * determine if we migrated a LRU folio. dst was already unlocked
>> > +      * and possibly modified by its owner - don't rely on the folio
>> > +      * state.
>> >        */
>> > -     folio_put(dst);
>> > +     if (unlikely(!is_lru))
>> > +             folio_put(dst);
>> > +     else
>> > +             folio_putback_lru(dst);
>> >
>> >       /*
>> >        * A folio that has been migrated has all references removed
>>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 5/5] Revert "mm/migrate: __unmap_and_move() push good newpage to LRU"
  2023-06-19  4:27     ` Huang, Ying
@ 2023-06-19  4:34       ` Yosry Ahmed
  0 siblings, 0 replies; 8+ messages in thread
From: Yosry Ahmed @ 2023-06-19  4:34 UTC (permalink / raw)
  To: Huang, Ying
  Cc: Andrew Morton, Yu Zhao, Jan Alexander Steffens (heftig),
	Steven Barrett, Brian Geffon, T.J. Alumbaugh, Gaosheng Cui,
	Suren Baghdasaryan, Matthew Wilcox (Oracle),
	Liam R. Howlett, David Hildenbrand, Jason Gunthorpe,
	Mathieu Desnoyers, David Howells, Hugh Dickins, Greg Thelen,
	linux-mm, linux-kernel

On Sun, Jun 18, 2023 at 9:29 PM Huang, Ying <ying.huang@intel.com> wrote:
>
> Yosry Ahmed <yosryahmed@google.com> writes:
>
> > On Sun, Jun 18, 2023 at 7:00 PM Huang, Ying <ying.huang@intel.com> wrote:
> >>
> >> Hi, Yosry,
> >>
> >> Yosry Ahmed <yosryahmed@google.com> writes:
> >>
> >> > This reverts commit c3096e6782b733158bf34f6bbb4567808d4e0740.
> >> >
> >> > That commit made sure we immediately add the new page to the LRU before
> >> > remove_migration_ptes() is called in migrate_move_folio() (used to be
> >> > __unmap_and_move() back then), such that the rmap walk will rebuild the
> >> > correct mlock_count for the page again. This was needed because the
> >> > mlock_count was lost when the page is isolated. This is no longer the
> >> > case since mlock_count no longer overlays page->lru.
> >> >
> >> > Revert the commit (the code was foliated afterward the commit, so the
> >> > revert is updated as such).
> >> >
> >> > Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
> >> > ---
> >> >  mm/migrate.c | 24 +++++++++---------------
> >> >  1 file changed, 9 insertions(+), 15 deletions(-)
> >> >
> >> > diff --git a/mm/migrate.c b/mm/migrate.c
> >> > index 01cac26a3127..68f693731865 100644
> >> > --- a/mm/migrate.c
> >> > +++ b/mm/migrate.c
> >> > @@ -1279,19 +1279,6 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
> >> >       if (unlikely(!is_lru))
> >> >               goto out_unlock_both;
> >>
> >> The patch itself looks good to me!  Thanks!
> >>
> >> Reviewed-by: "Huang, Ying" <ying.huang@intel.com>
> >
> > Thanks for taking a look!
> >
> >>
> >> And, it seems that we can remove the above 2 lines and "out_unlock_both"
> >> label now.  That can make the code simpler a little.  Right?
> >
> > I am not familiar with this code. If we remove the above condition
> > then pages that have is_lru == 0 (i.e __PageMovable(src) is true) and
> > page_was_mapped == 1 will call remove_migration_ptes(). This wouldn't
> > happen without removing the above 2 lines. If this combination is
> > impossible (is_lru == 0 && page_was_mapped == 1), then yeah we can
> > remove the above condition.
> >
> > It looks like __SetPageMovable() is only called by zsmalloc, z3fold,
> > and balloon_page_insert(). The former 2 will never have those pages
> > mapped into userspace. I am not familiar with balloon_page_insert(),
> > but my gut feeling is that those are pages used by the driver and are
> > also not mapped into userspace.
>
> You can take a look at migrate_folio_unmap(), where "page_was_mapped"
> will not be set to 1 if !is_lru.

Oh I was looking in the wrong place huh, thanks. Will remove it when I respin!

>
> Best Regards,
> Huang, Ying
>
> > So I guess we can just remove the condition, but a confirmation for
> > the above would be reassuring :)
> >
> >>
> >> Best Regards,
> >> Huang, Ying
> >>
> >> > -     /*
> >> > -      * When successful, push dst to LRU immediately: so that if it
> >> > -      * turns out to be an mlocked page, remove_migration_ptes() will
> >> > -      * automatically build up the correct dst->mlock_count for it.
> >> > -      *
> >> > -      * We would like to do something similar for the old page, when
> >> > -      * unsuccessful, and other cases when a page has been temporarily
> >> > -      * isolated from the unevictable LRU: but this case is the easiest.
> >> > -      */
> >> > -     folio_add_lru(dst);
> >> > -     if (page_was_mapped)
> >> > -             lru_add_drain();
> >> > -
> >> >       if (page_was_mapped)
> >> >               remove_migration_ptes(src, dst, false);
> >> >
> >> > @@ -1301,9 +1288,16 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
> >> >       /*
> >> >        * If migration is successful, decrease refcount of dst,
> >> >        * which will not free the page because new page owner increased
> >> > -      * refcounter.
> >> > +      * refcounter. As well, if it is LRU folio, add the folio to LRU
> >> > +      * list in here. Use the old state of the isolated source folio to
> >> > +      * determine if we migrated a LRU folio. dst was already unlocked
> >> > +      * and possibly modified by its owner - don't rely on the folio
> >> > +      * state.
> >> >        */
> >> > -     folio_put(dst);
> >> > +     if (unlikely(!is_lru))
> >> > +             folio_put(dst);
> >> > +     else
> >> > +             folio_putback_lru(dst);
> >> >
> >> >       /*
> >> >        * A folio that has been migrated has all references removed
> >>
>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 5/5] Revert "mm/migrate: __unmap_and_move() push good newpage to LRU"
  2023-06-19  3:59   ` Yosry Ahmed
  2023-06-19  4:27     ` Huang, Ying
@ 2023-06-19  7:56     ` David Hildenbrand
  2023-06-19  7:58       ` David Hildenbrand
  1 sibling, 1 reply; 8+ messages in thread
From: David Hildenbrand @ 2023-06-19  7:56 UTC (permalink / raw)
  To: Yosry Ahmed, Huang, Ying
  Cc: Andrew Morton, Yu Zhao, Jan Alexander Steffens (heftig),
	Steven Barrett, Brian Geffon, T.J. Alumbaugh, Gaosheng Cui,
	Suren Baghdasaryan, Matthew Wilcox (Oracle),
	Liam R. Howlett, Jason Gunthorpe, Mathieu Desnoyers,
	David Howells, Hugh Dickins, Greg Thelen, linux-mm, linux-kernel

On 19.06.23 05:59, Yosry Ahmed wrote:
> On Sun, Jun 18, 2023 at 7:00 PM Huang, Ying <ying.huang@intel.com> wrote:
>>
>> Hi, Yosry,
>>
>> Yosry Ahmed <yosryahmed@google.com> writes:
>>
>>> This reverts commit c3096e6782b733158bf34f6bbb4567808d4e0740.
>>>
>>> That commit made sure we immediately add the new page to the LRU before
>>> remove_migration_ptes() is called in migrate_move_folio() (used to be
>>> __unmap_and_move() back then), such that the rmap walk will rebuild the
>>> correct mlock_count for the page again. This was needed because the
>>> mlock_count was lost when the page is isolated. This is no longer the
>>> case since mlock_count no longer overlays page->lru.
>>>
>>> Revert the commit (the code was foliated afterward the commit, so the
>>> revert is updated as such).
>>>
>>> Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
>>> ---
>>>   mm/migrate.c | 24 +++++++++---------------
>>>   1 file changed, 9 insertions(+), 15 deletions(-)
>>>
>>> diff --git a/mm/migrate.c b/mm/migrate.c
>>> index 01cac26a3127..68f693731865 100644
>>> --- a/mm/migrate.c
>>> +++ b/mm/migrate.c
>>> @@ -1279,19 +1279,6 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
>>>        if (unlikely(!is_lru))
>>>                goto out_unlock_both;
>>
>> The patch itself looks good to me!  Thanks!
>>
>> Reviewed-by: "Huang, Ying" <ying.huang@intel.com>
> 
> Thanks for taking a look!
> 
>>
>> And, it seems that we can remove the above 2 lines and "out_unlock_both"
>> label now.  That can make the code simpler a little.  Right?
> 
> I am not familiar with this code. If we remove the above condition
> then pages that have is_lru == 0 (i.e __PageMovable(src) is true) and
> page_was_mapped == 1 will call remove_migration_ptes(). This wouldn't
> happen without removing the above 2 lines. If this combination is
> impossible (is_lru == 0 && page_was_mapped == 1), then yeah we can
> remove the above condition.
> 
> It looks like __SetPageMovable() is only called by zsmalloc, z3fold,
> and balloon_page_insert(). The former 2 will never have those pages
> mapped into userspace. I am not familiar with balloon_page_insert(),
> but my gut feeling is that those are pages used by the driver and are
> also not mapped into userspace.

On XEN, there is xen_alloc_ballooned_pages(), which ends up mapping 
balloon-inflated pages into user space (for something like MMIO IIRC). 
But the XEN balloon does not use the balloon compaction framework, so 
__SetPageMovable() does not apply.

The other balloon_page_insert() users (VMware balloon, CMM, 
virtio-balloon) shouldn't be doing something like that.

-- 
Cheers,

David / dhildenb



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 5/5] Revert "mm/migrate: __unmap_and_move() push good newpage to LRU"
  2023-06-19  7:56     ` David Hildenbrand
@ 2023-06-19  7:58       ` David Hildenbrand
  2023-06-20 17:09         ` Yosry Ahmed
  0 siblings, 1 reply; 8+ messages in thread
From: David Hildenbrand @ 2023-06-19  7:58 UTC (permalink / raw)
  To: Yosry Ahmed, Huang, Ying
  Cc: Andrew Morton, Yu Zhao, Jan Alexander Steffens (heftig),
	Steven Barrett, Brian Geffon, T.J. Alumbaugh, Gaosheng Cui,
	Suren Baghdasaryan, Matthew Wilcox (Oracle),
	Liam R. Howlett, Jason Gunthorpe, Mathieu Desnoyers,
	David Howells, Hugh Dickins, Greg Thelen, linux-mm, linux-kernel

On 19.06.23 09:56, David Hildenbrand wrote:
> On 19.06.23 05:59, Yosry Ahmed wrote:
>> On Sun, Jun 18, 2023 at 7:00 PM Huang, Ying <ying.huang@intel.com> wrote:
>>>
>>> Hi, Yosry,
>>>
>>> Yosry Ahmed <yosryahmed@google.com> writes:
>>>
>>>> This reverts commit c3096e6782b733158bf34f6bbb4567808d4e0740.
>>>>
>>>> That commit made sure we immediately add the new page to the LRU before
>>>> remove_migration_ptes() is called in migrate_move_folio() (used to be
>>>> __unmap_and_move() back then), such that the rmap walk will rebuild the
>>>> correct mlock_count for the page again. This was needed because the
>>>> mlock_count was lost when the page is isolated. This is no longer the
>>>> case since mlock_count no longer overlays page->lru.
>>>>
>>>> Revert the commit (the code was foliated afterward the commit, so the
>>>> revert is updated as such).
>>>>
>>>> Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
>>>> ---
>>>>    mm/migrate.c | 24 +++++++++---------------
>>>>    1 file changed, 9 insertions(+), 15 deletions(-)
>>>>
>>>> diff --git a/mm/migrate.c b/mm/migrate.c
>>>> index 01cac26a3127..68f693731865 100644
>>>> --- a/mm/migrate.c
>>>> +++ b/mm/migrate.c
>>>> @@ -1279,19 +1279,6 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
>>>>         if (unlikely(!is_lru))
>>>>                 goto out_unlock_both;
>>>
>>> The patch itself looks good to me!  Thanks!
>>>
>>> Reviewed-by: "Huang, Ying" <ying.huang@intel.com>
>>
>> Thanks for taking a look!
>>
>>>
>>> And, it seems that we can remove the above 2 lines and "out_unlock_both"
>>> label now.  That can make the code simpler a little.  Right?
>>
>> I am not familiar with this code. If we remove the above condition
>> then pages that have is_lru == 0 (i.e __PageMovable(src) is true) and
>> page_was_mapped == 1 will call remove_migration_ptes(). This wouldn't
>> happen without removing the above 2 lines. If this combination is
>> impossible (is_lru == 0 && page_was_mapped == 1), then yeah we can
>> remove the above condition.
>>
>> It looks like __SetPageMovable() is only called by zsmalloc, z3fold,
>> and balloon_page_insert(). The former 2 will never have those pages
>> mapped into userspace. I am not familiar with balloon_page_insert(),
>> but my gut feeling is that those are pages used by the driver and are
>> also not mapped into userspace.
> 
> On XEN, there is xen_alloc_ballooned_pages(), which ends up mapping
> balloon-inflated pages into user space (for something like MMIO IIRC).
> But the XEN balloon does not use the balloon compaction framework, so
> __SetPageMovable() does not apply.
> 
> The other balloon_page_insert() users (VMware balloon, CMM,
> virtio-balloon) shouldn't be doing something like that.

Ah, and I remember they even can't, because in balloon_page_insert() we 
also do a __SetPageOffline(). And such typed pages cannot be mapped into 
user space (because the type overlays the mapcount).

-- 
Cheers,

David / dhildenb



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 5/5] Revert "mm/migrate: __unmap_and_move() push good newpage to LRU"
  2023-06-19  7:58       ` David Hildenbrand
@ 2023-06-20 17:09         ` Yosry Ahmed
  0 siblings, 0 replies; 8+ messages in thread
From: Yosry Ahmed @ 2023-06-20 17:09 UTC (permalink / raw)
  To: David Hildenbrand
  Cc: Huang, Ying, Andrew Morton, Yu Zhao,
	Jan Alexander Steffens (heftig),
	Steven Barrett, Brian Geffon, T.J. Alumbaugh, Gaosheng Cui,
	Suren Baghdasaryan, Matthew Wilcox (Oracle),
	Liam R. Howlett, Jason Gunthorpe, Mathieu Desnoyers,
	David Howells, Hugh Dickins, Greg Thelen, linux-mm, linux-kernel

On Mon, Jun 19, 2023 at 12:58 AM David Hildenbrand <david@redhat.com> wrote:
>
> On 19.06.23 09:56, David Hildenbrand wrote:
> > On 19.06.23 05:59, Yosry Ahmed wrote:
> >> On Sun, Jun 18, 2023 at 7:00 PM Huang, Ying <ying.huang@intel.com> wrote:
> >>>
> >>> Hi, Yosry,
> >>>
> >>> Yosry Ahmed <yosryahmed@google.com> writes:
> >>>
> >>>> This reverts commit c3096e6782b733158bf34f6bbb4567808d4e0740.
> >>>>
> >>>> That commit made sure we immediately add the new page to the LRU before
> >>>> remove_migration_ptes() is called in migrate_move_folio() (used to be
> >>>> __unmap_and_move() back then), such that the rmap walk will rebuild the
> >>>> correct mlock_count for the page again. This was needed because the
> >>>> mlock_count was lost when the page is isolated. This is no longer the
> >>>> case since mlock_count no longer overlays page->lru.
> >>>>
> >>>> Revert the commit (the code was foliated afterward the commit, so the
> >>>> revert is updated as such).
> >>>>
> >>>> Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
> >>>> ---
> >>>>    mm/migrate.c | 24 +++++++++---------------
> >>>>    1 file changed, 9 insertions(+), 15 deletions(-)
> >>>>
> >>>> diff --git a/mm/migrate.c b/mm/migrate.c
> >>>> index 01cac26a3127..68f693731865 100644
> >>>> --- a/mm/migrate.c
> >>>> +++ b/mm/migrate.c
> >>>> @@ -1279,19 +1279,6 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
> >>>>         if (unlikely(!is_lru))
> >>>>                 goto out_unlock_both;
> >>>
> >>> The patch itself looks good to me!  Thanks!
> >>>
> >>> Reviewed-by: "Huang, Ying" <ying.huang@intel.com>
> >>
> >> Thanks for taking a look!
> >>
> >>>
> >>> And, it seems that we can remove the above 2 lines and "out_unlock_both"
> >>> label now.  That can make the code simpler a little.  Right?
> >>
> >> I am not familiar with this code. If we remove the above condition
> >> then pages that have is_lru == 0 (i.e __PageMovable(src) is true) and
> >> page_was_mapped == 1 will call remove_migration_ptes(). This wouldn't
> >> happen without removing the above 2 lines. If this combination is
> >> impossible (is_lru == 0 && page_was_mapped == 1), then yeah we can
> >> remove the above condition.
> >>
> >> It looks like __SetPageMovable() is only called by zsmalloc, z3fold,
> >> and balloon_page_insert(). The former 2 will never have those pages
> >> mapped into userspace. I am not familiar with balloon_page_insert(),
> >> but my gut feeling is that those are pages used by the driver and are
> >> also not mapped into userspace.
> >
> > On XEN, there is xen_alloc_ballooned_pages(), which ends up mapping
> > balloon-inflated pages into user space (for something like MMIO IIRC).
> > But the XEN balloon does not use the balloon compaction framework, so
> > __SetPageMovable() does not apply.
> >
> > The other balloon_page_insert() users (VMware balloon, CMM,
> > virtio-balloon) shouldn't be doing something like that.
>
> Ah, and I remember they even can't, because in balloon_page_insert() we
> also do a __SetPageOffline(). And such typed pages cannot be mapped into
> user space (because the type overlays the mapcount).

Thanks David, good to know! I will remove the condition as Ying
suggested in the next version then!

>
> --
> Cheers,
>
> David / dhildenb
>


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2023-06-20 17:10 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-18  6:58 [RFC PATCH 5/5] Revert "mm/migrate: __unmap_and_move() push good newpage to LRU" Yosry Ahmed
2023-06-19  1:57 ` Huang, Ying
2023-06-19  3:59   ` Yosry Ahmed
2023-06-19  4:27     ` Huang, Ying
2023-06-19  4:34       ` Yosry Ahmed
2023-06-19  7:56     ` David Hildenbrand
2023-06-19  7:58       ` David Hildenbrand
2023-06-20 17:09         ` Yosry Ahmed

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox