From: Baolin Wang <baolin.wang@linux.alibaba.com>
To: Mike Kravetz <mike.kravetz@oracle.com>, akpm@linux-foundation.org
Cc: ziy@nvidia.com, shy828301@gmail.com, linux-mm@kvack.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/3] mm: migrate: Fix the return value of migrate_pages()
Date: Wed, 24 Nov 2021 18:30:57 +0800 [thread overview]
Message-ID: <76c241cc-5de7-d083-312c-373645ee8a77@linux.alibaba.com> (raw)
In-Reply-To: <13b2c5d1-ef3b-3e29-32fe-cb4294bb1531@oracle.com>
On 2021/11/24 2:46, Mike Kravetz wrote:
> On 11/7/21 01:57, Baolin Wang wrote:
>> As Zi Yan pointed out, the syscall move_pages() can return a non-migrated
>> number larger than the number of pages the users tried to migrate, when a
>> THP page is failed to migrate. This is confusing for users.
>>
>> Since other migration scenarios do not care about the actual non-migrated
>> number of pages except the memory compaction migration which will fix in
>> following patch. Thus we can change the return value to return the number
>> of {normal page, THP, hugetlb} instead to avoid this issue, and the number
>> of THP splits will be considered as the number of non-migrated THP, no matter
>> how many subpages of the THP are migrated successfully. Meanwhile we should
>> still keep the migration counters using the number of normal pages.
>>
>> Co-developed-by: Zi Yan <ziy@nvidia.com>
>> Signed-off-by: Zi Yan <ziy@nvidia.com>
>> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
>> ---
>> mm/migrate.c | 63 +++++++++++++++++++++++++++++++++++++++++++++---------------
>> 1 file changed, 47 insertions(+), 16 deletions(-)
>>
>> diff --git a/mm/migrate.c b/mm/migrate.c
>> index a11e948..9aafdab 100644
>> --- a/mm/migrate.c
>> +++ b/mm/migrate.c
>> @@ -1428,7 +1428,7 @@ static inline int try_split_thp(struct page *page, struct page **page2,
>> * @mode: The migration mode that specifies the constraints for
>> * page migration, if any.
>> * @reason: The reason for page migration.
>> - * @ret_succeeded: Set to the number of pages migrated successfully if
>> + * @ret_succeeded: Set to the number of normal pages migrated successfully if
>> * the caller passes a non-NULL pointer.
>> *
>> * The function returns after 10 attempts or if no pages are movable any more
>> @@ -1436,7 +1436,9 @@ static inline int try_split_thp(struct page *page, struct page **page2,
>> * It is caller's responsibility to call putback_movable_pages() to return pages
>> * to the LRU or free list only if ret != 0.
>> *
>> - * Returns the number of pages that were not migrated, or an error code.
>> + * Returns the number of {normal page, THP} that were not migrated, or an error code.
>> + * The number of THP splits will be considered as the number of non-migrated THP,
>> + * no matter how many subpages of the THP are migrated successfully.
>> */
>> int migrate_pages(struct list_head *from, new_page_t get_new_page,
>> free_page_t put_new_page, unsigned long private,
>> @@ -1445,6 +1447,7 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page,
>> int retry = 1;
>> int thp_retry = 1;
>> int nr_failed = 0;
>> + int nr_failed_pages = 0;
>> int nr_succeeded = 0;
>> int nr_thp_succeeded = 0;
>> int nr_thp_failed = 0;
>> @@ -1456,13 +1459,16 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page,
>> int swapwrite = current->flags & PF_SWAPWRITE;
>> int rc, nr_subpages;
>> LIST_HEAD(ret_pages);
>> + LIST_HEAD(thp_split_pages);
>> bool nosplit = (reason == MR_NUMA_MISPLACED);
>> + bool no_subpage_counting = false;
>>
>> trace_mm_migrate_pages_start(mode, reason);
>>
>> if (!swapwrite)
>> current->flags |= PF_SWAPWRITE;
>>
>> +thp_subpage_migration:
>> for (pass = 0; pass < 10 && (retry || thp_retry); pass++) {
>> retry = 0;
>> thp_retry = 0;
>> @@ -1511,18 +1517,20 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page,
>> case -ENOSYS:
>> /* THP migration is unsupported */
>> if (is_thp) {
>> - if (!try_split_thp(page, &page2, from)) {
>> + nr_thp_failed++;
>> + if (!try_split_thp(page, &page2, &thp_split_pages)) {
>
> Does thp_split_pages need to be initialized before this call?
The declaration "LIST_HEAD(thp_split_pages);" already did list
initialization, right?
next prev parent reply other threads:[~2021-11-24 10:30 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-07 8:57 [PATCH 0/3] Improve the migration stats Baolin Wang
2021-11-07 8:57 ` [PATCH 1/3] mm: migrate: Fix the return value of migrate_pages() Baolin Wang
2021-11-09 18:10 ` Zi Yan
2021-11-23 18:46 ` Mike Kravetz
2021-11-24 10:30 ` Baolin Wang [this message]
2021-11-24 18:46 ` Mike Kravetz
2021-11-07 8:57 ` [PATCH 2/3] mm: migrate: Correct the hugetlb migration stats Baolin Wang
2021-11-16 4:21 ` Andrew Morton
2021-11-16 6:03 ` Baolin Wang
2021-11-23 19:25 ` Mike Kravetz
2021-11-24 10:47 ` Baolin Wang
2021-11-24 19:05 ` Mike Kravetz
2021-11-25 5:50 ` Baolin Wang
2021-11-07 8:57 ` [PATCH 3/3] mm: compaction: Fix the migration stats in trace_mm_compaction_migratepages() 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=76c241cc-5de7-d083-312c-373645ee8a77@linux.alibaba.com \
--to=baolin.wang@linux.alibaba.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mike.kravetz@oracle.com \
--cc=shy828301@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox