diff mbox series

[1/6] mm: migrate: do not migrate HugeTLB page whose refcount is one

Message ID 20210104065843.5658-1-songmuchun@bytedance.com (mailing list archive)
State New, archived
Headers show
Series [1/6] mm: migrate: do not migrate HugeTLB page whose refcount is one | expand

Commit Message

Muchun Song Jan. 4, 2021, 6:58 a.m. UTC
If the refcount is one when it is migrated, it means that the page
was freed from under us. So we are done and do not need to migrate.

Signed-off-by: Muchun Song <songmuchun@bytedance.com>
---
 mm/migrate.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Mike Kravetz Jan. 4, 2021, 10:17 p.m. UTC | #1
On 1/3/21 10:58 PM, Muchun Song wrote:
> If the refcount is one when it is migrated, it means that the page
> was freed from under us. So we are done and do not need to migrate.
> 
> Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> ---
>  mm/migrate.c | 6 ++++++
>  1 file changed, 6 insertions(+)

Thanks!

Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
David Hildenbrand Jan. 5, 2021, 4:58 p.m. UTC | #2
On 04.01.21 07:58, Muchun Song wrote:
> If the refcount is one when it is migrated, it means that the page
> was freed from under us. So we are done and do not need to migrate.
> 
> Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> ---
>  mm/migrate.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 4385f2fb5d18..a6631c4eb6a6 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1279,6 +1279,12 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
>  		return -ENOSYS;
>  	}
>  
> +	if (page_count(hpage) == 1) {
> +		/* page was freed from under us. So we are done. */
> +		putback_active_hugepage(hpage);
> +		return MIGRATEPAGE_SUCCESS;
> +	}
> +
>  	new_hpage = get_new_page(hpage, private);
>  	if (!new_hpage)
>  		return -ENOMEM;
> 

This series seems to fix quite some important cases (thanks). Do we want
to cc stable some/all?
Yang Shi Jan. 5, 2021, 6:04 p.m. UTC | #3
On Tue, Jan 5, 2021 at 8:58 AM David Hildenbrand <david@redhat.com> wrote:
>
> On 04.01.21 07:58, Muchun Song wrote:
> > If the refcount is one when it is migrated, it means that the page
> > was freed from under us. So we are done and do not need to migrate.
> >
> > Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> > ---
> >  mm/migrate.c | 6 ++++++
> >  1 file changed, 6 insertions(+)
> >
> > diff --git a/mm/migrate.c b/mm/migrate.c
> > index 4385f2fb5d18..a6631c4eb6a6 100644
> > --- a/mm/migrate.c
> > +++ b/mm/migrate.c
> > @@ -1279,6 +1279,12 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
> >               return -ENOSYS;
> >       }
> >
> > +     if (page_count(hpage) == 1) {
> > +             /* page was freed from under us. So we are done. */
> > +             putback_active_hugepage(hpage);
> > +             return MIGRATEPAGE_SUCCESS;
> > +     }
> > +
> >       new_hpage = get_new_page(hpage, private);
> >       if (!new_hpage)
> >               return -ENOMEM;
> >
>
> This series seems to fix quite some important cases (thanks). Do we want
> to cc stable some/all?

For this particular one, I don't think so IMHO. It is an optimization
rather than a bug fix.

>
> --
> Thanks,
>
> David / dhildenb
>
>
Yang Shi Jan. 5, 2021, 6:04 p.m. UTC | #4
On Sun, Jan 3, 2021 at 11:01 PM Muchun Song <songmuchun@bytedance.com> wrote:
>
> If the refcount is one when it is migrated, it means that the page
> was freed from under us. So we are done and do not need to migrate.
>
> Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> ---
>  mm/migrate.c | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 4385f2fb5d18..a6631c4eb6a6 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1279,6 +1279,12 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
>                 return -ENOSYS;
>         }
>
> +       if (page_count(hpage) == 1) {
> +               /* page was freed from under us. So we are done. */
> +               putback_active_hugepage(hpage);
> +               return MIGRATEPAGE_SUCCESS;
> +       }
> +

Acked-by: Yang Shi <shy828301@gmail.com>

>         new_hpage = get_new_page(hpage, private);
>         if (!new_hpage)
>                 return -ENOMEM;
> --
> 2.11.0
>
>
David Hildenbrand Jan. 5, 2021, 6:05 p.m. UTC | #5
On 05.01.21 19:04, Yang Shi wrote:
> On Tue, Jan 5, 2021 at 8:58 AM David Hildenbrand <david@redhat.com> wrote:
>>
>> On 04.01.21 07:58, Muchun Song wrote:
>>> If the refcount is one when it is migrated, it means that the page
>>> was freed from under us. So we are done and do not need to migrate.
>>>
>>> Signed-off-by: Muchun Song <songmuchun@bytedance.com>
>>> ---
>>>  mm/migrate.c | 6 ++++++
>>>  1 file changed, 6 insertions(+)
>>>
>>> diff --git a/mm/migrate.c b/mm/migrate.c
>>> index 4385f2fb5d18..a6631c4eb6a6 100644
>>> --- a/mm/migrate.c
>>> +++ b/mm/migrate.c
>>> @@ -1279,6 +1279,12 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
>>>               return -ENOSYS;
>>>       }
>>>
>>> +     if (page_count(hpage) == 1) {
>>> +             /* page was freed from under us. So we are done. */
>>> +             putback_active_hugepage(hpage);
>>> +             return MIGRATEPAGE_SUCCESS;
>>> +     }
>>> +
>>>       new_hpage = get_new_page(hpage, private);
>>>       if (!new_hpage)
>>>               return -ENOMEM;
>>>
>>
>> This series seems to fix quite some important cases (thanks). Do we want
>> to cc stable some/all?
> 
> For this particular one, I don't think so IMHO. It is an optimization
> rather than a bug fix.

I'm rather referring to the actual fixes (I received no cover letter so
I picked the first patch in the series)
Michal Hocko Jan. 6, 2021, 4:11 p.m. UTC | #6
On Mon 04-01-21 14:58:38, Muchun Song wrote:
> If the refcount is one when it is migrated, it means that the page
> was freed from under us. So we are done and do not need to migrate.

Is this common enough that it would warrant the explicit check for each
migration?

> Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> ---
>  mm/migrate.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 4385f2fb5d18..a6631c4eb6a6 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1279,6 +1279,12 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
>  		return -ENOSYS;
>  	}
>  
> +	if (page_count(hpage) == 1) {
> +		/* page was freed from under us. So we are done. */
> +		putback_active_hugepage(hpage);
> +		return MIGRATEPAGE_SUCCESS;
> +	}
> +
>  	new_hpage = get_new_page(hpage, private);
>  	if (!new_hpage)
>  		return -ENOMEM;
> -- 
> 2.11.0
Michal Hocko Jan. 6, 2021, 4:12 p.m. UTC | #7
On Wed 06-01-21 17:11:39, Michal Hocko wrote:
> On Mon 04-01-21 14:58:38, Muchun Song wrote:
> > If the refcount is one when it is migrated, it means that the page
> > was freed from under us. So we are done and do not need to migrate.
> 
> Is this common enough that it would warrant the explicit check for each
> migration?

Ups, just noticed that you have posted a newer version. I will follow up
there.
diff mbox series

Patch

diff --git a/mm/migrate.c b/mm/migrate.c
index 4385f2fb5d18..a6631c4eb6a6 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1279,6 +1279,12 @@  static int unmap_and_move_huge_page(new_page_t get_new_page,
 		return -ENOSYS;
 	}
 
+	if (page_count(hpage) == 1) {
+		/* page was freed from under us. So we are done. */
+		putback_active_hugepage(hpage);
+		return MIGRATEPAGE_SUCCESS;
+	}
+
 	new_hpage = get_new_page(hpage, private);
 	if (!new_hpage)
 		return -ENOMEM;