FAILED: patch "[PATCH] mm: khugepaged: skip huge page collapse for special files" failed to apply to 5.10-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a4aeaa06d45e90f9b279f0b09de84bd00006e733 Mon Sep 17 00:00:00 2001
From: Yang Shi <[email protected]>
Date: Thu, 28 Oct 2021 14:36:30 -0700
Subject: [PATCH] mm: khugepaged: skip huge page collapse for special files
The read-only THP for filesystems will collapse THP for files opened readonly and mapped with VM_EXEC. The intended usecase is to avoid TLB misses for large text segments. But it doesn't restrict the file types so a THP could be collapsed for a non-regular file, for example, block device, if it is opened readonly and mapped with EXEC permission. This may cause bugs, like [1] and [2].
This is definitely not the intended usecase, so just collapse THP for regular files in order to close the attack surface.
[[email protected]: fix vm_file check [3]]
mm/khugepaged.c +11 -8
@@ -445,22 +445,25 @@ static bool hugepage_vma_check(struct vm_area_struct *vma,if (!transhuge_vma_enabled (vma, vm_flags))return false; +if (vma->vm_file && !IS_ALIGNED ((vma->vm_start >>PAGE_SHIFT ) - + vma->vm_pgoff,HPAGE_PMD_NR )) +return false; +/* Enabled via shmem mount options or sysfs settings. */ -if (shmem_file (vma->vm_file) &&shmem_huge_enabled (vma)) { -return IS_ALIGNED ((vma->vm_start >>PAGE_SHIFT ) - vma->vm_pgoff, -HPAGE_PMD_NR ); - } +if (shmem_file (vma->vm_file)) +return shmem_huge_enabled (vma);/* THP settings require madvise. */ if (!(vm_flags &VM_HUGEPAGE ) && !khugepaged_always ())return false; -/* Read-only file mappings need to be aligned for THP to work. */ +/* Only regular file is valid */ if (IS_ENABLED (CONFIG_READ_ONLY_THP_FOR_FS ) && vma->vm_file && - !inode_is_open_for_write (vma->vm_file->f_inode) && (vm_flags &VM_EXEC )) { -return IS_ALIGNED ((vma->vm_start >>PAGE_SHIFT ) - vma->vm_pgoff, -HPAGE_PMD_NR ); +struct inode *inode = vma->vm_file->f_inode; + +return !inode_is_open_for_write (inode) && +S_ISREG (inode->i_mode); }if (!vma->anon_vma || vma->vm_ops)