• M
    hugetlbfs: on restore reserve error path retain subpool reservation · 0919e1b6
    Mike Kravetz 提交于
    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.comSigned-off-by: NMike Kravetz <mike.kravetz@oracle.com>
    Reviewed-by: NNaoya 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: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    0919e1b6
hugetlb.c 134.6 KB