svn commit: r357073 - head/sys/vm
Doug Moore
dougm at FreeBSD.org
Fri Jan 24 07:48:11 UTC 2020
Author: dougm
Date: Fri Jan 24 07:48:11 2020
New Revision: 357073
URL: https://svnweb.freebsd.org/changeset/base/357073
Log:
Most uses of vm_map_clip_start follow a call to vm_map_lookup. Define
an inline function vm_map_lookup_clip_start that invokes them both and
use it in places that invoke both. Drop a couple of local variables
made unnecessary by this function.
Reviewed by: markj
Tested by: pho
Differential Revision: https://reviews.freebsd.org/D22987
Modified:
head/sys/vm/vm_map.c
Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c Fri Jan 24 07:47:44 2020 (r357072)
+++ head/sys/vm/vm_map.c Fri Jan 24 07:48:11 2020 (r357073)
@@ -2387,7 +2387,7 @@ vm_map_entry_clone(vm_map_t map, vm_map_entry_t entry)
* 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_clip_start(vm_map_t map, vm_map_entry_t entry,
}
/*
+ * 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 @@ _vm_map_clip_start(vm_map_t map, vm_map_entry_t entry,
* 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;
@@ -2835,15 +2857,6 @@ vm_map_madvise(
*/
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.
@@ -2851,8 +2864,9 @@ vm_map_madvise(
* 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;
@@ -2900,6 +2914,8 @@ vm_map_madvise(
* 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;
@@ -3003,13 +3019,8 @@ vm_map_inherit(vm_map_t map, vm_offset_t start, vm_off
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 ||
@@ -3732,29 +3743,18 @@ vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry
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
+ * Find the start of the region, and clip it.
+ * Step through all entries in this region.
*/
- 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);
- }
-
- /*
- * 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
@@ -3765,7 +3765,6 @@ vm_map_delete(vm_map_t map, vm_offset_t start, vm_offs
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;
@@ -3779,21 +3778,15 @@ vm_map_delete(vm_map_t map, vm_offset_t start, vm_offs
* 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.
@@ -3820,7 +3813,6 @@ vm_map_delete(vm_map_t map, vm_offset_t start, vm_offs
* will be set in the wrong object!)
*/
vm_map_entry_delete(map, entry);
- entry = next;
}
return (KERN_SUCCESS);
}
More information about the svn-src-head
mailing list