Patch "mm: huge_memory: add vma_thp_disabled() and thp_disabled_by_hw()" has been added to the 6.11-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    mm: huge_memory: add vma_thp_disabled() and thp_disabled_by_hw()

to the 6.11-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     mm-huge_memory-add-vma_thp_disabled-and-thp_disabled.patch
and it can be found in the queue-6.11 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit dbbe0e282428ba978e9aa1f22932a381b4216f8a
Author: Kefeng Wang <wangkefeng.wang@xxxxxxxxxx>
Date:   Fri Oct 11 12:24:44 2024 +0200

    mm: huge_memory: add vma_thp_disabled() and thp_disabled_by_hw()
    
    [ Upstream commit 963756aac1f011d904ddd9548ae82286d3a91f96 ]
    
    Patch series "mm: don't install PMD mappings when THPs are disabled by the
    hw/process/vma".
    
    During testing, it was found that we can get PMD mappings in processes
    where THP (and more precisely, PMD mappings) are supposed to be disabled.
    While it works as expected for anon+shmem, the pagecache is the
    problematic bit.
    
    For s390 KVM this currently means that a VM backed by a file located on
    filesystem with large folio support can crash when KVM tries accessing the
    problematic page, because the readahead logic might decide to use a
    PMD-sized THP and faulting it into the page tables will install a PMD
    mapping, something that s390 KVM cannot tolerate.
    
    This might also be a problem with HW that does not support PMD mappings,
    but I did not try reproducing it.
    
    Fix it by respecting the ways to disable THPs when deciding whether we can
    install a PMD mapping.  khugepaged should already be taking care of not
    collapsing if THPs are effectively disabled for the hw/process/vma.
    
    This patch (of 2):
    
    Add vma_thp_disabled() and thp_disabled_by_hw() helpers to be shared by
    shmem_allowable_huge_orders() and __thp_vma_allowable_orders().
    
    [david@xxxxxxxxxx: rename to vma_thp_disabled(), split out thp_disabled_by_hw() ]
    Link: https://lkml.kernel.org/r/20241011102445.934409-2-david@xxxxxxxxxx
    Fixes: 793917d997df ("mm/readahead: Add large folio readahead")
    Signed-off-by: Kefeng Wang <wangkefeng.wang@xxxxxxxxxx>
    Signed-off-by: David Hildenbrand <david@xxxxxxxxxx>
    Reported-by: Leo Fu <bfu@xxxxxxxxxx>
    Tested-by: Thomas Huth <thuth@xxxxxxxxxx>
    Reviewed-by: Ryan Roberts <ryan.roberts@xxxxxxx>
    Cc: Boqiao Fu <bfu@xxxxxxxxxx>
    Cc: Christian Borntraeger <borntraeger@xxxxxxxxxxxxx>
    Cc: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx>
    Cc: Hugh Dickins <hughd@xxxxxxxxxx>
    Cc: Janosch Frank <frankja@xxxxxxxxxxxxx>
    Cc: Matthew Wilcox <willy@xxxxxxxxxxxxx>
    Cc: <stable@xxxxxxxxxxxxxxx>
    Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
    Stable-dep-of: 2b0f922323cc ("mm: don't install PMD mappings when THPs are disabled by the hw/process/vma")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
index e25d9ebfdf89a..6d334c211176c 100644
--- a/include/linux/huge_mm.h
+++ b/include/linux/huge_mm.h
@@ -308,6 +308,24 @@ static inline void count_mthp_stat(int order, enum mthp_stat_item item)
 	(transparent_hugepage_flags &					\
 	 (1<<TRANSPARENT_HUGEPAGE_USE_ZERO_PAGE_FLAG))
 
+static inline bool vma_thp_disabled(struct vm_area_struct *vma,
+		unsigned long vm_flags)
+{
+	/*
+	 * Explicitly disabled through madvise or prctl, or some
+	 * architectures may disable THP for some mappings, for
+	 * example, s390 kvm.
+	 */
+	return (vm_flags & VM_NOHUGEPAGE) ||
+	       test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags);
+}
+
+static inline bool thp_disabled_by_hw(void)
+{
+	/* If the hardware/firmware marked hugepage support disabled. */
+	return transparent_hugepage_flags & (1 << TRANSPARENT_HUGEPAGE_UNSUPPORTED);
+}
+
 unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr,
 		unsigned long len, unsigned long pgoff, unsigned long flags);
 unsigned long thp_get_unmapped_area_vmflags(struct file *filp, unsigned long addr,
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index d12ec1c8c7f07..e44508e46e897 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -106,18 +106,7 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,
 	if (!vma->vm_mm)		/* vdso */
 		return 0;
 
-	/*
-	 * Explicitly disabled through madvise or prctl, or some
-	 * architectures may disable THP for some mappings, for
-	 * example, s390 kvm.
-	 * */
-	if ((vm_flags & VM_NOHUGEPAGE) ||
-	    test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags))
-		return 0;
-	/*
-	 * If the hardware/firmware marked hugepage support disabled.
-	 */
-	if (transparent_hugepage_flags & (1 << TRANSPARENT_HUGEPAGE_UNSUPPORTED))
+	if (thp_disabled_by_hw() || vma_thp_disabled(vma, vm_flags))
 		return 0;
 
 	/* khugepaged doesn't collapse DAX vma, but page fault is fine. */
diff --git a/mm/shmem.c b/mm/shmem.c
index a332323eea0b9..27f496d6e43eb 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -1642,12 +1642,7 @@ unsigned long shmem_allowable_huge_orders(struct inode *inode,
 	loff_t i_size;
 	int order;
 
-	if (vma && ((vm_flags & VM_NOHUGEPAGE) ||
-	    test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags)))
-		return 0;
-
-	/* If the hardware/firmware marked hugepage support disabled. */
-	if (transparent_hugepage_flags & (1 << TRANSPARENT_HUGEPAGE_UNSUPPORTED))
+	if (thp_disabled_by_hw() || (vma && vma_thp_disabled(vma, vm_flags)))
 		return 0;
 
 	global_huge = shmem_huge_global_enabled(inode, index, shmem_huge_force,




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux