Generalize the order of the collapse_file() function to support future
shmem mTHP collapse.
No functional changes in this patch.
Signed-off-by: Baolin Wang <[email protected]>
---
mm/khugepaged.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index 631459172e19..4adc8c6de062 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -2214,6 +2214,7 @@ static void retract_page_tables(struct address_space
*mapping, pgoff_t pgoff)
* @file: file that collapse on
* @start: collapse start address
* @cc: collapse context and scratchpad
+ * @order: folio order being collapsed to
*
* Basic scheme is simple, details are more complex:
* - allocate and lock a new huge page;
@@ -2232,15 +2233,17 @@ static void retract_page_tables(struct address_space
*mapping, pgoff_t pgoff)
* + unlock and free huge page;
*/
static enum scan_result collapse_file(struct mm_struct *mm, unsigned long
addr,
- struct file *file, pgoff_t start, struct collapse_control *cc)
+ struct file *file, pgoff_t start, struct collapse_control *cc,
+ int order)
{
- const unsigned int max_ptes_none = collapse_max_ptes_none(cc, NULL,
HPAGE_PMD_ORDER);
+ const unsigned int max_ptes_none = collapse_max_ptes_none(cc, NULL,
order);
struct address_space *mapping = file->f_mapping;
+ const unsigned long nr_pages = 1UL << order;
struct page *dst;
struct folio *folio, *tmp, *new_folio;
- pgoff_t index = 0, end = start + HPAGE_PMD_NR;
+ pgoff_t index = 0, end = start + nr_pages;
LIST_HEAD(pagelist);
- XA_STATE_ORDER(xas, &mapping->i_pages, start, HPAGE_PMD_ORDER);
+ XA_STATE_ORDER(xas, &mapping->i_pages, start, order);
enum scan_result result = SCAN_SUCCEED;
int nr_none = 0;
bool is_shmem = shmem_file(file);
@@ -2252,9 +2255,9 @@ static enum scan_result collapse_file(struct mm_struct
*mm, unsigned long addr,
* mapping, the shmem check can be removed.
*/
VM_WARN_ON_ONCE(!is_shmem && !mapping_pmd_folio_support(mapping));
- VM_WARN_ON_ONCE(start & (HPAGE_PMD_NR - 1));
+ VM_WARN_ON_ONCE(start & (nr_pages - 1));
- result = alloc_charge_folio(&new_folio, mm, cc, HPAGE_PMD_ORDER);
+ result = alloc_charge_folio(&new_folio, mm, cc, order);
if (result != SCAN_SUCCEED)
goto out;
@@ -2591,12 +2594,12 @@ static enum scan_result collapse_file(struct mm_struct *mm, unsigned long addr,
}
if (is_shmem) {
- lruvec_stat_mod_folio(new_folio, NR_SHMEM, HPAGE_PMD_NR);
+ lruvec_stat_mod_folio(new_folio, NR_SHMEM, nr_pages);
lruvec_stat_mod_folio(new_folio, NR_SHMEM_THPS, HPAGE_PMD_NR);