• Rik van Riel's avatar
    mm,madvise,hugetlb: fix unexpected data loss with MADV_DONTNEED on hugetlbfs · 8ebe0a5e
    Rik van Riel authored
    A common use case for hugetlbfs is for the application to create
    memory pools backed by huge pages, which then get handed over to
    some malloc library (eg. jemalloc) for further management.
    
    That malloc library may be doing MADV_DONTNEED calls on memory
    that is no longer needed, expecting those calls to happen on
    PAGE_SIZE boundaries.
    
    However, currently the MADV_DONTNEED code rounds up any such
    requests to HPAGE_PMD_SIZE boundaries. This leads to undesired
    outcomes when jemalloc expects a 4kB MADV_DONTNEED, but 2MB of
    memory get zeroed out, instead.
    
    Use of pre-built shared libraries means that user code does not
    always know the page size of every memory arena in use.
    
    Avoid unexpected data loss with MADV_DONTNEED by rounding up
    only to PAGE_SIZE (in do_madvise), and rounding down to huge
    page granularity.
    
    That way programs will only get as much memory zeroed out as
    they requested.
    
    Link: https://lkml.kernel.org/r/20221021192805.366ad573@imladris.surriel.com
    Fixes: 90e7e7f5 ("mm: enable MADV_DONTNEED for hugetlb mappings")
    Signed-off-by: default avatarRik van Riel <riel@surriel.com>
    Reviewed-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    8ebe0a5e
madvise.c 38.2 KB