unsigned long end, const struct mm_walk_ops *ops,
                          pgd_t *pgd,
                          void *private);
+int walk_page_range_vma(struct vm_area_struct *vma, unsigned long start,
+                       unsigned long end, const struct mm_walk_ops *ops,
+                       void *private);
 int walk_page_vma(struct vm_area_struct *vma, const struct mm_walk_ops *ops,
                void *private);
 int walk_page_mapping(struct address_space *mapping, pgoff_t first_index,
 
        return walk_pgd_range(start, end, &walk);
 }
 
+int walk_page_range_vma(struct vm_area_struct *vma, unsigned long start,
+                       unsigned long end, const struct mm_walk_ops *ops,
+                       void *private)
+{
+       struct mm_walk walk = {
+               .ops            = ops,
+               .mm             = vma->vm_mm,
+               .vma            = vma,
+               .private        = private,
+       };
+
+       if (start >= end || !walk.mm)
+               return -EINVAL;
+       if (start < vma->vm_start || end > vma->vm_end)
+               return -EINVAL;
+
+       mmap_assert_locked(walk.mm);
+       return __walk_page_range(start, end, &walk);
+}
+
 int walk_page_vma(struct vm_area_struct *vma, const struct mm_walk_ops *ops,
                void *private)
 {