The patch titled Subject: mm/gup: fix omission of check on FOLL_LONGTERM in get_user_pages_fast() has been added to the -mm tree. Its filename is mm-gup-fix-omission-of-check-on-foll_longterm-in-get_user_pages_fast.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/mm-gup-fix-omission-of-check-on-foll_longterm-in-get_user_pages_fast.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/mm-gup-fix-omission-of-check-on-foll_longterm-in-get_user_pages_fast.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Pingfan Liu <kernelfans@xxxxxxxxx> Subject: mm/gup: fix omission of check on FOLL_LONGTERM in get_user_pages_fast() FOLL_LONGTERM is checked in the slow path via __gup_longterm_unlocked(). But it is not checked in the fast path, which means a possible leak of CMA pages to longterm pinned requirement through this crack. Place a check in the fast path. Link: http://lkml.kernel.org/r/1559725820-26138-1-git-send-email-kernelfans@xxxxxxxxx Signed-off-by: Pingfan Liu <kernelfans@xxxxxxxxx> Reviewed-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Cc: Ira Weiny <ira.weiny@xxxxxxxxx> Cc: Mike Rapoport <rppt@xxxxxxxxxxxxx> Cc: Dan Williams <dan.j.williams@xxxxxxxxx> Cc: Matthew Wilcox <willy@xxxxxxxxxxxxx> Cc: John Hubbard <jhubbard@xxxxxxxxxx> Cc: "Aneesh Kumar K.V" <aneesh.kumar@xxxxxxxxxxxxx> Cc: Keith Busch <keith.busch@xxxxxxxxx> Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/gup.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) --- a/mm/gup.c~mm-gup-fix-omission-of-check-on-foll_longterm-in-get_user_pages_fast +++ a/mm/gup.c @@ -2197,6 +2197,26 @@ static int __gup_longterm_unlocked(unsig return ret; } +#ifdef CONFIG_CMA +static inline int reject_cma_pages(int nr_pinned, struct page **pages) +{ + int i; + + for (i = 0; i < nr_pinned; i++) + if (is_migrate_cma_page(pages[i])) { + put_user_pages(pages + i, nr_pinned - i); + return i; + } + + return nr_pinned; +} +#else +static inline int reject_cma_pages(int nr_pinned, struct page **pages) +{ + return nr_pinned; +} +#endif + /** * get_user_pages_fast() - pin user pages in memory * @start: starting user address @@ -2237,6 +2257,9 @@ int get_user_pages_fast(unsigned long st ret = nr; } + if (unlikely(gup_flags & FOLL_LONGTERM) && nr) + nr = reject_cma_pages(nr, pages); + if (nr < nr_pages) { /* Try to get the remaining pages with get_user_pages */ start += nr << PAGE_SHIFT; _ Patches currently in -mm which might be from kernelfans@xxxxxxxxx are mm-gup-fix-omission-of-check-on-foll_longterm-in-get_user_pages_fast.patch mm-gup-rename-nr-as-nr_pinned-in-get_user_pages_fast.patch