• Pingfan Liu's avatar
    mm/gup: fix omission of check on FOLL_LONGTERM in gup fast path · df3a0a21
    Pingfan Liu authored
    FOLL_LONGTERM is a special case of FOLL_PIN.  It suggests a pin which is
    going to be given to hardware and can't move.  It would truncate CMA
    permanently and should be excluded.
    In gup slow path, where
    __gup_longterm_locked->check_and_migrate_cma_pages() handles
    FOLL_LONGTERM, but in fast path, there lacks such a check, which means a
    possible leak of CMA page to longterm pinned.
    Place a check in try_grab_compound_head() in the fast path to fix the
    leak, and if FOLL_LONGTERM happens on CMA, it will fall back to slow path
    to migrate the page.
    Some note about the check: Huge page's subpages have the same migrate type
    due to either allocation from a free_list[] or alloc_contig_range() with
    param MIGRATE_MOVABLE.  So it is enough to check on a single subpage by
    Signed-off-by: default avatarPingfan Liu <kernelfans@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    Cc: Ira Weiny <ira.weiny@intel.com>
    Cc: Mike Rapoport <rppt@linux.ibm.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: John Hubbard <jhubbard@nvidia.com>
    Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: Jason Gunthorpe <jgg@ziepe.ca>
    Link: http://lkml.kernel.org/r/1584876733-17405-3-git-send-email-kernelfans@gmail.com
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
gup.c 81.1 KB