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;
|
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
|
* 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
|
* physically contiguous and part of the same compound page, then a
|
||||||
|
Loading…
Reference in New Issue
Block a user