mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-31 14:23:49 +01:00
mm/huge_memory: respect MADV_COLLAPSE with PR_THP_DISABLE_EXCEPT_ADVISED
Let's allow for making MADV_COLLAPSE succeed on areas that neither have VM_HUGEPAGE nor VM_NOHUGEPAGE when we have THP disabled unless explicitly advised (PR_THP_DISABLE_EXCEPT_ADVISED). MADV_COLLAPSE is a clear advice that we want to collapse. Note that we still respect the VM_NOHUGEPAGE flag, just like MADV_COLLAPSE always does. So consequently, MADV_COLLAPSE is now only refused on VM_NOHUGEPAGE with PR_THP_DISABLE_EXCEPT_ADVISED, including for shmem. Link: https://lkml.kernel.org/r/[email protected] Co-developed-by: Usama Arif <[email protected]> Signed-off-by: Usama Arif <[email protected]> Signed-off-by: David Hildenbrand <[email protected]> Reviewed-by: Baolin Wang <[email protected]> Reviewed-by: Lorenzo Stoakes <[email protected]> Reviewed-by: Zi Yan <[email protected]> Cc: Arnd Bergmann <[email protected]> Cc: Barry Song <[email protected]> Cc: Dev Jain <[email protected]> Cc: Jann Horn <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: Jonathan Corbet <[email protected]> Cc: Liam Howlett <[email protected]> Cc: Mariano Pache <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Mike Rapoport <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Ryan Roberts <[email protected]> Cc: SeongJae Park <[email protected]> Cc: Shakeel Butt <[email protected]> Cc: Suren Baghdasaryan <[email protected]> Cc: Vlastimil Babka <[email protected]> Cc: Yafang <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
This commit is contained in:
1 parent
1f1c061089
commit
8cdc4d2701
5 files changed
+16
-7
No files matched your search
@@ -329,7 +329,7 @@ struct thpsize {
|
||||
* through madvise or prctl.
|
||||
*/
|
||||
static inline bool vma_thp_disabled(struct vm_area_struct *vma,
|
||||
vm_flags_t vm_flags)
|
||||
vm_flags_t vm_flags, bool forced_collapse)
|
||||
{
|
||||
/* Are THPs disabled for this VMA? */
|
||||
if (vm_flags & VM_NOHUGEPAGE)
|
||||
@@ -343,6 +343,12 @@ static inline bool vma_thp_disabled(struct vm_area_struct *vma,
|
||||
*/
|
||||
if (vm_flags & VM_HUGEPAGE)
|
||||
return false;
|
||||
/*
|
||||
* Forcing a collapse (e.g., madv_collapse), is a clear advice to
|
||||
* use THPs.
|
||||
*/
|
||||
if (forced_collapse)
|
||||
return false;
|
||||
return mm_flags_test(MMF_DISABLE_THP_EXCEPT_ADVISED, vma->vm_mm);
|
||||
}
|
||||
|
||||
|
||||
@@ -185,7 +185,7 @@ struct prctl_mm_map {
|
||||
#define PR_SET_THP_DISABLE 41
|
||||
/*
|
||||
* Don't disable THPs when explicitly advised (e.g., MADV_HUGEPAGE /
|
||||
* VM_HUGEPAGE).
|
||||
* VM_HUGEPAGE, MADV_COLLAPSE).
|
||||
*/
|
||||
# define PR_THP_DISABLE_EXCEPT_ADVISED (1 << 1)
|
||||
#define PR_GET_THP_DISABLE 42
|
||||
|
||||
+3
-2
@@ -104,7 +104,8 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,
|
||||
{
|
||||
const bool smaps = type == TVA_SMAPS;
|
||||
const bool in_pf = type == TVA_PAGEFAULT;
|
||||
const bool enforce_sysfs = type != TVA_FORCED_COLLAPSE;
|
||||
const bool forced_collapse = type == TVA_FORCED_COLLAPSE;
|
||||
const bool enforce_sysfs = !forced_collapse;
|
||||
unsigned long supported_orders;
|
||||
|
||||
/* Check the intersection of requested and supported orders. */
|
||||
@@ -122,7 +123,7 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,
|
||||
if (!vma->vm_mm) /* vdso */
|
||||
return 0;
|
||||
|
||||
if (thp_disabled_by_hw() || vma_thp_disabled(vma, vm_flags))
|
||||
if (thp_disabled_by_hw() || vma_thp_disabled(vma, vm_flags, forced_collapse))
|
||||
return 0;
|
||||
|
||||
/* khugepaged doesn't collapse DAX vma, but page fault is fine. */
|
||||
|
||||
+4
-2
@@ -5332,9 +5332,11 @@ vm_fault_t do_set_pmd(struct vm_fault *vmf, struct folio *folio, struct page *pa
|
||||
* It is too late to allocate a small folio, we already have a large
|
||||
* folio in the pagecache: especially s390 KVM cannot tolerate any
|
||||
* PMD mappings, but PTE-mapped THP are fine. So let's simply refuse any
|
||||
* PMD mappings if THPs are disabled.
|
||||
* PMD mappings if THPs are disabled. As we already have a THP,
|
||||
* behave as if we are forcing a collapse.
|
||||
*/
|
||||
if (thp_disabled_by_hw() || vma_thp_disabled(vma, vma->vm_flags))
|
||||
if (thp_disabled_by_hw() || vma_thp_disabled(vma, vma->vm_flags,
|
||||
/* forced_collapse=*/ true))
|
||||
return ret;
|
||||
|
||||
if (!thp_vma_suitable_order(vma, haddr, PMD_ORDER))
|
||||
|
||||
+1
-1
@@ -1817,7 +1817,7 @@ unsigned long shmem_allowable_huge_orders(struct inode *inode,
|
||||
vm_flags_t vm_flags = vma ? vma->vm_flags : 0;
|
||||
unsigned int global_orders;
|
||||
|
||||
if (thp_disabled_by_hw() || (vma && vma_thp_disabled(vma, vm_flags)))
|
||||
if (thp_disabled_by_hw() || (vma && vma_thp_disabled(vma, vm_flags, shmem_huge_force)))
|
||||
return 0;
|
||||
|
||||
global_orders = shmem_huge_global_enabled(inode, index, write_end,
|
||||
|
||||
Reference in new issue
Block a user