• Rafael Aquini's avatar
    mm: fix negative commitlimit when gigantic hugepages are allocated · b0320c7b
    Rafael Aquini authored
    When 1GB hugepages are allocated on a system, free(1) reports less
    available memory than what really is installed in the box.  Also, if the
    total size of hugepages allocated on a system is over half of the total
    memory size, CommitLimit becomes a negative number.
    
    The problem is that gigantic hugepages (order > MAX_ORDER) can only be
    allocated at boot with bootmem, thus its frames are not accounted to
    'totalram_pages'.  However, they are accounted to hugetlb_total_pages()
    
    What happens to turn CommitLimit into a negative number is this
    calculation, in fs/proc/meminfo.c:
    
            allowed = ((totalram_pages - hugetlb_total_pages())
                    * sysctl_overcommit_ratio / 100) + total_swap_pages;
    
    A similar calculation occurs in __vm_enough_memory() in mm/mmap.c.
    
    Also, every vm statistic which depends on 'totalram_pages' will render
    confusing values, as if system were 'missing' some part of its memory.
    
    Impact of this bug:
    
    When gigantic hugepages are allocated and sysctl_overcommit_memory ==
    OVERCOMMIT_NEVER.  In a such situation, __vm_enough_memory() goes through
    the mentioned 'allowed' calculation and might end up mistakenly returning
    -ENOMEM, thus forcing the system to start reclaiming pages earlier than it
    would be ususal, and this could cause detrimental impact to overall
    system's performance, depending on the workload.
    
    Besides the aforementioned scenario, I can only think of this causing
    annoyances with memory reports from /proc/meminfo and free(1).
    
    [akpm@linux-foundation.org: standardize comment layout]
    Reported-by: default avatarRuss Anderson <rja@sgi.com>
    Signed-off-by: default avatarRafael Aquini <aquini@linux.com>
    Acked-by: default avatarRuss Anderson <rja@sgi.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    b0320c7b
hugetlb.c 76.2 KB