• M
    hugetlbfs: fix potential over/underflow setting node specific nr_hugepages · 6168fe8b
    Mike Kravetz 提交于
    mainline inclusion
    from mainline-5.1
    commit 3ca7a26777dc05b0eb72e233a26400c227ac5d58
    category: bugfix
    bugzilla: NA
    CVE: NA
    
    ------------------------------
    
    The number of node specific huge pages can be set via a file such as:
    /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
    When a node specific value is specified, the global number of huge pages
    must also be adjusted.  This adjustment is calculated as the specified
    node specific value + (global value - current node value).  If the node
    specific value provided by the user is large enough, this calculation
    could overflow an unsigned long leading to a smaller than expected number
    of huge pages.
    
    To fix, check the calculation for overflow.  If overflow is detected, use
    ULONG_MAX as the requested value.  This is inline with the user request to
    allocate as many huge pages as possible.
    
    It was also noticed that the above calculation was done outside the
    hugetlb_lock.  Therefore, the values could be inconsistent and result in
    underflow.  To fix, the calculation is moved within the routine
    set_max_huge_pages() where the lock is held.
    
    In addition, the code in __nr_hugepages_store_common() which tries to
    handle the case of not being able to allocate a node mask would likely
    result in incorrect behavior.  Luckily, it is very unlikely we will ever
    take this path.  If we do, simply return ENOMEM.
    
    Link: http://lkml.kernel.org/r/8f3aede3-c07e-ac15-1577-7667e5b70d2f@oracle.comSigned-off-by: NMike Kravetz <mike.kravetz@oracle.com>
    Reported-by: NJing Xiangfeng <jingxiangfeng@huawei.com>
    Reviewed-by: NOscar Salvador <osalvador@suse.de>
    Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Jing Xiangfeng <jingxiangfeng@huawei.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Alexandre Ghiti <alex@ghiti.fr>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NStephen Rothwell <sfr@canb.auug.org.au>
    Conflicts:
        mm/hugetlb.c
    Signed-off-by: NJing Xiangfeng <jingxiangfeng@huawei.com>
    Reviewed-by: Nzhong jiang <zhongjiang@huawei.com>
    Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
    6168fe8b
hugetlb.c 133.9 KB