Re: [RFC PATCH v2 15/19] mm/gup: Introduce vaddr_pin_pages()

Ira Weiny
2019-08-12T21:01:20Z

On Sun, Aug 11, 2019 at 04:07:23PM -0700, John Hubbard wrote:
> On 8/9/19 3:58 PM, ira.weiny@intel.com wrote:
> > From: Ira Weiny <ira.weiny@intel.com>
> >
> > The addition of FOLL_LONGTERM has taken on additional meaning for CMA
> > pages.
> >
> > In addition subsystems such as RDMA require new information to be passed
> > to the GUP interface to track file owning information. As such a simple
> > FOLL_LONGTERM flag is no longer sufficient for these users to pin pages.
> >
> > Introduce a new GUP like call which takes the newly introduced vaddr_pin
> > information. Failure to pass the vaddr_pin object back to a vaddr_put*
> > call will result in a failure if pins were created on files during the
> > pin operation.
> >
> > Signed-off-by: Ira Weiny <ira.weiny@intel.com>
> >
>
> I'm creating a new call site conversion series, to replace the
> "put_user_pages(): miscellaneous call sites" series. This uses
> vaddr_pin_pages*() where appropriate. So it's based on your series here.
>
> btw, while doing that, I noticed one more typo while re-reading some of the comments.
> Thought you probably want to collect them all for the next spin. Below...
>
> > ---
> > Changes from list:
> > Change to vaddr_put_pages_dirty_lock
> > Change to vaddr_unpin_pages_dirty_lock
> >
> > include/linux/mm.h | 5 ++++
> > mm/gup.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++
> > 2 files changed, 64 insertions(+)
> >
> > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > index 657c947bda49..90c5802866df 100644
> > --- a/include/linux/mm.h
> > +++ b/include/linux/mm.h
> > @@ -1603,6 +1603,11 @@ int account_locked_vm(struct mm_struct *mm, unsigned long pages, bool inc);
> > int __account_locked_vm(struct mm_struct *mm, unsigned long pages, bool inc,
> > struct task_struct *task, bool bypass_rlim);
> >
> > +long vaddr_pin_pages(unsigned long addr, unsigned long nr_pages,
> > + unsigned int gup_flags, struct page **pages,
> > + struct vaddr_pin *vaddr_pin);
> > +void vaddr_unpin_pages_dirty_lock(struct page **pages, unsigned long nr_pages,
> > + struct vaddr_pin *vaddr_pin, bool make_dirty);
> > bool mapping_inode_has_layout(struct vaddr_pin *vaddr_pin, struct page *page);
> >
> > /* Container for pinned pfns / pages */
> > diff --git a/mm/gup.c b/mm/gup.c
> > index eeaa0ddd08a6..6d23f70d7847 100644
> > --- a/mm/gup.c
> > +++ b/mm/gup.c
> > @@ -2536,3 +2536,62 @@ int get_user_pages_fast(unsigned long start, int nr_pages,
> > return ret;
> > }
> > EXPORT_SYMBOL_GPL(get_user_pages_fast);
> > +
> > +/**
> > + * vaddr_pin_pages pin pages by virtual address and return the pages to the
> > + * user.
> > + *
> > + * @addr, start address
> > + * @nr_pages, number of pages to pin
> > + * @gup_flags, flags to use for the pin
> > + * @pages, array of pages returned
> > + * @vaddr_pin, initalized meta information this pin is to be associated
>
> Typo:
> initialized

Thanks fixed.
Ira

>
>
> thanks,
> --
> John Hubbard
> NVIDIA