Re: [PATCH v2] mm/gup: fix comments to pin_user_pages_*()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 4/21/22 18:58, Yury Norov wrote:
pin_user_pages API forces FOLL_PIN in gup_flags, which means that the
API requires struct page **pages to be provided (not NULL). However, the
comment to pin_user_pages() clearly allows for passing in a NULL @pages
argument.

Remove the incorrect comments, and add WARN_ON_ONCE(!pages) calls to
enforce the API.

It has been independently spotted by Minchan Kim and confirmed with
John Hubbard:

https://lore.kernel.org/all/YgWA0ghrrzHONehH@xxxxxxxxxx/

CC: Minchan Kim <minchan@xxxxxxxxxx>
CC: John Hubbard <jhubbard@xxxxxxxxxx>
Signed-off-by: Yury Norov (NVIDIA) <yury.norov@xxxxxxxxx>
---

Looks good. Please feel free to add:

Reviewed-by: John Hubbard <jhubbard@xxxxxxxxxx>


thanks,
--
John Hubbard
NVIDIA


v1: https://lore.kernel.org/linux-mm/92a2715c-3c98-251d-9195-872d1cf01f9d@xxxxxxxxxx/#t
v2: Remove comment for WARN_ON_ONCE() and reword commit message.
mm/gup.c | 21 +++++++++++++++++----
  1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/mm/gup.c b/mm/gup.c
index f598a037eb04..b1e96b6192de 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -2871,6 +2871,9 @@ int pin_user_pages_fast(unsigned long start, int nr_pages,
  	if (WARN_ON_ONCE(gup_flags & FOLL_GET))
  		return -EINVAL;
+ if (WARN_ON_ONCE(!pages))
+		return -EINVAL;
+
  	gup_flags |= FOLL_PIN;
  	return internal_get_user_pages_fast(start, nr_pages, gup_flags, pages);
  }
@@ -2893,6 +2896,9 @@ int pin_user_pages_fast_only(unsigned long start, int nr_pages,
  	 */
  	if (WARN_ON_ONCE(gup_flags & FOLL_GET))
  		return 0;
+
+	if (WARN_ON_ONCE(!pages))
+		return 0;
  	/*
  	 * FOLL_FAST_ONLY is required in order to match the API description of
  	 * this routine: no fall back to regular ("slow") GUP.
@@ -2920,8 +2926,7 @@ EXPORT_SYMBOL_GPL(pin_user_pages_fast_only);
   * @nr_pages:	number of pages from start to pin
   * @gup_flags:	flags modifying lookup behaviour
   * @pages:	array that receives pointers to the pages pinned.
- *		Should be at least nr_pages long. Or NULL, if caller
- *		only intends to ensure the pages are faulted in.
+ *		Should be at least nr_pages long.
   * @vmas:	array of pointers to vmas corresponding to each page.
   *		Or NULL if the caller does not require them.
   * @locked:	pointer to lock flag indicating whether lock is held and
@@ -2944,6 +2949,9 @@ long pin_user_pages_remote(struct mm_struct *mm,
  	if (WARN_ON_ONCE(gup_flags & FOLL_GET))
  		return -EINVAL;
+ if (WARN_ON_ONCE(!pages))
+		return -EINVAL;
+
  	gup_flags |= FOLL_PIN;
  	return __get_user_pages_remote(mm, start, nr_pages, gup_flags,
  				       pages, vmas, locked);
@@ -2957,8 +2965,7 @@ EXPORT_SYMBOL(pin_user_pages_remote);
   * @nr_pages:	number of pages from start to pin
   * @gup_flags:	flags modifying lookup behaviour
   * @pages:	array that receives pointers to the pages pinned.
- *		Should be at least nr_pages long. Or NULL, if caller
- *		only intends to ensure the pages are faulted in.
+ *		Should be at least nr_pages long.
   * @vmas:	array of pointers to vmas corresponding to each page.
   *		Or NULL if the caller does not require them.
   *
@@ -2976,6 +2983,9 @@ long pin_user_pages(unsigned long start, unsigned long nr_pages,
  	if (WARN_ON_ONCE(gup_flags & FOLL_GET))
  		return -EINVAL;
+ if (WARN_ON_ONCE(!pages))
+		return -EINVAL;
+
  	gup_flags |= FOLL_PIN;
  	return __gup_longterm_locked(current->mm, start, nr_pages,
  				     pages, vmas, gup_flags);
@@ -2994,6 +3004,9 @@ long pin_user_pages_unlocked(unsigned long start, unsigned long nr_pages,
  	if (WARN_ON_ONCE(gup_flags & FOLL_GET))
  		return -EINVAL;
+ if (WARN_ON_ONCE(!pages))
+		return -EINVAL;
+
  	gup_flags |= FOLL_PIN;
  	return get_user_pages_unlocked(start, nr_pages, pages, gup_flags);
  }





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux