Hey Matthew, Thanks for taking time to review! On Wed, Apr 17, 2024 at 11:09 PM Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote: > > On Wed, Apr 17, 2024 at 10:11:11PM +0800, Lance Yang wrote: > > When the user no longer requires the pages, they would use madvise(madv_free) > > to mark the pages as lazy free. IMO, they would not typically rewrite to the > > given range. > > > > At present, a PMD-mapped THP marked as lazyfree during shrink_folio_list() > > is unconditionally split, which may be unnecessary. If the THP is exclusively > > mapped and clean, and the PMD associated with it is also clean, then we can > > attempt to remove the PMD mapping from it. This change will improve the > > efficiency of memory reclamation in this case. > > > > On an Intel i5 CPU, reclaiming 1GiB of PMD-mapped THPs using > > mem_cgroup_force_empty() results in the following runtimes in seconds > > (shorter is better): > > > > -------------------------------------------- > > | Old | New | Change | > > -------------------------------------------- > > | 0.683426 | 0.049197 | -92.80% | > > -------------------------------------------- > > > > Signed-off-by: Lance Yang <ioworker0@xxxxxxxxx> > > --- > > include/linux/huge_mm.h | 1 + > > include/linux/rmap.h | 1 + > > mm/huge_memory.c | 2 +- > > mm/rmap.c | 81 +++++++++++++++++++++++++++++++++++++++++ > > mm/vmscan.c | 7 ++++ > > 5 files changed, 91 insertions(+), 1 deletion(-) > > I'm confused why we need all this extra code. If we remove a folio Thanks for pointing that out! I've added a lot of extra code to rmap.c, and we don't need it for file pages - sorry. I'll reconsider where to place this code. > from the pagecache, we can just call truncate_inode_folio() and > unmap_mapping_folio() takes care of all the necessary unmappings. > Why can't you call unmap_mapping_folio() here? Thanks for your suggestion. But this change only avoids the splitting of *anon* large folios (PMD-mapped THPs) that are marked as lazyfree during shrink_folio_list(). IIUC, in some cases, we cannot unmap the THP marked as lazyfree here, such as when it's not exclusively mapped, dirty, pinned, etc. In such situations, we still need to return to try_to_unmap_one(), and then call split_huge_pmd_address() to split it. Thanks again for the review. Lance