Page MenuHomeFreeBSD

D22987.id66269.diff
No OneTemporary

D22987.id66269.diff

Index: sys/vm/vm_map.c
===================================================================
--- sys/vm/vm_map.c
+++ sys/vm/vm_map.c
@@ -2387,7 +2387,7 @@
* This routine is called only when it is known that
* the entry must be split.
*/
-static void
+static inline void
_vm_map_clip_start(vm_map_t map, vm_map_entry_t entry, vm_offset_t start)
{
vm_map_entry_t new_entry;
@@ -2407,6 +2407,28 @@
}
/*
+ * vm_map_lookup_clip_start:
+ *
+ * Find the entry at or just after 'start', and clip it if 'start' is in
+ * the interior of the entry. Return entry after 'start', and in
+ * prev_entry set the entry before 'start'.
+ */
+static inline vm_map_entry_t
+vm_map_lookup_clip_start(vm_map_t map, vm_offset_t start,
+ vm_map_entry_t *prev_entry)
+{
+ vm_map_entry_t entry;
+
+ if (vm_map_lookup_entry(map, start, prev_entry)) {
+ entry = *prev_entry;
+ vm_map_clip_start(map, entry, start);
+ *prev_entry = vm_map_entry_pred(entry);
+ } else
+ entry = vm_map_entry_succ(*prev_entry);
+ return (entry);
+}
+
+/*
* vm_map_clip_end: [ internal use only ]
*
* Asserts that the given entry ends at or before
@@ -2423,7 +2445,7 @@
* This routine is called only when it is known that
* the entry must be split.
*/
-static void
+static inline void
_vm_map_clip_end(vm_map_t map, vm_map_entry_t entry, vm_offset_t end)
{
vm_map_entry_t new_entry;
@@ -2480,11 +2502,7 @@
VM_MAP_RANGE_CHECK(map, start, end);
- if (vm_map_lookup_entry(map, start, &entry)) {
- vm_map_clip_start(map, entry, start);
- } else
- entry = vm_map_entry_succ(entry);
-
+ entry = vm_map_lookup_clip_start(map, start, &entry);
vm_map_clip_end(map, entry, end);
if ((entry->start == start) && (entry->end == end) &&
@@ -2842,15 +2860,6 @@
*/
VM_MAP_RANGE_CHECK(map, start, end);
- if (vm_map_lookup_entry(map, start, &entry)) {
- if (modify_map)
- vm_map_clip_start(map, entry, start);
- prev_entry = vm_map_entry_pred(entry);
- } else {
- prev_entry = entry;
- entry = vm_map_entry_succ(entry);
- }
-
if (modify_map) {
/*
* madvise behaviors that are implemented in the vm_map_entry.
@@ -2858,8 +2867,9 @@
* We clip the vm_map_entry so that behavioral changes are
* limited to the specified address range.
*/
- for (; entry->start < end;
- prev_entry = entry, entry = vm_map_entry_succ(entry)) {
+ for (entry = vm_map_lookup_clip_start(map, start, &prev_entry);
+ entry->start < end;
+ prev_entry = entry, entry = vm_map_entry_succ(entry)) {
if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0)
continue;
@@ -2907,6 +2917,8 @@
* Since we don't clip the vm_map_entry, we have to clip
* the vm_object pindex and count.
*/
+ if (!vm_map_lookup_entry(map, start, &entry))
+ entry = vm_map_entry_succ(entry);
for (; entry->start < end;
entry = vm_map_entry_succ(entry)) {
vm_offset_t useEnd, useStart;
@@ -3010,13 +3022,8 @@
return (KERN_SUCCESS);
vm_map_lock(map);
VM_MAP_RANGE_CHECK(map, start, end);
- if (vm_map_lookup_entry(map, start, &prev_entry)) {
- entry = prev_entry;
- vm_map_clip_start(map, entry, start);
- prev_entry = vm_map_entry_pred(entry);
- } else
- entry = vm_map_entry_succ(prev_entry);
- for (; entry->start < end;
+ for (entry = vm_map_lookup_clip_start(map, start, &prev_entry);
+ entry->start < end;
prev_entry = entry, entry = vm_map_entry_succ(entry)) {
vm_map_clip_end(map, entry, end);
if ((entry->eflags & MAP_ENTRY_GUARD) == 0 ||
@@ -3739,29 +3746,18 @@
int
vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end)
{
- vm_map_entry_t entry;
- vm_map_entry_t first_entry;
+ vm_map_entry_t entry, next_entry;
VM_MAP_ASSERT_LOCKED(map);
if (start == end)
return (KERN_SUCCESS);
/*
- * Find the start of the region, and clip it
- */
- if (!vm_map_lookup_entry(map, start, &first_entry))
- entry = vm_map_entry_succ(first_entry);
- else {
- entry = first_entry;
- vm_map_clip_start(map, entry, start);
- }
-
- /*
+ * Find the start of the region, and clip it.
* Step through all entries in this region
*/
- while (entry->start < end) {
- vm_map_entry_t next;
-
+ for (entry = vm_map_lookup_clip_start(map, start, &entry);
+ entry->start < end; entry = next_entry) {
/*
* Wait for wiring or unwiring of an entry to complete.
* Also wait for any system wirings to disappear on
@@ -3772,7 +3768,6 @@
vm_map_entry_system_wired_count(entry) != 0)) {
unsigned int last_timestamp;
vm_offset_t saved_start;
- vm_map_entry_t tmp_entry;
saved_start = entry->start;
entry->eflags |= MAP_ENTRY_NEEDS_WAKEUP;
@@ -3786,21 +3781,15 @@
* Specifically, the entry may have been
* clipped, merged, or deleted.
*/
- if (!vm_map_lookup_entry(map, saved_start,
- &tmp_entry))
- entry = vm_map_entry_succ(tmp_entry);
- else {
- entry = tmp_entry;
- vm_map_clip_start(map, entry,
- saved_start);
- }
- }
+ next_entry = vm_map_lookup_clip_start(map,
+ saved_start, &next_entry);
+ } else
+ next_entry = entry;
continue;
}
vm_map_clip_end(map, entry, end);
+ next_entry = vm_map_entry_succ(entry);
- next = vm_map_entry_succ(entry);
-
/*
* Unwire before removing addresses from the pmap; otherwise,
* unwiring will put the entries back in the pmap.
@@ -3827,7 +3816,6 @@
* will be set in the wrong object!)
*/
vm_map_entry_delete(map, entry);
- entry = next;
}
return (KERN_SUCCESS);
}

File Metadata

Mime Type
text/plain
Expires
Tue, Nov 11, 8:33 AM (34 m, 23 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25150754
Default Alt Text
D22987.id66269.diff (5 KB)

Event Timeline