As for FOLL_LONGTERM, it is checked in the slow path __gup_longterm_unlocked(). But it is not checked in the fast path, which means a possible leak of CMA page to longterm pinned requirement through this crack.
Place a check in the fast path. Signed-off-by: Pingfan Liu <kernelf...@gmail.com> Cc: Ira Weiny <ira.we...@intel.com> Cc: Andrew Morton <a...@linux-foundation.org> Cc: Mike Rapoport <r...@linux.ibm.com> Cc: Dan Williams <dan.j.willi...@intel.com> Cc: Matthew Wilcox <wi...@infradead.org> Cc: John Hubbard <jhubb...@nvidia.com> Cc: "Aneesh Kumar K.V" <aneesh.ku...@linux.ibm.com> Cc: Keith Busch <keith.bu...@intel.com> Cc: linux-kernel@vger.kernel.org --- mm/gup.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/mm/gup.c b/mm/gup.c index f173fcb..00feab3 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -2235,6 +2235,18 @@ int get_user_pages_fast(unsigned long start, int nr_pages, local_irq_enable(); ret = nr; } +#if defined(CONFIG_CMA) + if (unlikely(gup_flags & FOLL_LONGTERM)) { + int i, j; + + for (i = 0; i < nr; i++) + if (is_migrate_cma_page(pages[i])) { + for (j = i; j < nr; j++) + put_page(pages[j]); + nr = i; + } + } +#endif if (nr < nr_pages) { /* Try to get the remaining pages with get_user_pages */ -- 2.7.5