split_huge_pmd_if_needed(vma, end);
/*
- * If we're also updating the vma->vm_next->vm_start,
+ * If we're also updating the vma_next(vma)->vm_start,
* check if we need to split it.
*/
if (adjust_next > 0) {
- struct vm_area_struct *next = vma->vm_next;
+ struct vm_area_struct *next = vma_next(vma->vm_mm, vma);
unsigned long nstart = next->vm_start;
nstart += adjust_next;
split_huge_pmd_if_needed(next, nstart);
struct mm_struct *mm;
struct vm_area_struct *vma;
int progress = 0;
+ unsigned long address;
VM_BUG_ON(!pages);
lockdep_assert_held(&khugepaged_mm_lock);
vma = NULL;
if (unlikely(!mmap_read_trylock(mm)))
goto breakouterloop_mmap_lock;
- if (likely(!khugepaged_test_exit(mm)))
- vma = find_vma(mm, khugepaged_scan.address);
progress++;
- for (; vma; vma = vma->vm_next) {
+ if (unlikely(khugepaged_test_exit(mm)))
+ goto breakouterloop_mmap_lock;
+
+ address = khugepaged_scan.address;
+ mt_for_each(&mm->mm_mt, vma, address, ULONG_MAX) {
unsigned long hstart, hend;
cond_resched();