• Jason Gunthorpe's avatar
    mm/gup: combine put_compound_head() and unpin_user_page() · 4509b42c
    Jason Gunthorpe authored
    These functions accomplish the same thing but have different
    implementations.
    
    unpin_user_page() has a bug where it calls mod_node_page_state() after
    calling put_page() which creates a risk that the page could have been
    hot-uplugged from the system.
    
    Fix this by using put_compound_head() as the only implementation.
    
    __unpin_devmap_managed_user_page() and related can be deleted as well in
    favour of the simpler, but slower, version in put_compound_head() that has
    an extra atomic page_ref_sub, but always calls put_page() which internally
    contains the special devmap code.
    
    Move put_compound_head() to be directly after try_grab_compound_head() so
    people can find it in future.
    
    Link: https://lkml.kernel.org/r/0-v1-6730d4ee0d32+40e6-gup_combine_put_jgg@nvidia.com
    Fixes: 1970dc6f ("mm/gup: /proc/vmstat: pin_user_pages (FOLL_PIN) reporting")
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Reviewed-by: default avatarJohn Hubbard <jhubbard@nvidia.com>
    Reviewed-by: default avatarIra Weiny <ira.weiny@intel.com>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    CC: Joao Martins <joao.m.martins@oracle.com>
    CC: Jonathan Corbet <corbet@lwn.net>
    CC: Dan Williams <dan.j.williams@intel.com>
    CC: Dave Chinner <david@fromorbit.com>
    CC: Christoph Hellwig <hch@infradead.org>
    CC: Jane Chu <jane.chu@oracle.com>
    CC: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
    CC: Michal Hocko <mhocko@suse.com>
    CC: Mike Kravetz <mike.kravetz@oracle.com>
    CC: Shuah Khan <shuah@kernel.org>
    CC: Muchun Song <songmuchun@bytedance.com>
    CC: Vlastimil Babka <vbabka@suse.cz>
    CC: Matthew Wilcox <willy@infradead.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    4509b42c
gup.c 82.8 KB