Message ID | 20230707165221.4076590-2-fengwei.yin@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | support large folio for mlock | expand |
On Fri, Jul 7, 2023 at 10:52 AM Yin Fengwei <fengwei.yin@intel.com> wrote: > > It will be used to check whether the folio is mapped to specific > VMA and whether the mapping address of folio is in the range. > > Signed-off-by: Yin Fengwei <fengwei.yin@intel.com> > --- > mm/internal.h | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/mm/internal.h b/mm/internal.h > index f1276d90484ad..66117523d7d71 100644 > --- a/mm/internal.h > +++ b/mm/internal.h > @@ -585,6 +585,32 @@ extern long faultin_vma_page_range(struct vm_area_struct *vma, > bool write, int *locked); > extern bool mlock_future_ok(struct mm_struct *mm, unsigned long flags, > unsigned long bytes); > + > +static inline bool > +folio_in_range(struct folio *folio, struct vm_area_struct *vma, > + unsigned long start, unsigned long end) Is there a caller that's not "folio_in_range(folio, vma, vma->vm_start, vma->vm_end)"? If not, then just "folio_within_vma(folio, vma)" or a wrapper on top of folio_in_range().
On 7/8/2023 1:47 PM, Yu Zhao wrote: > On Fri, Jul 7, 2023 at 10:52 AM Yin Fengwei <fengwei.yin@intel.com> wrote: >> >> It will be used to check whether the folio is mapped to specific >> VMA and whether the mapping address of folio is in the range. >> >> Signed-off-by: Yin Fengwei <fengwei.yin@intel.com> >> --- >> mm/internal.h | 26 ++++++++++++++++++++++++++ >> 1 file changed, 26 insertions(+) >> >> diff --git a/mm/internal.h b/mm/internal.h >> index f1276d90484ad..66117523d7d71 100644 >> --- a/mm/internal.h >> +++ b/mm/internal.h >> @@ -585,6 +585,32 @@ extern long faultin_vma_page_range(struct vm_area_struct *vma, >> bool write, int *locked); >> extern bool mlock_future_ok(struct mm_struct *mm, unsigned long flags, >> unsigned long bytes); >> + >> +static inline bool >> +folio_in_range(struct folio *folio, struct vm_area_struct *vma, >> + unsigned long start, unsigned long end) > > Is there a caller that's not "folio_in_range(folio, vma, > vma->vm_start, vma->vm_end)"? I believe madvise() will use start/end from user space instead of vma start/end. > > If not, then just "folio_within_vma(folio, vma)" or a wrapper on top > of folio_in_range(). Will add folio_within_vma() based on folio_in_range(). Thanks. Regards Yin, Fengwei
diff --git a/mm/internal.h b/mm/internal.h index f1276d90484ad..66117523d7d71 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -585,6 +585,32 @@ extern long faultin_vma_page_range(struct vm_area_struct *vma, bool write, int *locked); extern bool mlock_future_ok(struct mm_struct *mm, unsigned long flags, unsigned long bytes); + +static inline bool +folio_in_range(struct folio *folio, struct vm_area_struct *vma, + unsigned long start, unsigned long end) +{ + pgoff_t pgoff, addr; + unsigned long vma_pglen = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; + + VM_WARN_ON_FOLIO(folio_test_ksm(folio), folio); + if (start < vma->vm_start) + start = vma->vm_start; + + if (end > vma->vm_end) + end = vma->vm_end; + + pgoff = folio_pgoff(folio); + + /* if folio start address is not in vma range */ + if (pgoff < vma->vm_pgoff || pgoff > vma->vm_pgoff + vma_pglen) + return false; + + addr = vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); + + return ((addr >= start) && (addr + folio_size(folio) <= end)); +} + /* * mlock_vma_folio() and munlock_vma_folio(): * should be called with vma's mmap_lock held for read or write,
It will be used to check whether the folio is mapped to specific VMA and whether the mapping address of folio is in the range. Signed-off-by: Yin Fengwei <fengwei.yin@intel.com> --- mm/internal.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)