On Tue, 10 May 2022 13:32:20 -0700 Yang Shi <shy828301@xxxxxxxxx> wrote: > The hugepage_vma_check() could be reused by khugepaged_enter() and > khugepaged_enter_vma_merge(), but it is static in khugepaged.c. > Make it non-static and declare it in khugepaged.h. > > .. > > @@ -508,20 +508,13 @@ void __khugepaged_enter(struct mm_struct *mm) > void khugepaged_enter_vma_merge(struct vm_area_struct *vma, > unsigned long vm_flags) > { > - unsigned long hstart, hend; > - > - /* > - * khugepaged only supports read-only files for non-shmem files. > - * khugepaged does not yet work on special mappings. And > - * file-private shmem THP is not supported. > - */ > - if (!hugepage_vma_check(vma, vm_flags)) > - return; > - > - hstart = (vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK; > - hend = vma->vm_end & HPAGE_PMD_MASK; > - if (hstart < hend) > - khugepaged_enter(vma, vm_flags); > + if (!test_bit(MMF_VM_HUGEPAGE, &vma->vm_mm->flags) && > + khugepaged_enabled() && > + (((vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK) < > + (vma->vm_end & HPAGE_PMD_MASK))) { Reviewing these bounds-checking tests is so hard :( Can we simplify? > + if (hugepage_vma_check(vma, vm_flags)) > + __khugepaged_enter(vma->vm_mm); > + } > } void khugepaged_enter_vma(struct vm_area_struct *vma, unsigned long vm_flags) { if (test_bit(MMF_VM_HUGEPAGE, &vma->vm_mm->flags)) return; if (!khugepaged_enabled()) return; if (round_up(vma->vm_start, HPAGE_PMD_SIZE) >= (vma->vm_end & HPAGE_PMD_MASK)) return; /* vma is too small */ if (!hugepage_vma_check(vma, vm_flags)) return; __khugepaged_enter(vma->vm_mm); } Also, it might be slightly faster to have checked MMF_VM_HUGEPAGE before khugepaged_enabled(), but it looks odd. And it might be slower, too - more pointer chasing. I wish someone would document hugepage_vma_check().