mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
mm/pagewalk: add walk_page_range_vma()
Let's add walk_page_range_vma(), which is similar to walk_page_vma(), however, is only interested in a subset of the VMA range. To be used in KSM code to stop using follow_page() next. Link: https://lkml.kernel.org/r/20221021101141.84170-8-david@redhat.com Signed-off-by: David Hildenbrand <david@redhat.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Hugh Dickins <hughd@google.com> Cc: Jason Gunthorpe <jgg@nvidia.com> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Peter Xu <peterx@redhat.com> Cc: Shuah Khan <shuah@kernel.org> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
6cce3314b9
commit
e07cda5f23
|
@ -101,6 +101,9 @@ int walk_page_range_novma(struct mm_struct *mm, unsigned long start,
|
|||
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,
|
||||
|
|
|
@ -517,6 +517,26 @@ int walk_page_range_novma(struct mm_struct *mm, unsigned long start,
|
|||
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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue