linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: John Hubbard <jhubbard@nvidia.com>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>,
	David Hildenbrand <david@redhat.com>,
	David Howells <dhowells@redhat.com>,
	Christoph Hellwig <hch@infradead.org>, <linux-mm@kvack.org>,
	"Mike Rapoport (IBM)" <rppt@kernel.org>
Subject: Re: [PATCH v2 09/13] mm/gup: make locked never NULL in the internal GUP functions
Date: Tue, 24 Jan 2023 19:00:39 -0800	[thread overview]
Message-ID: <2fe84a70-3ea5-25a2-31ee-e3b26816ad9f@nvidia.com> (raw)
In-Reply-To: <9-v2-987e91b59705+36b-gup_tidy_jgg@nvidia.com>

On 1/24/23 12:34, Jason Gunthorpe wrote:
> Now that NULL locked doesn't have a special meaning we can just make it
> non-NULL in all cases and remove the special tests.
> 
> get_user_pages() and pin_user_pages() can safely pass in a locked = 1
> 
> get_user_pages_remote) and pin_user_pages_remote() can swap in a local
> variable for locked if NULL is passed.
> 
> Remove all the NULL checks.
> 
> Acked-by: Mike Rapoport (IBM) <rppt@kernel.org>
> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
> ---
>   mm/gup.c | 51 ++++++++++++++++++++++++++++++---------------------
>   1 file changed, 30 insertions(+), 21 deletions(-)


Reviewed-by: John Hubbard <jhubbard@nvidia.com>

thanks,
-- 
John Hubbard
NVIDIA

> 
> diff --git a/mm/gup.c b/mm/gup.c
> index 37849fcd962e9a..932a2339613c2f 100644
> --- a/mm/gup.c
> +++ b/mm/gup.c
> @@ -879,9 +879,9 @@ static int get_gate_page(struct mm_struct *mm, unsigned long address,
>   }
>   
>   /*
> - * mmap_lock must be held on entry.  If @locked != NULL and *@flags
> - * does not include FOLL_NOWAIT, the mmap_lock may be released.  If it
> - * is, *@locked will be set to 0 and -EBUSY returned.
> + * mmap_lock must be held on entry.  If @flags has FOLL_UNLOCKABLE but not
> + * FOLL_NOWAIT, the mmap_lock may be released.  If it is, *@locked will be set
> + * to 0 and -EBUSY returned.
>    */
>   static int faultin_page(struct vm_area_struct *vma,
>   		unsigned long address, unsigned int *flags, bool unshare,
> @@ -930,8 +930,8 @@ static int faultin_page(struct vm_area_struct *vma,
>   		 * mmap lock in the page fault handler. Sanity check this.
>   		 */
>   		WARN_ON_ONCE(fault_flags & FAULT_FLAG_RETRY_NOWAIT);
> -		if (locked)
> -			*locked = 0;
> +		*locked = 0;
> +
>   		/*
>   		 * We should do the same as VM_FAULT_RETRY, but let's not
>   		 * return -EBUSY since that's not reflecting the reality of
> @@ -951,7 +951,7 @@ static int faultin_page(struct vm_area_struct *vma,
>   	}
>   
>   	if (ret & VM_FAULT_RETRY) {
> -		if (locked && !(fault_flags & FAULT_FLAG_RETRY_NOWAIT))
> +		if (!(fault_flags & FAULT_FLAG_RETRY_NOWAIT))
>   			*locked = 0;
>   		return -EBUSY;
>   	}
> @@ -1062,14 +1062,12 @@ static int check_vma_flags(struct vm_area_struct *vma, unsigned long gup_flags)
>    * appropriate) must be called after the page is finished with, and
>    * before put_page is called.
>    *
> - * If @locked != NULL, *@locked will be set to 0 when mmap_lock is
> - * released by an up_read().  That can happen if @gup_flags does not
> - * have FOLL_NOWAIT.
> + * If FOLL_UNLOCKABLE is set without FOLL_NOWAIT then the mmap_lock may
> + * be released. If this happens *@locked will be set to 0 on return.
>    *
> - * A caller using such a combination of @locked and @gup_flags
> - * must therefore hold the mmap_lock for reading only, and recognize
> - * when it's been released.  Otherwise, it must be held for either
> - * reading or writing and will not be released.
> + * A caller using such a combination of @gup_flags must therefore hold the
> + * mmap_lock for reading only, and recognize when it's been released. Otherwise,
> + * it must be held for either reading or writing and will not be released.
>    *
>    * In most cases, get_user_pages or get_user_pages_fast should be used
>    * instead of __get_user_pages. __get_user_pages should be used only if
> @@ -1121,7 +1119,7 @@ static long __get_user_pages(struct mm_struct *mm,
>   				i = follow_hugetlb_page(mm, vma, pages, vmas,
>   						&start, &nr_pages, i,
>   						gup_flags, locked);
> -				if (locked && *locked == 0) {
> +				if (!*locked) {
>   					/*
>   					 * We've got a VM_FAULT_RETRY
>   					 * and we've lost mmap_lock.
> @@ -1354,7 +1352,7 @@ static __always_inline long __get_user_pages_locked(struct mm_struct *mm,
>   	 * The internal caller expects GUP to manage the lock internally and the
>   	 * lock must be released when this returns.
>   	 */
> -	if (locked && !*locked) {
> +	if (!*locked) {
>   		if (mmap_read_lock_killable(mm))
>   			return -EAGAIN;
>   		must_unlock = true;
> @@ -1502,6 +1500,7 @@ long populate_vma_page_range(struct vm_area_struct *vma,
>   {
>   	struct mm_struct *mm = vma->vm_mm;
>   	unsigned long nr_pages = (end - start) / PAGE_SIZE;
> +	int local_locked = 1;
>   	int gup_flags;
>   	long ret;
>   
> @@ -1542,7 +1541,7 @@ long populate_vma_page_range(struct vm_area_struct *vma,
>   	 * not result in a stack expansion that recurses back here.
>   	 */
>   	ret = __get_user_pages(mm, start, nr_pages, gup_flags,
> -				NULL, NULL, locked);
> +				NULL, NULL, locked ? locked : &local_locked);
>   	lru_add_drain();
>   	return ret;
>   }
> @@ -1683,7 +1682,7 @@ static long __get_user_pages_locked(struct mm_struct *mm, unsigned long start,
>   	 * The internal caller expects GUP to manage the lock internally and the
>   	 * lock must be released when this returns.
>   	 */
> -	if (locked && !*locked) {
> +	if (!*locked) {
>   		if (mmap_read_lock_killable(mm))
>   			return -EAGAIN;
>   		must_unlock = true;
> @@ -2222,11 +2221,14 @@ long get_user_pages_remote(struct mm_struct *mm,
>   		unsigned int gup_flags, struct page **pages,
>   		struct vm_area_struct **vmas, int *locked)
>   {
> +	int local_locked = 1;
> +
>   	if (!is_valid_gup_args(pages, vmas, locked, &gup_flags,
>   			       FOLL_TOUCH | FOLL_REMOTE))
>   		return -EINVAL;
>   
> -	return __get_user_pages_locked(mm, start, nr_pages, pages, vmas, locked,
> +	return __get_user_pages_locked(mm, start, nr_pages, pages, vmas,
> +				       locked ? locked : &local_locked,
>   				       gup_flags);
>   }
>   EXPORT_SYMBOL(get_user_pages_remote);
> @@ -2261,11 +2263,13 @@ long get_user_pages(unsigned long start, unsigned long nr_pages,
>   		unsigned int gup_flags, struct page **pages,
>   		struct vm_area_struct **vmas)
>   {
> +	int locked = 1;
> +
>   	if (!is_valid_gup_args(pages, vmas, NULL, &gup_flags, FOLL_TOUCH))
>   		return -EINVAL;
>   
>   	return __get_user_pages_locked(current->mm, start, nr_pages, pages,
> -				       vmas, NULL, gup_flags);
> +				       vmas, &locked, gup_flags);
>   }
>   EXPORT_SYMBOL(get_user_pages);
>   
> @@ -3158,10 +3162,13 @@ long pin_user_pages_remote(struct mm_struct *mm,
>   			   unsigned int gup_flags, struct page **pages,
>   			   struct vm_area_struct **vmas, int *locked)
>   {
> +	int local_locked = 1;
> +
>   	if (!is_valid_gup_args(pages, vmas, locked, &gup_flags,
>   			       FOLL_PIN | FOLL_TOUCH | FOLL_REMOTE))
>   		return 0;
> -	return __gup_longterm_locked(mm, start, nr_pages, pages, vmas, locked,
> +	return __gup_longterm_locked(mm, start, nr_pages, pages, vmas,
> +				     locked ? locked : &local_locked,
>   				     gup_flags);
>   }
>   EXPORT_SYMBOL(pin_user_pages_remote);
> @@ -3187,10 +3194,12 @@ long pin_user_pages(unsigned long start, unsigned long nr_pages,
>   		    unsigned int gup_flags, struct page **pages,
>   		    struct vm_area_struct **vmas)
>   {
> +	int locked = 1;
> +
>   	if (!is_valid_gup_args(pages, vmas, NULL, &gup_flags, FOLL_PIN))
>   		return 0;
>   	return __gup_longterm_locked(current->mm, start, nr_pages,
> -				     pages, vmas, NULL, gup_flags);
> +				     pages, vmas, &locked, gup_flags);
>   }
>   EXPORT_SYMBOL(pin_user_pages);
>   



  reply	other threads:[~2023-01-25  3:01 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-24 20:34 [PATCH v2 00/13] Simplify the external interface for GUP Jason Gunthorpe
2023-01-24 20:34 ` [PATCH v2 01/13] mm/gup: have internal functions get the mmap_read_lock() Jason Gunthorpe
2023-01-25  2:11   ` John Hubbard
2023-01-25  2:52     ` John Hubbard
2023-01-25 16:38     ` Jason Gunthorpe
2023-01-25 18:48       ` John Hubbard
2023-01-24 20:34 ` [PATCH v2 02/13] mm/gup: remove obsolete FOLL_LONGTERM comment Jason Gunthorpe
2023-01-25  2:13   ` John Hubbard
2023-02-08 14:25   ` David Hildenbrand
2023-01-24 20:34 ` [PATCH v2 03/13] mm/gup: don't call __gup_longterm_locked() if FOLL_LONGTERM cannot be set Jason Gunthorpe
2023-02-08 14:26   ` David Hildenbrand
2023-01-24 20:34 ` [PATCH v2 04/13] mm/gup: move try_grab_page() to mm/internal.h Jason Gunthorpe
2023-01-25  2:15   ` John Hubbard
2023-02-08 14:26   ` David Hildenbrand
2023-01-24 20:34 ` [PATCH v2 05/13] mm/gup: simplify the external interface functions and consolidate invariants Jason Gunthorpe
2023-01-25  2:30   ` John Hubbard
2023-01-24 20:34 ` [PATCH v2 06/13] mm/gup: add an assertion that the mmap lock is locked Jason Gunthorpe
2023-01-25  2:34   ` John Hubbard
2023-01-24 20:34 ` [PATCH v2 07/13] mm/gup: remove locked being NULL from faultin_vma_page_range() Jason Gunthorpe
2023-01-25  2:38   ` John Hubbard
2023-01-24 20:34 ` [PATCH v2 08/13] mm/gup: add FOLL_UNLOCKABLE Jason Gunthorpe
2023-01-24 20:34 ` [PATCH v2 09/13] mm/gup: make locked never NULL in the internal GUP functions Jason Gunthorpe
2023-01-25  3:00   ` John Hubbard [this message]
2023-01-24 20:34 ` [PATCH v2 10/13] mm/gup: remove pin_user_pages_fast_only() Jason Gunthorpe
2023-01-24 20:34 ` [PATCH v2 11/13] mm/gup: make get_user_pages_fast_only() return the common return value Jason Gunthorpe
2023-01-24 20:34 ` [PATCH v2 12/13] mm/gup: move gup_must_unshare() to mm/internal.h Jason Gunthorpe
2023-01-25  2:41   ` John Hubbard
2023-01-26 11:29   ` David Hildenbrand
2023-01-24 20:34 ` [PATCH v2 13/13] mm/gup: move private gup FOLL_ flags to internal.h Jason Gunthorpe
2023-01-25  2:44   ` John Hubbard
2023-01-26 12:48   ` David Hildenbrand
2023-01-26 12:55     ` Jason Gunthorpe
2023-01-26 13:06       ` David Hildenbrand
2023-01-26 14:41       ` Claudio Imbrenda
2023-01-26 14:46         ` David Hildenbrand
2023-01-26 15:05           ` Jason Gunthorpe
2023-01-26 15:39             ` Claudio Imbrenda
2023-01-26 16:35               ` Jason Gunthorpe
2023-01-26 17:24                 ` Claudio Imbrenda
2023-01-30 18:21                 ` Claudio Imbrenda
2023-01-30 18:24                   ` Jason Gunthorpe
2023-02-07 11:31                     ` Claudio Imbrenda
2023-02-07 12:40                       ` Jason Gunthorpe
2023-02-06 23:46 ` [PATCH v2 00/13] Simplify the external interface for GUP Jason Gunthorpe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2fe84a70-3ea5-25a2-31ee-e3b26816ad9f@nvidia.com \
    --to=jhubbard@nvidia.com \
    --cc=apopple@nvidia.com \
    --cc=david@redhat.com \
    --cc=dhowells@redhat.com \
    --cc=hch@infradead.org \
    --cc=jgg@nvidia.com \
    --cc=linux-mm@kvack.org \
    --cc=rppt@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox