collapse_file() requires FSes supporting large folio with at least PMD_ORDER, so replace the READ_ONLY_THP_FOR_FS check with that. shmem with huge option turned on also sets large folio order on mapping, so the check also applies to shmem.
While at it, replace VM_BUG_ON with returning failure values. Signed-off-by: Zi Yan <[email protected]> --- mm/khugepaged.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mm/khugepaged.c b/mm/khugepaged.c index d06d84219e1b..45b12ffb1550 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -1899,8 +1899,11 @@ static enum scan_result collapse_file(struct mm_struct *mm, unsigned long addr, int nr_none = 0; bool is_shmem = shmem_file(file); - VM_BUG_ON(!IS_ENABLED(CONFIG_READ_ONLY_THP_FOR_FS) && !is_shmem); - VM_BUG_ON(start & (HPAGE_PMD_NR - 1)); + /* "huge" shmem sets mapping folio order and passes the check below */ + if (mapping_max_folio_order(mapping) < PMD_ORDER) + return SCAN_FAIL; + if (start & (HPAGE_PMD_NR - 1)) + return SCAN_ADDRESS_RANGE; result = alloc_charge_folio(&new_folio, mm, cc); if (result != SCAN_SUCCEED) -- 2.43.0

