[PATCH V2 3/7] mm/gup: Change GUP fast to use flags rather than a write 'bool'
Ira Weiny
ira.weiny at intel.com
Thu Feb 14 10:52:01 AEDT 2019
On Wed, Feb 13, 2019 at 04:11:10PM -0700, Jason Gunthorpe wrote:
> On Wed, Feb 13, 2019 at 03:04:51PM -0800, ira.weiny at intel.com wrote:
> > From: Ira Weiny <ira.weiny at intel.com>
> >
> > To facilitate additional options to get_user_pages_fast() change the
> > singular write parameter to be gup_flags.
>
> So now we have:
>
> long get_user_pages_unlocked(unsigned long start, unsigned long nr_pages,
> struct page **pages, unsigned int gup_flags);
>
> and
>
> int get_user_pages_fast(unsigned long start, int nr_pages,
> unsigned int gup_flags, struct page **pages)
>
> Does this make any sense? At least the arguments should be in the same
> order, I think.
Yes... and no. see below.
>
> Also this comment:
> /*
> * get_user_pages_unlocked() is suitable to replace the form:
> *
> * down_read(&mm->mmap_sem);
> * get_user_pages(tsk, mm, ..., pages, NULL);
> * up_read(&mm->mmap_sem);
> *
> * with:
> *
> * get_user_pages_unlocked(tsk, mm, ..., pages);
> *
> * It is functionally equivalent to get_user_pages_fast so
> * get_user_pages_fast should be used instead if specific gup_flags
> * (e.g. FOLL_FORCE) are not required.
> */
>
> Needs some attention as the recommendation is now nonsense.
IMO they are not functionally equivalent.
We can't remove *_unlocked() as it is used as both a helper for the arch
specific *_fast() calls, _and_ in drivers. Again I don't know the history here
but it could be that the drivers should never have used the call in the first
place??? Or been converted at some point?
I could change the comment to be something like
/*
* get_user_pages_unlocked() is only to be used by arch specific
* get_user_pages_fast() calls. Drivers should be calling
* get_user_pages_fast()
*/
Instead of the current comment.
And change the drivers to get_user_pages_fast().
However, I'm not sure if these drivers need the FOLL_TOUCH flag which
*_unlocked() adds for them. And adding FOLL_TOUCH to *_fast() is not going to
give the same functionality.
It _looks_ like we can add FOLL_TOUCH functionality to the fast path in the
generic code. I'm not sure about the arch's.
If we did that then we can have those drivers use FOLL_TOUCH or not in *_fast()
if they want/need.
>
> Honestly a proper explanation of why two functions exist would be
> great at this point :)
I've not researched it. I do agree that there seems to be a lot of calls in
this file and the differences are subtle.
Ira
>
> Jason
More information about the Linuxppc-dev
mailing list