diff --git a/mm/filemap.c b/mm/filemap.c index eb96ddf00ba8d0db6158c776c2ca8ab3b8c0c4c6..630a3eec5a881728ada5d3da71bf5e13223a0248 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include "internal.h" @@ -1931,6 +1932,8 @@ struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index, if (!mapping_large_folio_support(mapping)) order = 0; + if (order && mm_in_dynamic_pool(current->mm)) + order = 0; if (order > MAX_PAGECACHE_ORDER) order = MAX_PAGECACHE_ORDER; /* If we're not aligned, allocate a smaller folio */ diff --git a/mm/huge_memory.c b/mm/huge_memory.c index af6a5c840e276f15fba4e6f67d61cdda1d019c77..a62c4dc2b9da750a9acf4fee8b2c01681ab3d3ec 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -2933,6 +2933,7 @@ static bool __discard_anon_folio_pmd_locked(struct vm_area_struct *vma, folio_remove_rmap_pmd(folio, pmd_page(orig_pmd), vma); zap_deposited_table(mm, pmdp); add_mm_counter(mm, MM_ANONPAGES, -HPAGE_PMD_NR); + add_reliable_folio_counter(folio, mm, -HPAGE_PMD_NR); if (vma->vm_flags & VM_LOCKED) mlock_drain_local(); folio_put(folio); diff --git a/mm/memory.c b/mm/memory.c index 2771c10454e17c6ca064f44e8b27a9f640f899f5..84ff5ac8fb968970d9bc8c8f26d9af74a0dd7294 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4395,6 +4395,8 @@ static struct folio *alloc_anon_folio(struct vm_fault *vmf) */ if (unlikely(userfaultfd_armed(vma))) goto fallback; + if (mm_in_dynamic_pool(vma->vm_mm)) + goto fallback; /* * Get a list of all the (large) orders below PMD_ORDER that are enabled diff --git a/mm/readahead.c b/mm/readahead.c index a8911f7c161a725700af79e9e17db060de6c347f..d0b3de43cf23b821b580c092f8a7c68bac5efb6b 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -128,6 +128,7 @@ #include #include #include +#include #include "internal.h" @@ -503,6 +504,8 @@ void page_cache_ra_order(struct readahead_control *ractl, if (!mapping_large_folio_support(mapping) || ra->size < 4) goto fallback; + if (mm_in_dynamic_pool(current->mm)) + goto fallback; limit = min(limit, index + ra->size - 1); diff --git a/mm/shmem.c b/mm/shmem.c index d7a970f7accb78d40f221312875d5483a9ccf186..7b3fa6b9aa289b5b7b123223c6e00c3e9f626a33 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1735,7 +1735,7 @@ static struct folio *shmem_alloc_folio(gfp_t gfp, int order, struct folio *folio; shmem_pseudo_vma_init(&pvma, info, index); - folio = vma_alloc_folio(gfp, order, &pvma, 0, order == HPAGE_PMD_ORDER); + folio = vma_alloc_folio(gfp, order, &pvma, 0, order == PMD_ORDER); shmem_pseudo_vma_destroy(&pvma); return folio;