• Joel Fernandes (Google)'s avatar
    mm/mremap: optimize the start addresses in move_page_tables() · af8ca1c1
    Joel Fernandes (Google) authored
    Patch series "Optimize mremap during mutual alignment within PMD", v6.
    
    This patchset optimizes the start addresses in move_page_tables() and
    tests the changes.  It addresses a warning [1] that occurs due to a
    downward, overlapping move on a mutually-aligned offset within a PMD
    during exec.  By initiating the copy process at the PMD level when such
    alignment is present, we can prevent this warning and speed up the copying
    process at the same time.  Linus Torvalds suggested this idea.  Check the
    individual patches for more details.  [1]
    https://lore.kernel.org/all/ZB2GTBD%2FLWTrkOiO@dhcp22.suse.cz/
    
    
    This patch (of 7):
    
    Recently, we see reports [1] of a warning that triggers due to
    move_page_tables() doing a downward and overlapping move on a
    mutually-aligned offset within a PMD.  By mutual alignment, I mean the
    source and destination addresses of the mremap are at the same offset
    within a PMD.
    
    This mutual alignment along with the fact that the move is downward is
    sufficient to cause a warning related to having an allocated PMD that does
    not have PTEs in it.
    
    This warning will only trigger when there is mutual alignment in the move
    operation.  A solution, as suggested by Linus Torvalds [2], is to initiate
    the copy process at the PMD level whenever such alignment is present. 
    Implementing this approach will not only prevent the warning from being
    triggered, but it will also optimize the operation as this method should
    enhance the speed of the copy process whenever there's a possibility to
    start copying at the PMD level.
    
    Some more points:
    a. The optimization can be done only when both the source and
    destination of the mremap do not have anything mapped below it up to a
    PMD boundary. I add support to detect that.
    
    b. #1 is not a problem for the call to move_page_tables() from exec.c as
    nothing is expected to be mapped below the source. However, for
    non-overlapping mutually aligned moves as triggered by mremap(2), I
    added support for checking such cases.
    
    c. I currently only optimize for PMD moves, in the future I/we can build
    on this work and do PUD moves as well if there is a need for this. But I
    want to take it one step at a time.
    
    d. We need to be careful about mremap of ranges within the VMA itself.
    For this purpose, I added checks to determine if the address after
    alignment falls within its VMA itself.
    
    [1] https://lore.kernel.org/all/ZB2GTBD%2FLWTrkOiO@dhcp22.suse.cz/
    [2] https://lore.kernel.org/all/CAHk-=whd7msp8reJPfeGNyt0LiySMT0egExx3TVZSX3Ok6X=9g@mail.gmail.com/
    
    Link: https://lkml.kernel.org/r/20230903151328.2981432-1-joel@joelfernandes.org
    Link: https://lkml.kernel.org/r/20230903151328.2981432-2-joel@joelfernandes.org
    
    Signed-off-by: default avatarJoel Fernandes (Google) <joel@joelfernandes.org>
    Reviewed-by: default avatarLorenzo Stoakes <lstoakes@gmail.com>
    Suggested-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Cc: Kalesh Singh <kaleshsingh@google.com>
    Cc: "Kirill A. Shutemov" <kirill@shutemov.name>
    Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Lokesh Gidra <lokeshgidra@google.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Paul E. McKenney <paulmck@kernel.org>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: Suren Baghdasaryan <surenb@google.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    af8ca1c1
mremap.c 31.1 KB