• Hugh Dickins's avatar
    huge tmpfs: SGP_NOALLOC to stop collapse_file() on race · acdd9f8e
    Hugh Dickins authored
    khugepaged's collapse_file() currently uses SGP_NOHUGE to tell
    shmem_getpage() not to try allocating a huge page, in the very unlikely
    event that a racing hole-punch removes the swapped or fallocated page as
    soon as i_pages lock is dropped.
    
    We want to consolidate shmem's huge decisions, removing SGP_HUGE and
    SGP_NOHUGE; but cannot quite persuade ourselves that it's okay to regress
    the protection in this case - Yang Shi points out that the huge page would
    remain indefinitely, charged to root instead of the intended memcg.
    
    collapse_file() should not even allocate a small page in this case: why
    proceed if someone is punching a hole?  SGP_READ is almost the right flag
    here, except that it optimizes away from a fallocated page, with NULL to
    tell caller to fill with zeroes (like a hole); whereas collapse_file()'s
    sequence relies on using a cache page.  Add SGP_NOALLOC just for this.
    
    There are too many consecutive "if (page"s there in shmem_getpage_gfp():
    group it better; and fix the outdated "bring it back from swap" comment.
    
    Link: https://lkml.kernel.org/r/1355343b-acf-4653-ef79-6aee40214ac5@google.comSigned-off-by: default avatarHugh Dickins <hughd@google.com>
    Reviewed-by: default avatarYang Shi <shy828301@gmail.com>
    Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Rik van Riel <riel@surriel.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    acdd9f8e
khugepaged.c 59.3 KB