• David Stevens's avatar
    mm/khugepaged: maintain page cache uptodate flag · a2e17cc2
    David Stevens authored
    Make sure that collapse_file doesn't interfere with checking the uptodate
    flag in the page cache by only inserting hpage into the page cache after
    it has been updated and marked uptodate.  This is achieved by simply not
    replacing present pages with hpage when iterating over the target range.
    
    The present pages are already locked, so replacing them with the locked
    hpage before the collapse is finalized is unnecessary.  However, it is
    necessary to stop freezing the present pages after validating them, since
    leaving long-term frozen pages in the page cache can lead to deadlocks. 
    Simply checking the reference count is sufficient to ensure that there are
    no long-term references hanging around that would the collapse would
    break.  Similar to hpage, there is no reason that the present pages
    actually need to be frozen in addition to being locked.
    
    This fixes a race where folio_seek_hole_data would mistake hpage for an
    fallocated but unwritten page.  This race is visible to userspace via data
    temporarily disappearing from SEEK_DATA/SEEK_HOLE.  This also fixes a
    similar race where pages could temporarily disappear from mincore.
    
    Link: https://lkml.kernel.org/r/20230404120117.2562166-5-stevensd@google.com
    Fixes: f3f0e1d2 ("khugepaged: add support of collapse for tmpfs/shmem pages")
    Signed-off-by: default avatarDavid Stevens <stevensd@chromium.org>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Jiaqi Yan <jiaqiyan@google.com>
    Cc: "Kirill A. Shutemov" <kirill@shutemov.name>
    Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Yang Shi <shy828301@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    a2e17cc2
khugepaged.c 75.9 KB