bug-hurd
[Top][All Lists]
Advanced

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

[PATCH v2 3/3] vm: Coalesce map entries


From: Sergey Bugaev
Subject: [PATCH v2 3/3] vm: Coalesce map entries
Date: Wed, 5 Jul 2023 17:16:39 +0300

When
- extending an existing entry,
- changing protection or inheritance of a range of entries,
we can get several entries that could be coalesced. Attempt to do that.
---
 vm/vm_map.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/vm/vm_map.c b/vm/vm_map.c
index 4ddde212..7e3e5686 100644
--- a/vm/vm_map.c
+++ b/vm/vm_map.c
@@ -1100,6 +1100,12 @@ kern_return_t vm_map_enter(
                        map->size += size;
                        entry->vme_end = end;
                        vm_map_gap_update(&map->hdr, entry);
+                       /*
+                        *      Now that we did, perhaps we could simplify
+                        *      things even further by coalescing the next
+                        *      entry into the one we just extended.
+                        */
+                       vm_map_coalesce_entry(map, next_entry);
                        RETURN(KERN_SUCCESS);
                }
        }
@@ -1129,6 +1135,12 @@ kern_return_t vm_map_enter(
                        map->size += size;
                        next_entry->vme_start = start;
                        vm_map_gap_update(&map->hdr, entry);
+                       /*
+                        *      Now that we did, perhaps we could simplify
+                        *      things even further by coalescing the
+                        *      entry into the previous one.
+                        */
+                       vm_map_coalesce_entry(map, next_entry);
                        RETURN(KERN_SUCCESS);
                }
        }
@@ -1607,6 +1619,7 @@ kern_return_t vm_map_protect(
 {
        vm_map_entry_t          current;
        vm_map_entry_t          entry;
+       vm_map_entry_t          next;
 
        vm_map_lock(map);
 
@@ -1682,9 +1695,16 @@ kern_return_t vm_map_protect(
                                        current->vme_end,
                                        current->protection);
                }
-               current = current->vme_next;
+
+               next = current->vme_next;
+               vm_map_coalesce_entry(map, current);
+               current = next;
        }
 
+       next = current->vme_next;
+       if (vm_map_coalesce_entry(map, current))
+               current = next;
+
        /* Returns with the map read-locked if successful */
        vm_map_pageable_scan(map, entry, current);
 
@@ -1708,6 +1728,7 @@ kern_return_t vm_map_inherit(
 {
        vm_map_entry_t  entry;
        vm_map_entry_t  temp_entry;
+       vm_map_entry_t  next;
 
        vm_map_lock(map);
 
@@ -1725,9 +1746,13 @@ kern_return_t vm_map_inherit(
 
                entry->inheritance = new_inheritance;
 
-               entry = entry->vme_next;
+               next = entry->vme_next;
+               vm_map_coalesce_entry(map, entry);
+               entry = next;
        }
 
+       vm_map_coalesce_entry(map, entry);
+
        vm_map_unlock(map);
        return(KERN_SUCCESS);
 }
-- 
2.41.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]