mm/gup: protect unpin_user_pages() against npages==-ERRNO
As suggested by Dan Carpenter, fortify unpin_user_pages() just a bit, against a typical caller mistake: check if the npages arg is really a -ERRNO value, which would blow up the unpinning loop: WARN and return. If this new WARN_ON() fires, then the system *might* be leaking pages (by leaving them pinned), but probably not. More likely, gup/pup returned a hard -ERRNO error to the caller, who erroneously passed it here. Signed-off-by: John Hubbard <jhubbard@nvidia.com> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Cc: Ira Weiny <ira.weiny@intel.com> Cc: Souptick Joarder <jrdr.linux@gmail.com> Link: https://lkml.kernel.org/r/20200917065706.409079-1-jhubbard@nvidia.com Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
447f3e45c1
commit
146608bb75
7
mm/gup.c
7
mm/gup.c
|
@ -328,6 +328,13 @@ void unpin_user_pages(struct page **pages, unsigned long npages)
|
|||
{
|
||||
unsigned long index;
|
||||
|
||||
/*
|
||||
* If this WARN_ON() fires, then the system *might* be leaking pages (by
|
||||
* leaving them pinned), but probably not. More likely, gup/pup returned
|
||||
* a hard -ERRNO error to the caller, who erroneously passed it here.
|
||||
*/
|
||||
if (WARN_ON(IS_ERR_VALUE(npages)))
|
||||
return;
|
||||
/*
|
||||
* TODO: this can be optimized for huge pages: if a series of pages is
|
||||
* physically contiguous and part of the same compound page, then a
|
||||
|
|
Loading…
Reference in New Issue