Skip to content

Commit 3c06ee7

Browse files
lorenzo-stoakesakpm00
authored andcommitted
mm/vma: remove mmap() retry merge
We have now introduced a mechanism that obviates the need for a reattempted merge via the mmap_prepare() file hook, so eliminate this functionality altogether. The retry merge logic has been the cause of a great deal of complexity in the past and required a great deal of careful manoeuvring of code to ensure its continued and correct functionality. It has also recently been involved in an issue surrounding maple tree state, which again points to its problematic nature. We make it much easier to reason about mmap() logic by eliminating this and simply writing a VMA once. This also opens the doors to future optimisation and improvement in the mmap() logic. For any device or file system which encounters unwanted VMA fragmentation as a result of this change (that is, having not implemented .mmap_prepare hooks), the issue is easily resolvable by doing so. Link: https://lkml.kernel.org/r/d5d8fc74f02b89d6bec5ae8bc0e36d7853b65cda.1746792520.git.lorenzo.stoakes@oracle.com Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Reviewed-by: David Hildenbrand <david@redhat.com> Reviewed-by: Vlastimil Babka <vbabka@suse.cz> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Christian Brauner <brauner@kernel.org> Cc: Jan Kara <jack@suse.cz> Cc: Jann Horn <jannh@google.com> Cc: Liam Howlett <liam.howlett@oracle.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Michal Hocko <mhocko@suse.com> Cc: Mike Rapoport (Microsoft) <rppt@kernel.org> Cc: Suren Baghdasaryan <surenb@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 439b3fb commit 3c06ee7

File tree

1 file changed

+0
-14
lines changed

1 file changed

+0
-14
lines changed

mm/vma.c

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ struct mmap_state {
2424
void *vm_private_data;
2525

2626
unsigned long charged;
27-
bool retry_merge;
2827

2928
struct vm_area_struct *prev;
3029
struct vm_area_struct *next;
@@ -2417,8 +2416,6 @@ static int __mmap_new_file_vma(struct mmap_state *map,
24172416
!(map->flags & VM_MAYWRITE) &&
24182417
(vma->vm_flags & VM_MAYWRITE));
24192418

2420-
/* If the flags change (and are mergeable), let's retry later. */
2421-
map->retry_merge = vma->vm_flags != map->flags && !(vma->vm_flags & VM_SPECIAL);
24222419
map->flags = vma->vm_flags;
24232420

24242421
return 0;
@@ -2622,17 +2619,6 @@ static unsigned long __mmap_region(struct file *file, unsigned long addr,
26222619
if (have_mmap_prepare)
26232620
set_vma_user_defined_fields(vma, &map);
26242621

2625-
/* If flags changed, we might be able to merge, so try again. */
2626-
if (map.retry_merge) {
2627-
struct vm_area_struct *merged;
2628-
VMG_MMAP_STATE(vmg, &map, vma);
2629-
2630-
vma_iter_config(map.vmi, map.addr, map.end);
2631-
merged = vma_merge_existing_range(&vmg);
2632-
if (merged)
2633-
vma = merged;
2634-
}
2635-
26362622
__mmap_complete(&map, vma);
26372623

26382624
return addr;

0 commit comments

Comments
 (0)