Skip to content
  • Mike Kravetz's avatar
    hugetlbfs: on restore reserve error path retain subpool reservation · d425d0a5
    Mike Kravetz authored
    [ Upstream commit 0919e1b6 ]
    
    When a huge page is allocated, PagePrivate() is set if the allocation
    consumed a reservation.  When freeing a huge page, PagePrivate is checked.
    If set, it indicates the reservation should be restored.  PagePrivate
    being set at free huge page time mostly happens on error paths.
    
    When huge page reservations are created, a check is made to determine if
    the mapping is associated with an explicitly mounted filesystem.  If so,
    pages are also reserved within the filesystem.  The default action when
    freeing a huge page is to decrement the usage count in any associated
    explicitly mounted filesystem.  However, if the reservation is to be
    restored the reservation/use count within the filesystem should not be
    decrementd.  Otherwise, a subsequent page allocation and free for the same
    mapping location will cause the file filesystem usage to go 'negative'.
    
    Filesystem                         Size  Used Avail Use% Mounted on
    nodev                              4.0G -4.0M  4.1G    - /opt/hugepool
    
    To fix, when freeing a huge page do not adjust filesystem usage if
    PagePrivate() is set to indicate the reservation should be restored.
    
    I did not cc stable as the problem has been around since reserves were
    added to hugetlbfs and nobody has noticed.
    
    Link: http://lkml.kernel.org/r/20190328234704.27083-2-mike.kravetz@oracle.com
    
    
    Signed-off-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Reviewed-by: default avatarNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: "Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    d425d0a5