• Mike Kravetz's avatar
    hugetlb: don't pass page cache pages to restore_reserve_on_error · c7b1850d
    Mike Kravetz authored
    syzbot hit kernel BUG at fs/hugetlbfs/inode.c:532 as described in [1].
    This BUG triggers if the HPageRestoreReserve flag is set on a page in
    the page cache.  It should never be set, as the routine
    huge_add_to_page_cache explicitly clears the flag after adding a page to
    the cache.
    
    The only code other than huge page allocation which sets the flag is
    restore_reserve_on_error.  It will potentially set the flag in rare out
    of memory conditions.  syzbot was injecting errors to cause memory
    allocation errors which exercised this specific path.
    
    The code in restore_reserve_on_error is doing the right thing.  However,
    there are instances where pages in the page cache were being passed to
    restore_reserve_on_error.  This is incorrect, as once a page goes into
    the cache reservation information will not be modified for the page
    until it is removed from the cache.  Error paths do not remove pages
    from the cache, so even in the case of error, the page will remain in
    the cache and no reservation adjustment is needed.
    
    Modify routines that potentially call restore_reserve_on_error with a
    page cache page to no longer do so.
    
    Note on fixes tag: Prior to commit 846be085 ("mm/hugetlb: expand
    restore_reserve_on_error functionality") the routine would not process
    page cache pages because the HPageRestoreReserve flag is not set on such
    pages.  Therefore, this issue could not be trigggered.  The code added
    by commit 846be085 ("mm/hugetlb: expand restore_reserve_on_error
    functionality") is needed and correct.  It exposed incorrect calls to
    restore_reserve_on_error which is the root cause addressed by this
    commit.
    
    [1] https://lore.kernel.org/linux-mm/00000000000050776d05c9b7c7f0@google.com/
    
    Link: https://lkml.kernel.org/r/20210818213304.37038-1-mike.kravetz@oracle.com
    Fixes: 846be085 ("mm/hugetlb: expand restore_reserve_on_error functionality")
    Signed-off-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Reported-by: <syzbot+67654e51e54455f1c585@syzkaller.appspotmail.com>
    Cc: Mina Almasry <almasrymina@google.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Muchun Song <songmuchun@bytedance.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Naoya Horiguchi <naoya.horiguchi@linux.dev>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    c7b1850d
hugetlb.c 174 KB