• David Howells's avatar
    mm: merge folio_has_private()/filemap_release_folio() call pairs · 0201ebf2
    David Howells authored
    Patch series "mm, netfs, fscache: Stop read optimisation when folio
    removed from pagecache", v7.
    
    This fixes an optimisation in fscache whereby we don't read from the cache
    for a particular file until we know that there's data there that we don't
    have in the pagecache.  The problem is that I'm no longer using PG_fscache
    (aka PG_private_2) to indicate that the page is cached and so I don't get
    a notification when a cached page is dropped from the pagecache.
    
    The first patch merges some folio_has_private() and
    filemap_release_folio() pairs and introduces a helper,
    folio_needs_release(), to indicate if a release is required.
    
    The second patch is the actual fix.  Following Willy's suggestions[1], it
    adds an AS_RELEASE_ALWAYS flag to an address_space that will make
    filemap_release_folio() always call ->release_folio(), even if
    PG_private/PG_private_2 aren't set.  folio_needs_release() is altered to
    add a check for this.
    
    
    This patch (of 2):
    
    Make filemap_release_folio() check folio_has_private().  Then, in most
    cases, where a call to folio_has_private() is immediately followed by a
    call to filemap_release_folio(), we can get rid of the test in the pair.
    
    There are a couple of sites in mm/vscan.c that this can't so easily be
    done.  In shrink_folio_list(), there are actually three cases (something
    different is done for incompletely invalidated buffers), but
    filemap_release_folio() elides two of them.
    
    In shrink_active_list(), we don't have have the folio lock yet, so the
    check allows us to avoid locking the page unnecessarily.
    
    A wrapper function to check if a folio needs release is provided for those
    places that still need to do it in the mm/ directory.  This will acquire
    additional parts to the condition in a future patch.
    
    After this, the only remaining caller of folio_has_private() outside of
    mm/ is a check in fuse.
    
    Link: https://lkml.kernel.org/r/20230628104852.3391651-1-dhowells@redhat.com
    Link: https://lkml.kernel.org/r/20230628104852.3391651-2-dhowells@redhat.comReported-by: default avatarRohith Surabattula <rohiths.msft@gmail.com>
    Suggested-by: default avatarMatthew Wilcox <willy@infradead.org>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Steve French <sfrench@samba.org>
    Cc: Shyam Prasad N <nspmangalore@gmail.com>
    Cc: Rohith Surabattula <rohiths.msft@gmail.com>
    Cc: Dave Wysochanski <dwysocha@redhat.com>
    Cc: Dominique Martinet <asmadeus@codewreck.org>
    Cc: Ilya Dryomov <idryomov@gmail.com>
    Cc: "Theodore Ts'o" <tytso@mit.edu>
    Cc: Andreas Dilger <adilger.kernel@dilger.ca>
    Cc: Xiubo Li <xiubli@redhat.com>
    Cc: Jingbo Xu <jefflexu@linux.alibaba.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    0201ebf2
internal.h 34.3 KB