From: Kefeng Wang <wangkefeng.wang@huawei.com>
To: Andrew Morton <akpm@linux-foundation.org>, <linux-mm@kvack.org>
Cc: Tony Luck <tony.luck@intel.com>,
Naoya Horiguchi <naoya.horiguchi@nec.com>,
Miaohe Lin <linmiaohe@huawei.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>,
<linux-aio@kvack.org>, <linux-fsdevel@vger.kernel.org>,
Zi Yan <ziy@nvidia.com>, Jiaqi Yan <jiaqiyan@google.com>,
Hugh Dickins <hughd@google.com>,
Kefeng Wang <wangkefeng.wang@huawei.com>
Subject: [PATCH v1 06/11] mm: migrate: split folio_migrate_mapping()
Date: Thu, 21 Mar 2024 11:27:42 +0800 [thread overview]
Message-ID: <20240321032747.87694-7-wangkefeng.wang@huawei.com> (raw)
In-Reply-To: <20240321032747.87694-1-wangkefeng.wang@huawei.com>
The folio_migrate_mapping() function is splitted into two parts,
folio_refs_check_and_freeze() and folio_replace_mapping_and_unfreeze(),
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 | 74 +++++++++++++++++++++++++++++-----------------------
1 file changed, 42 insertions(+), 32 deletions(-)
diff --git a/mm/migrate.c b/mm/migrate.c
index 669c6c2a1868..59c7d66aacba 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -393,50 +393,49 @@ static int folio_expected_refs(struct address_space *mapping,
}
/*
- * Replace the page 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 int folio_refs_check_and_freeze(struct address_space *mapping,
+ struct folio *folio, int expected_cnt)
+{
+ if (!mapping) {
+ if (folio_ref_count(folio) != expected_cnt)
+ return -EAGAIN;
+ } else {
+ if (!folio_ref_freeze(folio, expected_cnt))
+ return -EAGAIN;
+ }
+
+ return 0;
+}
+
+/* The folio refcount must be freezed if folio with a mapping */
+static void folio_replace_mapping_and_unfreeze(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);
+ /* Now we know that no one else is looking at the folio */
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.
- */
newfolio->index = folio->index;
newfolio->mapping = folio->mapping;
folio_ref_add(newfolio, nr); /* add cache reference */
@@ -452,7 +451,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 +465,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 +517,18 @@ 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 ret, expected = folio_expected_refs(mapping, folio) + extra_count;
+
+ ret = folio_refs_check_and_freeze(mapping, folio, expected);
+ if (ret)
+ return ret;
+ folio_replace_mapping_and_unfreeze(mapping, newfolio, folio, expected);
return MIGRATEPAGE_SUCCESS;
}
EXPORT_SYMBOL(folio_migrate_mapping);
--
2.27.0
next prev parent reply other threads:[~2024-03-21 3:29 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-21 3:27 [PATCH v1 00/11] mm: migrate: support poison recover from migrate folio Kefeng Wang
2024-03-21 3:27 ` [PATCH v1 01/11] mm: migrate: simplify __buffer_migrate_folio() Kefeng Wang
2024-04-01 17:54 ` Vishal Moola
2024-04-16 9:28 ` Miaohe Lin
2024-03-21 3:27 ` [PATCH v1 02/11] mm: migrate_device: use more folio in __migrate_device_pages() Kefeng Wang
2024-04-01 18:22 ` Vishal Moola
2024-04-02 6:21 ` Kefeng Wang
2024-04-02 15:54 ` Vishal Moola
2024-04-03 1:23 ` Kefeng Wang
2024-04-16 12:13 ` Miaohe Lin
2024-03-21 3:27 ` [PATCH v1 03/11] mm: migrate_device: unify migrate folio for MIGRATE_SYNC_NO_COPY Kefeng Wang
2024-03-21 3:27 ` [PATCH v1 04/11] mm: migrate: remove migrate_folio_extra() Kefeng Wang
2024-04-16 12:40 ` Miaohe Lin
2024-04-17 1:43 ` Kefeng Wang
2024-04-18 2:32 ` Miaohe Lin
2024-03-21 3:27 ` [PATCH v1 05/11] mm: remove MIGRATE_SYNC_NO_COPY mode Kefeng Wang
2024-03-21 3:27 ` Kefeng Wang [this message]
2024-03-21 3:27 ` [PATCH v1 07/11] mm: add folio_mc_copy() Kefeng Wang
2024-03-21 3:27 ` [PATCH v1 08/11] mm: migrate: support poisoned recover from migrate folio Kefeng Wang
2024-03-21 3:27 ` [PATCH v1 09/11] fs: hugetlbfs: support poison recover from hugetlbfs_migrate_folio() Kefeng Wang
2024-03-21 3:27 ` [PATCH v1 10/11] mm: migrate: remove folio_migrate_copy() Kefeng Wang
2024-03-21 3:27 ` [PATCH v1 11/11] fs: aio: add explicit check for large folio in aio_migrate_folio() Kefeng Wang
2024-03-21 3:35 ` Matthew Wilcox
2024-03-21 5:40 ` Kefeng Wang
2024-03-28 13:30 ` [PATCH v1 00/11] mm: migrate: support poison recover from migrate folio Kefeng 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=20240321032747.87694-7-wangkefeng.wang@huawei.com \
--to=wangkefeng.wang@huawei.com \
--cc=akpm@linux-foundation.org \
--cc=bcrl@kvack.org \
--cc=david@redhat.com \
--cc=hughd@google.com \
--cc=jglisse@redhat.com \
--cc=jiaqiyan@google.com \
--cc=linmiaohe@huawei.com \
--cc=linux-aio@kvack.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=muchun.song@linux.dev \
--cc=naoya.horiguchi@nec.com \
--cc=tony.luck@intel.com \
--cc=willy@infradead.org \
--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