]> www.infradead.org Git - users/willy/xarray.git/commitdiff
mm: khugepaged: support shmem mTHP collapse
authorBaolin Wang <baolin.wang@linux.alibaba.com>
Tue, 20 Aug 2024 09:49:16 +0000 (17:49 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 4 Sep 2024 04:15:39 +0000 (21:15 -0700)
Shmem already supports the allocation of mTHP, but khugepaged does not yet
support collapsing mTHP folios.  Now khugepaged is ready to support mTHP,
and this patch enables the collapse of shmem mTHP.

Link: https://lkml.kernel.org/r/b9da76aab4276eb6e5d12c479af2b5eea5b4575d.1724140601.git.baolin.wang@linux.alibaba.com
Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Barry Song <21cnbao@gmail.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Yang Shi <shy828301@gmail.com>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/khugepaged.c

index 4996f7487c13415524e3b10ba3d7baf93b988e4c..4a83c40d90538180f70ab7b6eddab5c7a7e5495e 100644 (file)
@@ -1843,7 +1843,7 @@ static int collapse_file(struct mm_struct *mm, unsigned long addr,
                }
        } while (1);
 
-       for (index = start; index < end; index++) {
+       for (index = start; index < end;) {
                xas_set(&xas, index);
                folio = xas_load(&xas);
 
@@ -1862,6 +1862,7 @@ static int collapse_file(struct mm_struct *mm, unsigned long addr,
                                        }
                                }
                                nr_none++;
+                               index++;
                                continue;
                        }
 
@@ -1943,12 +1944,10 @@ static int collapse_file(struct mm_struct *mm, unsigned long addr,
                 * we locked the first folio, then a THP might be there already.
                 * This will be discovered on the first iteration.
                 */
-               if (folio_test_large(folio)) {
-                       result = folio_order(folio) == HPAGE_PMD_ORDER &&
-                                       folio->index == start
-                                       /* Maybe PMD-mapped */
-                                       ? SCAN_PTE_MAPPED_HUGEPAGE
-                                       : SCAN_PAGE_COMPOUND;
+               if (folio_order(folio) == HPAGE_PMD_ORDER &&
+                   folio->index == start) {
+                       /* Maybe PMD-mapped */
+                       result = SCAN_PTE_MAPPED_HUGEPAGE;
                        goto out_unlock;
                }
 
@@ -2009,6 +2008,7 @@ static int collapse_file(struct mm_struct *mm, unsigned long addr,
                 * Accumulate the folios that are being collapsed.
                 */
                list_add_tail(&folio->lru, &pagelist);
+               index += folio_nr_pages(folio);
                continue;
 out_unlock:
                folio_unlock(folio);
@@ -2261,16 +2261,10 @@ static int hpage_collapse_scan_file(struct mm_struct *mm, unsigned long addr,
                        continue;
                }
 
-               /*
-                * TODO: khugepaged should compact smaller compound pages
-                * into a PMD sized page
-                */
-               if (folio_test_large(folio)) {
-                       result = folio_order(folio) == HPAGE_PMD_ORDER &&
-                                       folio->index == start
-                                       /* Maybe PMD-mapped */
-                                       ? SCAN_PTE_MAPPED_HUGEPAGE
-                                       : SCAN_PAGE_COMPOUND;
+               if (folio_order(folio) == HPAGE_PMD_ORDER &&
+                   folio->index == start) {
+                       /* Maybe PMD-mapped */
+                       result = SCAN_PTE_MAPPED_HUGEPAGE;
                        /*
                         * For SCAN_PTE_MAPPED_HUGEPAGE, further processing
                         * by the caller won't touch the page cache, and so