From: Jane Chu <jane.chu@oracle.com>
To: Kefeng Wang <wangkefeng.wang@huawei.com>,
akpm@linux-foundation.org, linux-mm@kvack.org
Cc: Tony Luck <tony.luck@intel.com>,
Miaohe Lin <linmiaohe@huawei.com>,
nao.horiguchi@gmail.com, Matthew Wilcox <willy@infradead.org>,
David Hildenbrand <david@redhat.com>,
Muchun Song <muchun.song@linux.dev>,
Benjamin LaHaise <bcrl@kvack.org>,
jglisse@redhat.com, Jiaqi Yan <jiaqiyan@google.com>,
Hugh Dickins <hughd@google.com>,
Vishal Moola <vishal.moola@gmail.com>,
Alistair Popple <apopple@nvidia.com>,
Oscar Salvador <osalvador@suse.de>,
Lance Yang <ioworker0@gmail.com>
Subject: Re: [PATCH v4 3/6] mm: migrate: split folio_migrate_mapping()
Date: Thu, 6 Jun 2024 11:28:03 -0700 [thread overview]
Message-ID: <43287658-3ac5-4806-95f7-b5d900d5ecf6@oracle.com> (raw)
In-Reply-To: <20240603092439.3360652-4-wangkefeng.wang@huawei.com>
On 6/3/2024 2:24 AM, Kefeng Wang wrote:
> The folio refcount check for !mapping and folio_ref_freeze() for
> mapping are moved out of the original folio_migrate_mapping(), and
> there is no turning back for the new __folio_migrate_mapping(),
> also update comment from page to folio.
>
> Note, the folio_ref_freeze() is moved out of xas_lock_irq(),
> Since the folio is already isolated and locked during migration,
> so suppose that there is no functional change.
>
> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
> ---
> mm/migrate.c | 63 ++++++++++++++++++++++++++--------------------------
> 1 file changed, 32 insertions(+), 31 deletions(-)
>
> diff --git a/mm/migrate.c b/mm/migrate.c
> index e04b451c4289..e930376c261a 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -393,50 +393,36 @@ static int folio_expected_refs(struct address_space *mapping,
> }
>
> /*
> - * Replace the page in the mapping.
> + * Replace the folio in the mapping.
> *
> * The number of remaining references must be:
> - * 1 for anonymous pages without a mapping
> - * 2 for pages with a mapping
> - * 3 for pages with a mapping and PagePrivate/PagePrivate2 set.
> + * 1 for anonymous folios without a mapping
> + * 2 for folios with a mapping
> + * 3 for folios with a mapping and PagePrivate/PagePrivate2 set.
> */
> -int folio_migrate_mapping(struct address_space *mapping,
> - struct folio *newfolio, struct folio *folio, int extra_count)
> +static void __folio_migrate_mapping(struct address_space *mapping,
> + struct folio *newfolio, struct folio *folio, int expected_cnt)
> {
> XA_STATE(xas, &mapping->i_pages, folio_index(folio));
> struct zone *oldzone, *newzone;
> - int dirty;
> - int expected_count = folio_expected_refs(mapping, folio) + extra_count;
> long nr = folio_nr_pages(folio);
> long entries, i;
> + int dirty;
>
> if (!mapping) {
> - /* Anonymous page without mapping */
> - if (folio_ref_count(folio) != expected_count)
> - return -EAGAIN;
> -
> - /* No turning back from here */
> + /* Anonymous folio without mapping */
> newfolio->index = folio->index;
> newfolio->mapping = folio->mapping;
> if (folio_test_swapbacked(folio))
> __folio_set_swapbacked(newfolio);
> -
> - return MIGRATEPAGE_SUCCESS;
> + return;
> }
>
> oldzone = folio_zone(folio);
> newzone = folio_zone(newfolio);
>
> xas_lock_irq(&xas);
> - if (!folio_ref_freeze(folio, expected_count)) {
> - xas_unlock_irq(&xas);
> - return -EAGAIN;
> - }
> -
> - /*
> - * Now we know that no one else is looking at the folio:
> - * no turning back from here.
> - */
> + /* Now we know that no one else is looking at the folio */
> newfolio->index = folio->index;
> newfolio->mapping = folio->mapping;
> folio_ref_add(newfolio, nr); /* add cache reference */
> @@ -452,7 +438,7 @@ int folio_migrate_mapping(struct address_space *mapping,
> entries = 1;
> }
>
> - /* Move dirty while page refs frozen and newpage not yet exposed */
> + /* Move dirty while folio refs frozen and newfolio not yet exposed */
> dirty = folio_test_dirty(folio);
> if (dirty) {
> folio_clear_dirty(folio);
> @@ -466,22 +452,22 @@ int folio_migrate_mapping(struct address_space *mapping,
> }
>
> /*
> - * Drop cache reference from old page by unfreezing
> - * to one less reference.
> + * Since old folio's refcount freezed, now drop cache reference from
> + * old folio by unfreezing to one less reference.
> * We know this isn't the last reference.
> */
> - folio_ref_unfreeze(folio, expected_count - nr);
> + folio_ref_unfreeze(folio, expected_cnt - nr);
>
> xas_unlock(&xas);
> /* Leave irq disabled to prevent preemption while updating stats */
>
> /*
> * If moved to a different zone then also account
> - * the page for that zone. Other VM counters will be
> + * the folio for that zone. Other VM counters will be
> * taken care of when we establish references to the
> - * new page and drop references to the old page.
> + * new folio and drop references to the old folio.
> *
> - * Note that anonymous pages are accounted for
> + * Note that anonymous folios are accounted for
> * via NR_FILE_PAGES and NR_ANON_MAPPED if they
> * are mapped to swap space.
> */
> @@ -518,7 +504,22 @@ int folio_migrate_mapping(struct address_space *mapping,
> }
> }
> local_irq_enable();
> +}
> +
> +int folio_migrate_mapping(struct address_space *mapping, struct folio *newfolio,
> + struct folio *folio, int extra_count)
> +{
> + int expected_cnt = folio_expected_refs(mapping, folio) + extra_count;
> +
> + if (!mapping) {
> + if (folio_ref_count(folio) != expected_cnt)
> + return -EAGAIN;
> + } else {
> + if (!folio_ref_freeze(folio, expected_cnt))
> + return -EAGAIN;
> + }
>
> + __folio_migrate_mapping(mapping, newfolio, folio, expected_cnt);
> return MIGRATEPAGE_SUCCESS;
> }
> EXPORT_SYMBOL(folio_migrate_mapping);
As far as I can tell, there is no functionality change since the file
based folio has already been isolated.
Reviewed-by: Jane Chu <jane.chu@oracle.com>
thanks,
-jane
next prev parent reply other threads:[~2024-06-06 18:28 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-03 9:24 [PATCH v4 0/6] mm: migrate: support poison recover from migrate folio Kefeng Wang
2024-06-03 9:24 ` [PATCH v4 1/6] mm: move memory_failure_queue() into copy_mc_[user]_highpage() Kefeng Wang
2024-06-04 19:38 ` Jane Chu
2024-06-06 2:28 ` Miaohe Lin
2024-06-03 9:24 ` [PATCH v4 2/6] mm: add folio_mc_copy() Kefeng Wang
2024-06-04 19:41 ` Jane Chu
2024-06-05 3:31 ` Andrew Morton
2024-06-05 7:15 ` Kefeng Wang
2024-06-06 2:36 ` Miaohe Lin
2024-06-03 9:24 ` [PATCH v4 3/6] mm: migrate: split folio_migrate_mapping() Kefeng Wang
2024-06-06 0:54 ` Jane Chu
2024-06-06 1:24 ` Kefeng Wang
2024-06-06 1:55 ` Matthew Wilcox
2024-06-06 2:24 ` Kefeng Wang
2024-06-06 18:28 ` Jane Chu [this message]
2024-06-03 9:24 ` [PATCH v4 4/6] mm: migrate: support poisoned recover from migrate folio Kefeng Wang
2024-06-06 21:27 ` Jane Chu
2024-06-06 22:28 ` Jane Chu
2024-06-06 22:31 ` Jane Chu
2024-06-07 4:01 ` Kefeng Wang
2024-06-07 15:59 ` Jane Chu
2024-06-03 9:24 ` [PATCH v4 5/6] fs: hugetlbfs: support poison recover from hugetlbfs_migrate_folio() Kefeng Wang
2024-06-06 23:30 ` Jane Chu
2024-06-03 9:24 ` [PATCH v4 6/6] mm: migrate: remove folio_migrate_copy() Kefeng Wang
2024-06-06 23:46 ` Jane Chu
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=43287658-3ac5-4806-95f7-b5d900d5ecf6@oracle.com \
--to=jane.chu@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=apopple@nvidia.com \
--cc=bcrl@kvack.org \
--cc=david@redhat.com \
--cc=hughd@google.com \
--cc=ioworker0@gmail.com \
--cc=jglisse@redhat.com \
--cc=jiaqiyan@google.com \
--cc=linmiaohe@huawei.com \
--cc=linux-mm@kvack.org \
--cc=muchun.song@linux.dev \
--cc=nao.horiguchi@gmail.com \
--cc=osalvador@suse.de \
--cc=tony.luck@intel.com \
--cc=vishal.moola@gmail.com \
--cc=wangkefeng.wang@huawei.com \
--cc=willy@infradead.org \
/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