• Linus Torvalds's avatar
    Revert "mm/gup: remove try_get_page(), call try_get_compound_head() directly" · cd1adf1b
    Linus Torvalds authored
    This reverts commit 9857a17f.
    
    That commit was completely broken, and I should have caught on to it
    earlier.  But happily, the kernel test robot noticed the breakage fairly
    quickly.
    
    The breakage is because "try_get_page()" is about avoiding the page
    reference count overflow case, but is otherwise the exact same as a
    plain "get_page()".
    
    In contrast, "try_get_compound_head()" is an entirely different beast,
    and uses __page_cache_add_speculative() because it's not just about the
    page reference count, but also about possibly racing with the underlying
    page going away.
    
    So all the commentary about how
    
     "try_get_page() has fallen a little behind in terms of maintenance,
      try_get_compound_head() handles speculative page references more
      thoroughly"
    
    was just completely wrong: yes, try_get_compound_head() handles
    speculative page references, but the point is that try_get_page() does
    not, and must not.
    
    So there's no lack of maintainance - there are fundamentally different
    semantics.
    
    A speculative page reference would be entirely wrong in "get_page()",
    and it's entirely wrong in "try_get_page()".  It's not about
    speculation, it's purely about "uhhuh, you can't get this page because
    you've tried to increment the reference count too much already".
    
    The reason the kernel test robot noticed this bug was that it hit the
    VM_BUG_ON() in __page_cache_add_speculative(), which is all about
    verifying that the context of any speculative page access is correct.
    But since that isn't what try_get_page() is all about, the VM_BUG_ON()
    tests things that are not correct to test for try_get_page().
    Reported-by: default avatarkernel test robot <oliver.sang@intel.com>
    Cc: John Hubbard <jhubbard@nvidia.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    cd1adf1b
gup.c 86 KB