BACKPORT: mm/huge_memory: only split PMD mapping when necessary in unmap_folio()
Patch series "Split a folio to any lower order folios", v5.
File folio supports any order and multi-size THP is upstreamed[1], so both
file and anonymous folios can be >0 order. Currently, split_huge_page()
only splits a huge page to order-0 pages, but splitting to orders higher
than 0 might better utilize large folios, if done properly. In addition,
Large Block Sizes in XFS support would benefit from it during truncate[2].
This patchset adds support for splitting a large folio to any lower order
folios.
In addition to this implementation of split_huge_page_to_list_to_order(),
a possible optimization could be splitting a large folio to arbitrary
smaller folios instead of a single order. As both Hugh and Ryan pointed
out [3,5] that split to a single order might not be optimal, an order-9
folio might be better split into 1 order-8, 1 order-7, ..., 1 order-1, and
2 order-0 folios, depending on subsequent folio operations. Leave this as
future work.
[1] https://lore.kernel.org/all/20231207161211.2374093-1-ryan.roberts@arm.com/
[2] https://lore.kernel.org/linux-mm/20240226094936.2677493-1-kernel@pankajraghav.com/
[3] https://lore.kernel.org/linux-mm/9dd96da-efa2-5123-20d4-4992136ef3ad@google.com/
[4] https://lore.kernel.org/linux-mm/cbb1d6a0-66dd-47d0-8733-f836fe050374@arm.com/
[5] https://lore.kernel.org/linux-mm/20240213215520.1048625-1-zi.yan@sent.com/
This patch (of 8):
As multi-size THP support is added, not all THPs are PMD-mapped, thus
during a huge page split, there is no need to always split PMD mapping in
unmap_folio(). Make it conditional.
Link: https://lkml.kernel.org/r/20240226205534.1603748-1-zi.yan@sent.com
Link: https://lkml.kernel.org/r/20240226205534.1603748-2-zi.yan@sent.com
Signed-off-by: Zi Yan <ziy@nvidia.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Luis Chamberlain <mcgrof@kernel.org>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Michal Koutny <mkoutny@suse.com>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Yang Shi <shy828301@gmail.com>
Cc: Yu Zhao <yuzhao@google.com>
Cc: Zach O'Keefe <zokeefe@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
(cherry picked from commit 319a624ec2b79db7a0b0a2a2a61e3aa5c96eabfc)
[ Resolved minor conflicts - Pengfei Li ]
Fixes: c7ab0d2fdc
("mm: convert try_to_unmap_one() to use
page_vma_mapped_walk()")
Bug: 431730501
Change-Id: I806da917fbb577d5ccc645e0ee115e1d213ee3da
Signed-off-by: Pengfei Li <pengfei.kernel@vivo.corp-partner.google.com>
This commit is contained in:
@@ -2886,11 +2886,13 @@ void vma_adjust_trans_huge(struct vm_area_struct *vma,
|
|||||||
|
|
||||||
static void unmap_folio(struct folio *folio)
|
static void unmap_folio(struct folio *folio)
|
||||||
{
|
{
|
||||||
enum ttu_flags ttu_flags = TTU_RMAP_LOCKED | TTU_SPLIT_HUGE_PMD |
|
enum ttu_flags ttu_flags = TTU_RMAP_LOCKED | TTU_SYNC;
|
||||||
TTU_SYNC;
|
|
||||||
|
|
||||||
VM_BUG_ON_FOLIO(!folio_test_large(folio), folio);
|
VM_BUG_ON_FOLIO(!folio_test_large(folio), folio);
|
||||||
|
|
||||||
|
if (folio_test_pmd_mappable(folio))
|
||||||
|
ttu_flags |= TTU_SPLIT_HUGE_PMD;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Anon pages need migration entries to preserve them, but file
|
* Anon pages need migration entries to preserve them, but file
|
||||||
* pages can simply be left unmapped, then faulted back on demand.
|
* pages can simply be left unmapped, then faulted back on demand.
|
||||||
|
Reference in New Issue
Block a user