• Mike Kravetz's avatar
    hugetlb: be sure to free demoted CMA pages to CMA · a01f4390
    Mike Kravetz authored
    When huge page demotion is fully implemented, gigantic pages can be
    demoted to a smaller huge page size.  For example, on x86 a 1G page can
    be demoted to 512 2M pages.  However, gigantic pages can potentially be
    allocated from CMA.  If a gigantic page which was allocated from CMA is
    demoted, the corresponding demoted pages needs to be returned to CMA.
    
    Use the new interface cma_pages_valid() to determine if a non-gigantic
    hugetlb page should be freed to CMA.  Also, clear mapping field of these
    pages as expected by cma_release.
    
    This also requires a change to CMA region creation for gigantic pages.
    CMA uses a per-region bit map to track allocations.  When setting up the
    region, you specify how many pages each bit represents.  Currently, only
    gigantic pages are allocated/freed from CMA so the region is set up such
    that one bit represents a gigantic page size allocation.
    
    With demote, a gigantic page (allocation) could be split into smaller
    size pages.  And, these smaller size pages will be freed to CMA.  So,
    since the per-region bit map needs to be set up to represent the
    smallest allocation/free size, it now needs to be set to the smallest
    huge page size which can be freed to CMA.
    
    Unfortunately, we set up the CMA region for huge pages before we set up
    huge pages sizes (hstates).  So, technically we do not know the smallest
    huge page size as this can change via command line options and
    architecture specific code.  Therefore, at region setup time we use
    HUGETLB_PAGE_ORDER as the smallest possible huge page size that can be
    given back to CMA.  It is possible that this value is sub-optimal for
    some architectures/config options.  If needed, this can be addressed in
    follow on work.
    
    Link: https://lkml.kernel.org/r/20211007181918.136982-4-mike.kravetz@oracle.comSigned-off-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Cc: "Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Muchun Song <songmuchun@bytedance.com>
    Cc: Naoya Horiguchi <naoya.horiguchi@linux.dev>
    Cc: Nghia Le <nghialm78@gmail.com>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Zi Yan <ziy@nvidia.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a01f4390
hugetlb.c 181 KB