From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-20.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, HTML_MESSAGE,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D7EDEC433B4 for ; Thu, 1 Apr 2021 22:35:43 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 47AE8610CC for ; Thu, 1 Apr 2021 22:35:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 47AE8610CC Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id B28906B0128; Thu, 1 Apr 2021 18:35:42 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AB3436B0129; Thu, 1 Apr 2021 18:35:42 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 905AB6B012A; Thu, 1 Apr 2021 18:35:42 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0123.hostedemail.com [216.40.44.123]) by kanga.kvack.org (Postfix) with ESMTP id 689AB6B0128 for ; Thu, 1 Apr 2021 18:35:42 -0400 (EDT) Received: from smtpin19.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 20AA19880 for ; Thu, 1 Apr 2021 22:35:42 +0000 (UTC) X-FDA: 77985256524.19.DC19BB3 Received: from mail-io1-f53.google.com (mail-io1-f53.google.com [209.85.166.53]) by imf05.hostedemail.com (Postfix) with ESMTP id 2C3D7E000103 for ; Thu, 1 Apr 2021 22:35:41 +0000 (UTC) Received: by mail-io1-f53.google.com with SMTP id k8so1298855iop.12 for ; Thu, 01 Apr 2021 15:35:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=y6y1uwx548gfrrqAle1FYnOdKsgLdZDTzTz2iWZbX5Y=; b=EiYbidBzUC3mV2J9TJkTFy1Ims9N++q6m06BAfT+GjaVqDNx2jKWjNQlvl8TQlgXh8 X+Ik0dffxBk0sqPEQPc0F3lYYJOeE4Z+kqGrTUQcp6r3dDI+SI0YlAlAfJpe+KnJqkcI 77CZWMtxVv9uOlEhuq/tdSXEnXnsbop5Eeci2v7O48JOirQZryQhKSPuomniiP1YdfjI nB1bAD9mc+o88bTLkkyZnFzIJWnsu8mfbnPvOxzVhyrPMH+hF1j98oG3aYCH/qEhJP/E YDYX4mLOEekbnFhWFlhidZEVQHCjGtt+J8fQHAt3RjX7GwtOQEkoQCezUDlBQCh85eNz Upxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=y6y1uwx548gfrrqAle1FYnOdKsgLdZDTzTz2iWZbX5Y=; b=EXx0UzLQ0MZQk1kKLrPD7DSGB5Ko74GGGrT2EPTsTp+3F5JCNIF5B2G5ImfNSI02mC qrwKuYE1KcCP4EtVHjo2CviDUmz82d6kwS6KL22Xwy1fJger+PTfiDBqHbsJqgRgF05r hQMuM/3R+i3X+wTrmcxX3WXywxzUbfsXREwwf/xbHl76azYssPyNxYHG/zBCGXWxuNjW A0y1lGA6i0Pfp7lnw2Kg1eAnHWir787v6rvp3P1Jm1tOvhzoCqcyaHsLG2X34NrdBY3F b4waLNrnf0DM90YY8d/kSR/5NzR/Onl58jhbK2PRhpaz8b/mWgQ9dmHjW7rqXTiQPT1L lV0A== X-Gm-Message-State: AOAM532UUzHp6OYXDavteUvD8UzyI3d42Ir67fyUUp6pkEmiBsoKQXsZ I3ila6Iwum48jPA++pzp3Yo0XUGUsoYC8H59y6QNkw== X-Google-Smtp-Source: ABdhPJwgEsCZ28awxjGuWeAS/usUSy9YHLjSUpk+D6yc/zAA0kNMSal6UexC3w1qD300E2Ss4DuLi3RQ1JU3DyAihEY= X-Received: by 2002:a5d:88c1:: with SMTP id i1mr8287124iol.115.1617316540765; Thu, 01 Apr 2021 15:35:40 -0700 (PDT) MIME-Version: 1.0 References: <20210401183216.443C4443@viggo.jf.intel.com> <20210401183223.80F1E291@viggo.jf.intel.com> In-Reply-To: <20210401183223.80F1E291@viggo.jf.intel.com> From: Wei Xu Date: Thu, 1 Apr 2021 15:35:28 -0700 Message-ID: Subject: Re: [PATCH 04/10] mm/migrate: make migrate_pages() return nr_succeeded To: Dave Hansen Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, yang.shi@linux.alibaba.com, shy828301@gmail.com, ying.huang@intel.com, Dan Williams , david@redhat.com, osalvador@suse.de Content-Type: multipart/alternative; boundary="000000000000e7205d05bef0d96d" X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 2C3D7E000103 X-Stat-Signature: faeq6j7th3kpsbjni7eribnzf9364mep Received-SPF: none (google.com>: No applicable sender policy available) receiver=imf05; identity=mailfrom; envelope-from=""; helo=mail-io1-f53.google.com; client-ip=209.85.166.53 X-HE-DKIM-Result: pass/pass X-HE-Tag: 1617316541-726774 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: --000000000000e7205d05bef0d96d Content-Type: text/plain; charset="UTF-8" A small suggestion: Given that migrate_pages() requires that *nr_succeeded should be initialized to 0 when it is called due to its use of *nr_succeeded in count_vm_events() and trace_mm_migrate_pages(), it would be less error-prone if migrate_pages() initializes *nr_succeeded itself. On Thu, Apr 1, 2021 at 11:35 AM Dave Hansen wrote: > > From: Yang Shi > > The migrate_pages() returns the number of pages that were not migrated, > or an error code. When returning an error code, there is no way to know > how many pages were migrated or not migrated. > > In the following patch, migrate_pages() is used to demote pages to PMEM > node, we need account how many pages are reclaimed (demoted) since page > reclaim behavior depends on this. Add *nr_succeeded parameter to make > migrate_pages() return how many pages are demoted successfully for all > cases. > > Signed-off-by: Yang Shi > Signed-off-by: Dave Hansen > Reviewed-by: Yang Shi > Cc: Wei Xu > Cc: Huang Ying > Cc: Dan Williams > Cc: David Hildenbrand > Cc: osalvador > > -- > > Note: Yang Shi originally wrote the patch, thus the SoB. There was > also a Reviewed-by provided since there were some modifications made > to this after the original work. > > Changes since 20210302: > * Fix definition of CONFIG_MIGRATION=n stub migrate_pages(). Its > parameters were wrong, but oddly enough did not generate any > compile errors. > > Changes since 20200122: > * Fix migrate_pages() to manipulate nr_succeeded *value* > rather than the pointer. > --- > > b/include/linux/migrate.h | 5 +++-- > b/mm/compaction.c | 3 ++- > b/mm/gup.c | 3 ++- > b/mm/memory-failure.c | 4 +++- > b/mm/memory_hotplug.c | 4 +++- > b/mm/mempolicy.c | 8 ++++++-- > b/mm/migrate.c | 19 +++++++++++-------- > b/mm/page_alloc.c | 9 ++++++--- > 8 files changed, 36 insertions(+), 19 deletions(-) > > diff -puN include/linux/migrate.h~migrate_pages-add-success-return > include/linux/migrate.h > --- a/include/linux/migrate.h~migrate_pages-add-success-return 2021-03-31 > 15:17:14.144000255 -0700 > +++ b/include/linux/migrate.h 2021-03-31 15:17:14.182000255 -0700 > @@ -40,7 +40,8 @@ extern int migrate_page(struct address_s > struct page *newpage, struct page *page, > enum migrate_mode mode); > extern int migrate_pages(struct list_head *l, new_page_t new, free_page_t > free, > - unsigned long private, enum migrate_mode mode, int reason); > + unsigned long private, enum migrate_mode mode, int reason, > + unsigned int *nr_succeeded); > extern struct page *alloc_migration_target(struct page *page, unsigned > long private); > extern int isolate_movable_page(struct page *page, isolate_mode_t mode); > extern void putback_movable_page(struct page *page); > @@ -58,7 +59,7 @@ extern int migrate_page_move_mapping(str > static inline void putback_movable_pages(struct list_head *l) {} > static inline int migrate_pages(struct list_head *l, new_page_t new, > free_page_t free, unsigned long private, enum migrate_mode > mode, > - int reason) > + int reason, unsigned int *nr_succeeded) > { return -ENOSYS; } > static inline struct page *alloc_migration_target(struct page *page, > unsigned long private) > diff -puN mm/compaction.c~migrate_pages-add-success-return mm/compaction.c > --- a/mm/compaction.c~migrate_pages-add-success-return 2021-03-31 > 15:17:14.146000255 -0700 > +++ b/mm/compaction.c 2021-03-31 15:17:14.186000255 -0700 > @@ -2247,6 +2247,7 @@ compact_zone(struct compact_control *cc, > unsigned long last_migrated_pfn; > const bool sync = cc->mode != MIGRATE_ASYNC; > bool update_cached; > + unsigned int nr_succeeded = 0; > > /* > * These counters track activities during zone compaction. > Initialize > @@ -2364,7 +2365,7 @@ compact_zone(struct compact_control *cc, > > err = migrate_pages(&cc->migratepages, compaction_alloc, > compaction_free, (unsigned long)cc, > cc->mode, > - MR_COMPACTION); > + MR_COMPACTION, &nr_succeeded); > > trace_mm_compaction_migratepages(cc->nr_migratepages, err, > &cc->migratepages); > diff -puN mm/gup.c~migrate_pages-add-success-return mm/gup.c > --- a/mm/gup.c~migrate_pages-add-success-return 2021-03-31 > 15:17:14.150000255 -0700 > +++ b/mm/gup.c 2021-03-31 15:17:14.190000255 -0700 > @@ -1550,6 +1550,7 @@ static long check_and_migrate_cma_pages( > unsigned long i; > unsigned long step; > bool drain_allow = true; > + unsigned int nr_succeeded = 0; > bool migrate_allow = true; > LIST_HEAD(cma_page_list); > long ret = nr_pages; > @@ -1606,7 +1607,7 @@ check_again: > put_page(pages[i]); > > if (migrate_pages(&cma_page_list, alloc_migration_target, > NULL, > - (unsigned long)&mtc, MIGRATE_SYNC, > MR_CONTIG_RANGE)) { > + (unsigned long)&mtc, MIGRATE_SYNC, > MR_CONTIG_RANGE, &nr_succeeded)) { > /* > * some of the pages failed migration. Do > get_user_pages > * without migration. > diff -puN mm/memory-failure.c~migrate_pages-add-success-return > mm/memory-failure.c > --- a/mm/memory-failure.c~migrate_pages-add-success-return 2021-03-31 > 15:17:14.155000255 -0700 > +++ b/mm/memory-failure.c 2021-03-31 15:17:14.194000255 -0700 > @@ -1809,6 +1809,7 @@ static int __soft_offline_page(struct pa > unsigned long pfn = page_to_pfn(page); > struct page *hpage = compound_head(page); > char const *msg_page[] = {"page", "hugepage"}; > + unsigned int nr_succeeded = 0; > bool huge = PageHuge(page); > LIST_HEAD(pagelist); > struct migration_target_control mtc = { > @@ -1852,7 +1853,8 @@ static int __soft_offline_page(struct pa > > if (isolate_page(hpage, &pagelist)) { > ret = migrate_pages(&pagelist, alloc_migration_target, > NULL, > - (unsigned long)&mtc, MIGRATE_SYNC, > MR_MEMORY_FAILURE); > + (unsigned long)&mtc, MIGRATE_SYNC, > MR_MEMORY_FAILURE, > + &nr_succeeded); > if (!ret) { > bool release = !huge; > > diff -puN mm/memory_hotplug.c~migrate_pages-add-success-return > mm/memory_hotplug.c > --- a/mm/memory_hotplug.c~migrate_pages-add-success-return 2021-03-31 > 15:17:14.160000255 -0700 > +++ b/mm/memory_hotplug.c 2021-03-31 15:17:14.197000255 -0700 > @@ -1392,6 +1392,7 @@ do_migrate_range(unsigned long start_pfn > unsigned long pfn; > struct page *page, *head; > int ret = 0; > + unsigned int nr_succeeded = 0; > LIST_HEAD(source); > > for (pfn = start_pfn; pfn < end_pfn; pfn++) { > @@ -1466,7 +1467,8 @@ do_migrate_range(unsigned long start_pfn > if (nodes_empty(nmask)) > node_set(mtc.nid, nmask); > ret = migrate_pages(&source, alloc_migration_target, NULL, > - (unsigned long)&mtc, MIGRATE_SYNC, > MR_MEMORY_HOTPLUG); > + (unsigned long)&mtc, MIGRATE_SYNC, > MR_MEMORY_HOTPLUG, > + &nr_succeeded); > if (ret) { > list_for_each_entry(page, &source, lru) { > pr_warn("migrating pfn %lx failed ret:%d ", > diff -puN mm/mempolicy.c~migrate_pages-add-success-return mm/mempolicy.c > --- a/mm/mempolicy.c~migrate_pages-add-success-return 2021-03-31 > 15:17:14.163000255 -0700 > +++ b/mm/mempolicy.c 2021-03-31 15:17:14.203000255 -0700 > @@ -1081,6 +1081,7 @@ static int migrate_page_add(struct page > static int migrate_to_node(struct mm_struct *mm, int source, int dest, > int flags) > { > + unsigned int nr_succeeded = 0; > nodemask_t nmask; > LIST_HEAD(pagelist); > int err = 0; > @@ -1103,7 +1104,8 @@ static int migrate_to_node(struct mm_str > > if (!list_empty(&pagelist)) { > err = migrate_pages(&pagelist, alloc_migration_target, > NULL, > - (unsigned long)&mtc, MIGRATE_SYNC, > MR_SYSCALL); > + (unsigned long)&mtc, MIGRATE_SYNC, > MR_SYSCALL, > + &nr_succeeded); > if (err) > putback_movable_pages(&pagelist); > } > @@ -1278,6 +1280,7 @@ static long do_mbind(unsigned long start > nodemask_t *nmask, unsigned long flags) > { > struct mm_struct *mm = current->mm; > + unsigned int nr_succeeded = 0; > struct mempolicy *new; > unsigned long end; > int err; > @@ -1355,7 +1358,8 @@ static long do_mbind(unsigned long start > if (!list_empty(&pagelist)) { > WARN_ON_ONCE(flags & MPOL_MF_LAZY); > nr_failed = migrate_pages(&pagelist, new_page, > NULL, > - start, MIGRATE_SYNC, MR_MEMPOLICY_MBIND); > + start, MIGRATE_SYNC, MR_MEMPOLICY_MBIND, > + &nr_succeeded); > if (nr_failed) > putback_movable_pages(&pagelist); > } > diff -puN mm/migrate.c~migrate_pages-add-success-return mm/migrate.c > --- a/mm/migrate.c~migrate_pages-add-success-return 2021-03-31 > 15:17:14.168000255 -0700 > +++ b/mm/migrate.c 2021-03-31 15:17:14.207000255 -0700 > @@ -1493,6 +1493,7 @@ static inline int try_split_thp(struct p > * @mode: The migration mode that specifies the constraints > for > * page migration, if any. > * @reason: The reason for page migration. > + * @nr_succeeded: The number of pages migrated successfully. > * > * The function returns after 10 attempts or if no pages are movable any > more > * because the list has become empty or no retryable pages exist any more. > @@ -1503,12 +1504,11 @@ static inline int try_split_thp(struct p > */ > int migrate_pages(struct list_head *from, new_page_t get_new_page, > free_page_t put_new_page, unsigned long private, > - enum migrate_mode mode, int reason) > + enum migrate_mode mode, int reason, unsigned int > *nr_succeeded) > { > int retry = 1; > int thp_retry = 1; > int nr_failed = 0; > - int nr_succeeded = 0; > int nr_thp_succeeded = 0; > int nr_thp_failed = 0; > int nr_thp_split = 0; > @@ -1611,10 +1611,10 @@ retry: > case MIGRATEPAGE_SUCCESS: > if (is_thp) { > nr_thp_succeeded++; > - nr_succeeded += nr_subpages; > + *nr_succeeded += nr_subpages; > break; > } > - nr_succeeded++; > + (*nr_succeeded)++; > break; > default: > /* > @@ -1643,12 +1643,12 @@ out: > */ > list_splice(&ret_pages, from); > > - count_vm_events(PGMIGRATE_SUCCESS, nr_succeeded); > + count_vm_events(PGMIGRATE_SUCCESS, *nr_succeeded); > count_vm_events(PGMIGRATE_FAIL, nr_failed); > count_vm_events(THP_MIGRATION_SUCCESS, nr_thp_succeeded); > count_vm_events(THP_MIGRATION_FAIL, nr_thp_failed); > count_vm_events(THP_MIGRATION_SPLIT, nr_thp_split); > - trace_mm_migrate_pages(nr_succeeded, nr_failed, nr_thp_succeeded, > + trace_mm_migrate_pages(*nr_succeeded, nr_failed, nr_thp_succeeded, > nr_thp_failed, nr_thp_split, mode, reason); > > if (!swapwrite) > @@ -1716,6 +1716,7 @@ static int store_status(int __user *stat > static int do_move_pages_to_node(struct mm_struct *mm, > struct list_head *pagelist, int node) > { > + unsigned int nr_succeeded = 0; > int err; > struct migration_target_control mtc = { > .nid = node, > @@ -1723,7 +1724,8 @@ static int do_move_pages_to_node(struct > }; > > err = migrate_pages(pagelist, alloc_migration_target, NULL, > - (unsigned long)&mtc, MIGRATE_SYNC, MR_SYSCALL); > + (unsigned long)&mtc, MIGRATE_SYNC, MR_SYSCALL, > + &nr_succeeded); > if (err) > putback_movable_pages(pagelist); > return err; > @@ -2207,6 +2209,7 @@ int migrate_misplaced_page(struct page * > pg_data_t *pgdat = NODE_DATA(node); > int isolated; > int nr_remaining; > + unsigned int nr_succeeded = 0; > LIST_HEAD(migratepages); > > /* > @@ -2230,7 +2233,7 @@ int migrate_misplaced_page(struct page * > list_add(&page->lru, &migratepages); > nr_remaining = migrate_pages(&migratepages, > alloc_misplaced_dst_page, > NULL, node, MIGRATE_ASYNC, > - MR_NUMA_MISPLACED); > + MR_NUMA_MISPLACED, &nr_succeeded); > if (nr_remaining) { > if (!list_empty(&migratepages)) { > list_del(&page->lru); > diff -puN mm/page_alloc.c~migrate_pages-add-success-return mm/page_alloc.c > --- a/mm/page_alloc.c~migrate_pages-add-success-return 2021-03-31 > 15:17:14.178000255 -0700 > +++ b/mm/page_alloc.c 2021-03-31 15:17:14.213000255 -0700 > @@ -8452,7 +8452,8 @@ static unsigned long pfn_max_align_up(un > > /* [start, end) must belong to a single zone. */ > static int __alloc_contig_migrate_range(struct compact_control *cc, > - unsigned long start, unsigned long > end) > + unsigned long start, unsigned long > end, > + unsigned int *nr_succeeded) > { > /* This function is based on compact_zone() from compaction.c. */ > unsigned int nr_reclaimed; > @@ -8490,7 +8491,8 @@ static int __alloc_contig_migrate_range( > cc->nr_migratepages -= nr_reclaimed; > > ret = migrate_pages(&cc->migratepages, > alloc_migration_target, > - NULL, (unsigned long)&mtc, cc->mode, > MR_CONTIG_RANGE); > + NULL, (unsigned long)&mtc, cc->mode, > MR_CONTIG_RANGE, > + nr_succeeded); > } > if (ret < 0) { > putback_movable_pages(&cc->migratepages); > @@ -8526,6 +8528,7 @@ int alloc_contig_range(unsigned long sta > unsigned long outer_start, outer_end; > unsigned int order; > int ret = 0; > + unsigned int nr_succeeded = 0; > > struct compact_control cc = { > .nr_migratepages = 0, > @@ -8580,7 +8583,7 @@ int alloc_contig_range(unsigned long sta > * allocated. So, if we fall through be sure to clear ret so that > * -EBUSY is not accidentally used or returned to caller. > */ > - ret = __alloc_contig_migrate_range(&cc, start, end); > + ret = __alloc_contig_migrate_range(&cc, start, end, &nr_succeeded); > if (ret && ret != -EBUSY) > goto done; > ret =0; > _ > --000000000000e7205d05bef0d96d Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
A small suggestion: Given that migrate_pages() requir= es that
*nr_succeeded should be initialized to 0 when it is called due t= o its
use of *nr_succeeded in count_vm_events()=C2=A0and trace_mm_migrat= e_pages(),
it would be less error-prone if migrate_pages() initializes*nr_succeeded itself.

On Thu, Apr 1, 2021 at 11:35 AM = Dave Hansen <dave.hansen@linux.intel.com> wrote:

From: Yang Shi <yang.shi@linux.alibaba.com>

The migrate_pages() returns the number of pages that were not migrated,
or an error code.=C2=A0 When returning an error code, there is no way to kn= ow
how many pages were migrated or not migrated.

In the following patch, migrate_pages() is used to demote pages to PMEM
node, we need account how many pages are reclaimed (demoted) since page
reclaim behavior depends on this.=C2=A0 Add *nr_succeeded parameter to make=
migrate_pages() return how many pages are demoted successfully for all
cases.

Signed-off-by: Yang Shi <yang.shi@linux.alibaba.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Yang Shi <shy828301@gmail.com>
Cc: Wei Xu <weix= ugc@google.com>
Cc: Huang Ying <ying.huang@intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: osalvador <os= alvador@suse.de>

--

Note: Yang Shi originally wrote the patch, thus the SoB.=C2=A0 There was also a Reviewed-by provided since there were some modifications made
to this after the original work.

Changes since 20210302:
=C2=A0* Fix definition of CONFIG_MIGRATION=3Dn stub migrate_pages().=C2=A0 = Its
=C2=A0 =C2=A0parameters were wrong, but oddly enough did not generate any =C2=A0 =C2=A0compile errors.

Changes since 20200122:
=C2=A0* Fix migrate_pages() to manipulate nr_succeeded *value*
=C2=A0 =C2=A0rather than the pointer.
---

=C2=A0b/include/linux/migrate.h |=C2=A0 =C2=A0 5 +++--
=C2=A0b/mm/compaction.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2=A0 =C2=A0 3 += +-
=C2=A0b/mm/gup.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |= =C2=A0 =C2=A0 3 ++-
=C2=A0b/mm/memory-failure.c=C2=A0 =C2=A0 =C2=A0|=C2=A0 =C2=A0 4 +++-
=C2=A0b/mm/memory_hotplug.c=C2=A0 =C2=A0 =C2=A0|=C2=A0 =C2=A0 4 +++-
=C2=A0b/mm/mempolicy.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |=C2=A0 =C2=A0 8 += +++++--
=C2=A0b/mm/migrate.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |=C2=A0 =C2= =A019 +++++++++++--------
=C2=A0b/mm/page_alloc.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2=A0 =C2=A0 9 += +++++---
=C2=A08 files changed, 36 insertions(+), 19 deletions(-)

diff -puN include/linux/migrate.h~migrate_pages-add-success-return include/= linux/migrate.h
--- a/include/linux/migrate.h~migrate_pages-add-success-return=C2=A0 2021-0= 3-31 15:17:14.144000255 -0700
+++ b/include/linux/migrate.h=C2=A0 =C2=A02021-03-31 15:17:14.182000255 -07= 00
@@ -40,7 +40,8 @@ extern int migrate_page(struct address_s
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 struct page *newpage, struct page *page,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 enum migrate_mode mode);
=C2=A0extern int migrate_pages(struct list_head *l, new_page_t new, free_pa= ge_t free,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned long priva= te, enum migrate_mode mode, int reason);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned long priva= te, enum migrate_mode mode, int reason,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int *nr_su= cceeded);
=C2=A0extern struct page *alloc_migration_target(struct page *page, unsigne= d long private);
=C2=A0extern int isolate_movable_page(struct page *page, isolate_mode_t mod= e);
=C2=A0extern void putback_movable_page(struct page *page);
@@ -58,7 +59,7 @@ extern int migrate_page_move_mapping(str
=C2=A0static inline void putback_movable_pages(struct list_head *l) {}
=C2=A0static inline int migrate_pages(struct list_head *l, new_page_t new,<= br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 free_page_t free, u= nsigned long private, enum migrate_mode mode,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int reason)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int reason, unsigne= d int *nr_succeeded)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 { return -ENOSYS; }
=C2=A0static inline struct page *alloc_migration_target(struct page *page,<= br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long priva= te)
diff -puN mm/compaction.c~migrate_pages-add-success-return mm/compaction.c<= br> --- a/mm/compaction.c~migrate_pages-add-success-return=C2=A0 2021-03-31 15:= 17:14.146000255 -0700
+++ b/mm/compaction.c=C2=A0 =C2=A02021-03-31 15:17:14.186000255 -0700
@@ -2247,6 +2247,7 @@ compact_zone(struct compact_control *cc,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long last_migrated_pfn;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 const bool sync =3D cc->mode !=3D MIGRATE_AS= YNC;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 bool update_cached;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int nr_succeeded =3D 0;

=C2=A0 =C2=A0 =C2=A0 =C2=A0 /*
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* These counters track activities during = zone compaction.=C2=A0 Initialize
@@ -2364,7 +2365,7 @@ compact_zone(struct compact_control *cc,

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 err =3D migrate_pag= es(&cc->migratepages, compaction_alloc,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 compaction_free, (unsigned long)cc, = cc->mode,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0MR_COMPACTION);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0MR_COMPACTION, &nr_succeeded);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 trace_mm_compaction= _migratepages(cc->nr_migratepages, err,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &cc->migratepages);=
diff -puN mm/gup.c~migrate_pages-add-success-return mm/gup.c
--- a/mm/gup.c~migrate_pages-add-success-return 2021-03-31 15:17:14.1500002= 55 -0700
+++ b/mm/gup.c=C2=A0 2021-03-31 15:17:14.190000255 -0700
@@ -1550,6 +1550,7 @@ static long check_and_migrate_cma_pages(
=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long i;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long step;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 bool drain_allow =3D true;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int nr_succeeded =3D 0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 bool migrate_allow =3D true;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 LIST_HEAD(cma_page_list);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 long ret =3D nr_pages;
@@ -1606,7 +1607,7 @@ check_again:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 put_page(pages[i]);

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (migrate_pages(&= amp;cma_page_list, alloc_migration_target, NULL,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(unsigned long)&mtc, MIGRATE_SYNC, MR_CONTIG_RANGE)) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(unsigned long)&mtc, MIGRATE_SYNC, MR_CONTIG_RANGE, &nr_s= ucceeded)) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 /*
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0* some of the pages failed migration. Do get_user_pages =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0* without migration.
diff -puN mm/memory-failure.c~migrate_pages-add-success-return mm/memory-fa= ilure.c
--- a/mm/memory-failure.c~migrate_pages-add-success-return=C2=A0 =C2=A0 =C2= =A0 2021-03-31 15:17:14.155000255 -0700
+++ b/mm/memory-failure.c=C2=A0 =C2=A0 =C2=A0 =C2=A02021-03-31 15:17:14.194= 000255 -0700
@@ -1809,6 +1809,7 @@ static int __soft_offline_page(struct pa
=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long pfn =3D page_to_pfn(page);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 struct page *hpage =3D compound_head(page);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 char const *msg_page[] =3D {"page", &= quot;hugepage"};
+=C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int nr_succeeded =3D 0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 bool huge =3D PageHuge(page);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 LIST_HEAD(pagelist);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 struct migration_target_control mtc =3D {
@@ -1852,7 +1853,8 @@ static int __soft_offline_page(struct pa

=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (isolate_page(hpage, &pagelist)) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D migrate_pag= es(&pagelist, alloc_migration_target, NULL,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(unsigned long)&mtc, MIGRATE_SYNC, MR_MEMORY_FAILURE);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(unsigned long)&mtc, MIGRATE_SYNC, MR_MEMORY_FAILURE,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0&nr_succeeded);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!ret) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 bool release =3D !huge;

diff -puN mm/memory_hotplug.c~migrate_pages-add-success-return mm/memory_ho= tplug.c
--- a/mm/memory_hotplug.c~migrate_pages-add-success-return=C2=A0 =C2=A0 =C2= =A0 2021-03-31 15:17:14.160000255 -0700
+++ b/mm/memory_hotplug.c=C2=A0 =C2=A0 =C2=A0 =C2=A02021-03-31 15:17:14.197= 000255 -0700
@@ -1392,6 +1392,7 @@ do_migrate_range(unsigned long start_pfn
=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long pfn;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 struct page *page, *head;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int ret =3D 0;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int nr_succeeded =3D 0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 LIST_HEAD(source);

=C2=A0 =C2=A0 =C2=A0 =C2=A0 for (pfn =3D start_pfn; pfn < end_pfn; pfn++= ) {
@@ -1466,7 +1467,8 @@ do_migrate_range(unsigned long start_pfn
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (nodes_empty(nma= sk))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 node_set(mtc.nid, nmask);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D migrate_pag= es(&source, alloc_migration_target, NULL,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(unsigned long)&mtc, MIGRATE_SYNC, MR_MEMORY_HOTPLUG);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(unsigned long)&mtc, MIGRATE_SYNC, MR_MEMORY_HOTPLUG,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0&nr_succeeded);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (ret) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 list_for_each_entry(page, &source, lru) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pr_warn("migrating pfn %lx fail= ed ret:%d ",
diff -puN mm/mempolicy.c~migrate_pages-add-success-return mm/mempolicy.c --- a/mm/mempolicy.c~migrate_pages-add-success-return=C2=A0 =C2=A02021-03-3= 1 15:17:14.163000255 -0700
+++ b/mm/mempolicy.c=C2=A0 =C2=A0 2021-03-31 15:17:14.203000255 -0700
@@ -1081,6 +1081,7 @@ static int migrate_page_add(struct page
=C2=A0static int migrate_to_node(struct mm_struct *mm, int source, int dest= ,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0int flags)
=C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int nr_succeeded =3D 0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 nodemask_t nmask;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 LIST_HEAD(pagelist);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int err =3D 0;
@@ -1103,7 +1104,8 @@ static int migrate_to_node(struct mm_str

=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!list_empty(&pagelist)) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 err =3D migrate_pag= es(&pagelist, alloc_migration_target, NULL,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(unsigned long)&mtc, MIGRATE_SYNC= , MR_SYSCALL);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(unsigned long)&mtc, MIGRATE_SYNC= , MR_SYSCALL,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&nr_succeeded);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (err)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 putback_movable_pages(&pagelist);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 }
@@ -1278,6 +1280,7 @@ static long do_mbind(unsigned long start
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0nodemask_t *nmask, unsigned long flags)
=C2=A0{
=C2=A0 =C2=A0 =C2=A0 =C2=A0 struct mm_struct *mm =3D current->mm;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int nr_succeeded =3D 0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 struct mempolicy *new;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long end;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int err;
@@ -1355,7 +1358,8 @@ static long do_mbind(unsigned long start
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!list_empty(&am= p;pagelist)) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 WARN_ON_ONCE(flags & MPOL_MF_LAZY);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 nr_failed =3D migrate_pages(&pagelist, new_page, NULL,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0start, MIGRATE_SYNC, MR_MEMPOLICY_MBI= ND);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0start, MIGRATE_SYNC, MR_MEMPOLICY_MBI= ND,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&nr_succeeded);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 if (nr_failed)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 putback_movable_pages(&pagelist)= ;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
diff -puN mm/migrate.c~migrate_pages-add-success-return mm/migrate.c
--- a/mm/migrate.c~migrate_pages-add-success-return=C2=A0 =C2=A0 =C2=A02021= -03-31 15:17:14.168000255 -0700
+++ b/mm/migrate.c=C2=A0 =C2=A0 =C2=A0 2021-03-31 15:17:14.207000255 -0700<= br> @@ -1493,6 +1493,7 @@ static inline int try_split_thp(struct p
=C2=A0 * @mode:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 The migrati= on mode that specifies the constraints for
=C2=A0 *=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0page migration, if any.
=C2=A0 * @reason:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 The reason for p= age migration.
+ * @nr_succeeded:=C2=A0 =C2=A0 =C2=A0 The number of pages migrated success= fully.
=C2=A0 *
=C2=A0 * The function returns after 10 attempts or if no pages are movable = any more
=C2=A0 * because the list has become empty or no retryable pages exist any = more.
@@ -1503,12 +1504,11 @@ static inline int try_split_thp(struct p
=C2=A0 */
=C2=A0int migrate_pages(struct list_head *from, new_page_t get_new_page, =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 free_page_t put_new= _page, unsigned long private,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0enum migrate_mode m= ode, int reason)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0enum migrate_mode m= ode, int reason, unsigned int *nr_succeeded)
=C2=A0{
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int retry =3D 1;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int thp_retry =3D 1;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int nr_failed =3D 0;
-=C2=A0 =C2=A0 =C2=A0 =C2=A0int nr_succeeded =3D 0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int nr_thp_succeeded =3D 0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int nr_thp_failed =3D 0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int nr_thp_split =3D 0;
@@ -1611,10 +1611,10 @@ retry:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 case MIGRATEPAGE_SUCCESS:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (is_thp) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 nr_thp_s= ucceeded++;
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nr_succee= ded +=3D nr_subpages;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*nr_succe= eded +=3D nr_subpages;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nr_succeeded++;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(*nr_succeeded)++;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 default:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*
@@ -1643,12 +1643,12 @@ out:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*/
=C2=A0 =C2=A0 =C2=A0 =C2=A0 list_splice(&ret_pages, from);

-=C2=A0 =C2=A0 =C2=A0 =C2=A0count_vm_events(PGMIGRATE_SUCCESS, nr_succeeded= );
+=C2=A0 =C2=A0 =C2=A0 =C2=A0count_vm_events(PGMIGRATE_SUCCESS, *nr_succeede= d);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 count_vm_events(PGMIGRATE_FAIL, nr_failed);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 count_vm_events(THP_MIGRATION_SUCCESS, nr_thp_s= ucceeded);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 count_vm_events(THP_MIGRATION_FAIL, nr_thp_fail= ed);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 count_vm_events(THP_MIGRATION_SPLIT, nr_thp_spl= it);
-=C2=A0 =C2=A0 =C2=A0 =C2=A0trace_mm_migrate_pages(nr_succeeded, nr_failed,= nr_thp_succeeded,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0trace_mm_migrate_pages(*nr_succeeded, nr_failed= , nr_thp_succeeded,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nr_thp_failed, nr_thp_split, mode, re= ason);

=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!swapwrite)
@@ -1716,6 +1716,7 @@ static int store_status(int __user *stat
=C2=A0static int do_move_pages_to_node(struct mm_struct *mm,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct list_head *p= agelist, int node)
=C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int nr_succeeded =3D 0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int err;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 struct migration_target_control mtc =3D {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 .nid =3D node,
@@ -1723,7 +1724,8 @@ static int do_move_pages_to_node(struct
=C2=A0 =C2=A0 =C2=A0 =C2=A0 };

=C2=A0 =C2=A0 =C2=A0 =C2=A0 err =3D migrate_pages(pagelist, alloc_migration= _target, NULL,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(unsigned long)&mtc, MIGRATE_SYNC, MR_SYSCALL);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(unsigned long)&mtc, MIGRATE_SYNC, MR_SYSCALL,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0&nr_succeeded);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (err)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 putback_movable_pag= es(pagelist);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 return err;
@@ -2207,6 +2209,7 @@ int migrate_misplaced_page(struct page *
=C2=A0 =C2=A0 =C2=A0 =C2=A0 pg_data_t *pgdat =3D NODE_DATA(node);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int isolated;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int nr_remaining;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int nr_succeeded =3D 0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 LIST_HEAD(migratepages);

=C2=A0 =C2=A0 =C2=A0 =C2=A0 /*
@@ -2230,7 +2233,7 @@ int migrate_misplaced_page(struct page *
=C2=A0 =C2=A0 =C2=A0 =C2=A0 list_add(&page->lru, &migratepages);=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 nr_remaining =3D migrate_pages(&migratepage= s, alloc_misplaced_dst_page,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0NULL, node, MIGR= ATE_ASYNC,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 MR_NUMA_MISPLACED); +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 MR_NUMA_MISPLACED, &am= p;nr_succeeded);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (nr_remaining) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!list_empty(&am= p;migratepages)) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 list_del(&page->lru);
diff -puN mm/page_alloc.c~migrate_pages-add-success-return mm/page_alloc.c<= br> --- a/mm/page_alloc.c~migrate_pages-add-success-return=C2=A0 2021-03-31 15:= 17:14.178000255 -0700
+++ b/mm/page_alloc.c=C2=A0 =C2=A02021-03-31 15:17:14.213000255 -0700
@@ -8452,7 +8452,8 @@ static unsigned long pfn_max_align_up(un

=C2=A0/* [start, end) must belong to a single zone. */
=C2=A0static int __alloc_contig_migrate_range(struct compact_control *cc, -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned = long start, unsigned long end)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned = long start, unsigned long end,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned = int *nr_succeeded)
=C2=A0{
=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* This function is based on compact_zone() fro= m compaction.c. */
=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned int nr_reclaimed;
@@ -8490,7 +8491,8 @@ static int __alloc_contig_migrate_range(
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 cc->nr_migratepa= ges -=3D nr_reclaimed;

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D migrate_pag= es(&cc->migratepages, alloc_migration_target,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0NULL, (unsigned long)&mtc, cc->= ;mode, MR_CONTIG_RANGE);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0NULL, (unsigned long)&mtc, cc->= ;mode, MR_CONTIG_RANGE,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nr_succeeded);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 }
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (ret < 0) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 putback_movable_pag= es(&cc->migratepages);
@@ -8526,6 +8528,7 @@ int alloc_contig_range(unsigned long sta
=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long outer_start, outer_end;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned int order;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int ret =3D 0;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int nr_succeeded =3D 0;

=C2=A0 =C2=A0 =C2=A0 =C2=A0 struct compact_control cc =3D {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 .nr_migratepages = =3D 0,
@@ -8580,7 +8583,7 @@ int alloc_contig_range(unsigned long sta
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* allocated.=C2=A0 So, if we fall through= be sure to clear ret so that
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* -EBUSY is not accidentally used or retu= rned to caller.
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*/
-=C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D __alloc_contig_migrate_range(&cc, s= tart, end);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D __alloc_contig_migrate_range(&cc, s= tart, end, &nr_succeeded);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (ret && ret !=3D -EBUSY)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto done;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D0;
_
--000000000000e7205d05bef0d96d--