From: Alistair Popple <apopple@nvidia.com>
To: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: "Huang, Ying" <ying.huang@intel.com>,
akpm@linux-foundation.org, david@redhat.com, ziy@nvidia.com,
shy828301@gmail.com, jingshan@linux.alibaba.com,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/2] mm: gup: Re-pin pages in case of trying several times to migrate
Date: Thu, 20 Oct 2022 22:43:39 +1100 [thread overview]
Message-ID: <87o7u6soip.fsf@nvidia.com> (raw)
In-Reply-To: <b2b44837-045a-a5ac-319e-216f6b2491bb@linux.alibaba.com>
Baolin Wang <baolin.wang@linux.alibaba.com> writes:
> On 10/20/2022 4:15 PM, Huang, Ying wrote:
>> Baolin Wang <baolin.wang@linux.alibaba.com> writes:
>>
>>> The migrate_pages() will return the number of {normal page, THP, hugetlb}
>>> that were not migrated, or an error code. That means it can still return
>>> the number of failure count, though the pages have been migrated
>>> successfully with several times re-try.
>> If my understanding were correct, if pages are migrated successfully
>> after several times re-tries, the return value will be 0. There's one
>> possibility for migrate_pages() to return non-zero but all pages are
>> migrated. That is, when THP is split and all subpages are migrated
>> successfully.
>
> Yeah, that's the case I tested. Thanks for pointing out. I'll re-write my
> incorrect commit message next time.
This is confusing to me. So users of move_page() will see an
unsuccessful migration even when all subpages were migrated? Seems like
we should fix the return code of migrate_pages() for this case where all
subpages were successfully migrated.
>>
>>> So we should not use the return value of migrate_pages() to determin
>>> if there are pages are failed to migrate. Instead we can validate the
>>> 'movable_page_list' to see if there are pages remained in the list,
>>> which are failed to migrate. That can mitigate the failure of longterm
>>> pinning.
>> Another choice is to use a special return value for split THP + success
>> migration. But I'm fine to use list_empty(return_pages).
>
> OK. Using list_empty(return_pages) looks more simple.
>
>>
>>> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
>>> ---
>>> mm/gup.c | 7 ++++---
>>> 1 file changed, 4 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/mm/gup.c b/mm/gup.c
>>> index 5182aba..bd8cfcd 100644
>>> --- a/mm/gup.c
>>> +++ b/mm/gup.c
>>> @@ -1914,9 +1914,10 @@ static int migrate_longterm_unpinnable_pages(
>>> .gfp_mask = GFP_USER | __GFP_NOWARN,
>>> };
>>> - if (migrate_pages(movable_page_list, alloc_migration_target,
>>> - NULL, (unsigned long)&mtc, MIGRATE_SYNC,
>>> - MR_LONGTERM_PIN, NULL)) {
>>> + ret = migrate_pages(movable_page_list, alloc_migration_target,
>>> + NULL, (unsigned long)&mtc, MIGRATE_SYNC,
>>> + MR_LONGTERM_PIN, NULL);
>>> + if (ret < 0 || !list_empty(movable_page_list)) {
>> It seems that !list_empty() is sufficient here.
>
> OK. Drop the 'ret < 0'
>
>>> ret = -ENOMEM;
>> Why change the error code? I don't think it's a good idea to do that.
>
> The GUP need a -errno for failure or partial success when migration, and we can
> not return the number of pages failed to migrate. So returning -ENOMEM seems
> suitable for both cases?
Seem reasonable to me. migrate_pages() might return -EAGAIN which would
cause everything to be re-pinned and tried again which is not what you
want here. See the comment at the start of
check_and_migrate_movable_pages().
next prev parent reply other threads:[~2022-10-20 11:50 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-20 7:49 [PATCH 1/2] mm: gup: Re-pin pages in case of trying several times to migrate Baolin Wang
2022-10-20 7:49 ` [PATCH 2/2] mm: migrate: Try again if THP split is failed due to page refcnt Baolin Wang
2022-10-20 8:24 ` Huang, Ying
2022-10-20 9:33 ` Baolin Wang
2022-10-20 19:21 ` Yang Shi
2022-10-21 6:15 ` Baolin Wang
2022-10-20 8:15 ` [PATCH 1/2] mm: gup: Re-pin pages in case of trying several times to migrate Huang, Ying
2022-10-20 9:24 ` Baolin Wang
2022-10-20 11:43 ` Alistair Popple [this message]
2022-10-21 0:28 ` Huang, Ying
2022-10-21 2:51 ` Baolin Wang
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=87o7u6soip.fsf@nvidia.com \
--to=apopple@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=david@redhat.com \
--cc=jingshan@linux.alibaba.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=shy828301@gmail.com \
--cc=ying.huang@intel.com \
--cc=ziy@nvidia.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.