Patch "mm, mmap: limit THP alignment of anonymous mappings to PMD-aligned sizes" has been added to the 6.11-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    mm, mmap: limit THP alignment of anonymous mappings to PMD-aligned sizes

to the 6.11-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     mm-mmap-limit-thp-alignment-of-anonymous-mappings-to.patch
and it can be found in the queue-6.11 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 4947414760b1f675ae0cc4cd81ff2fc2e877fdb4
Author: Vlastimil Babka <vbabka@xxxxxxx>
Date:   Thu Oct 24 17:12:29 2024 +0200

    mm, mmap: limit THP alignment of anonymous mappings to PMD-aligned sizes
    
    [ Upstream commit d4148aeab412432bf928f311eca8a2ba52bb05df ]
    
    Since commit efa7df3e3bb5 ("mm: align larger anonymous mappings on THP
    boundaries") a mmap() of anonymous memory without a specific address hint
    and of at least PMD_SIZE will be aligned to PMD so that it can benefit
    from a THP backing page.
    
    However this change has been shown to regress some workloads
    significantly.  [1] reports regressions in various spec benchmarks, with
    up to 600% slowdown of the cactusBSSN benchmark on some platforms.  The
    benchmark seems to create many mappings of 4632kB, which would have merged
    to a large THP-backed area before commit efa7df3e3bb5 and now they are
    fragmented to multiple areas each aligned to PMD boundary with gaps
    between.  The regression then seems to be caused mainly due to the
    benchmark's memory access pattern suffering from TLB or cache aliasing due
    to the aligned boundaries of the individual areas.
    
    Another known regression bisected to commit efa7df3e3bb5 is darktable [2]
    [3] and early testing suggests this patch fixes the regression there as
    well.
    
    To fix the regression but still try to benefit from THP-friendly anonymous
    mapping alignment, add a condition that the size of the mapping must be a
    multiple of PMD size instead of at least PMD size.  In case of many
    odd-sized mapping like the cactusBSSN creates, those will stop being
    aligned and with gaps between, and instead naturally merge again.
    
    Link: https://lkml.kernel.org/r/20241024151228.101841-2-vbabka@xxxxxxx
    Fixes: efa7df3e3bb5 ("mm: align larger anonymous mappings on THP boundaries")
    Signed-off-by: Vlastimil Babka <vbabka@xxxxxxx>
    Reported-by: Michael Matz <matz@xxxxxxx>
    Debugged-by: Gabriel Krisman Bertazi <gabriel@xxxxxxxxxx>
    Closes: https://bugzilla.suse.com/show_bug.cgi?id=1229012 [1]
    Reported-by: Matthias Bodenbinder <matthias@xxxxxxxxxxxxxx>
    Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219366 [2]
    Closes: https://lore.kernel.org/all/2050f0d4-57b0-481d-bab8-05e8d48fed0c@xxxxxxxxxxxxx/ [3]
    Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx>
    Reviewed-by: Yang Shi <yang@xxxxxxxxxxxxxxxxxxxxxx>
    Cc: Rik van Riel <riel@xxxxxxxxxxx>
    Cc: Jann Horn <jannh@xxxxxxxxxx>
    Cc: Liam R. Howlett <Liam.Howlett@xxxxxxxxxx>
    Cc: Petr Tesarik <ptesarik@xxxxxxxx>
    Cc: Thorsten Leemhuis <regressions@xxxxxxxxxxxxx>
    Cc: <stable@xxxxxxxxxxxxxxx>
    Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/mm/mmap.c b/mm/mmap.c
index 18fddcce03b85..8a04f29aa4230 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1952,7 +1952,8 @@ __get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
 
 	if (get_area) {
 		addr = get_area(file, addr, len, pgoff, flags);
-	} else if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) {
+	} else if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)
+		   && IS_ALIGNED(len, PMD_SIZE)) {
 		/* Ensures that larger anonymous mappings are THP aligned. */
 		addr = thp_get_unmapped_area_vmflags(file, addr, len,
 						     pgoff, flags, vm_flags);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux