Define macro VM_MAP_ENTRY_FOREACH for enumerating the entries in a vm_map.
In case the implementation ever changes from using a chain of next pointers, then changing the macro definition will be necessary, but changing all the files that iterate over vm_map entries will not. Drop a counter in vm_object.c that would have an effect only if the vm_map entry count was wrong. Discussed with: alc Reviewed by: markj Tested by: pho (earlier version) Differential Revision: https://reviews.freebsd.org/D21882
This commit is contained in:
parent
dbef5f7155
commit
2288078c5e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=353298
@ -1174,8 +1174,7 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
|
|||||||
l_map_str = l32_map_str;
|
l_map_str = l32_map_str;
|
||||||
map = &vm->vm_map;
|
map = &vm->vm_map;
|
||||||
vm_map_lock_read(map);
|
vm_map_lock_read(map);
|
||||||
for (entry = map->header.next; entry != &map->header;
|
VM_MAP_ENTRY_FOREACH(entry, map) {
|
||||||
entry = entry->next) {
|
|
||||||
name = "";
|
name = "";
|
||||||
freename = NULL;
|
freename = NULL;
|
||||||
if (entry->eflags & MAP_ENTRY_IS_SUB_MAP)
|
if (entry->eflags & MAP_ENTRY_IS_SUB_MAP)
|
||||||
|
@ -1884,7 +1884,7 @@ pmc_log_process_mappings(struct pmc_owner *po, struct proc *p)
|
|||||||
map = &vm->vm_map;
|
map = &vm->vm_map;
|
||||||
vm_map_lock_read(map);
|
vm_map_lock_read(map);
|
||||||
|
|
||||||
for (entry = map->header.next; entry != &map->header; entry = entry->next) {
|
VM_MAP_ENTRY_FOREACH(entry, map) {
|
||||||
|
|
||||||
if (entry == NULL) {
|
if (entry == NULL) {
|
||||||
PMCDBG2(LOG,OPS,2, "hwpmc: vm_map entry unexpectedly "
|
PMCDBG2(LOG,OPS,2, "hwpmc: vm_map entry unexpectedly "
|
||||||
@ -1988,7 +1988,7 @@ pmc_log_process_mappings(struct pmc_owner *po, struct proc *p)
|
|||||||
* new lookup for this entry. If there is no entry
|
* new lookup for this entry. If there is no entry
|
||||||
* for this address range, vm_map_lookup_entry() will
|
* for this address range, vm_map_lookup_entry() will
|
||||||
* return the previous one, so we always want to go to
|
* return the previous one, so we always want to go to
|
||||||
* entry->next on the next loop iteration.
|
* the next entry on the next loop iteration.
|
||||||
*
|
*
|
||||||
* There is an edge condition here that can occur if
|
* There is an edge condition here that can occur if
|
||||||
* there is no entry at or before this address. In
|
* there is no entry at or before this address. In
|
||||||
|
@ -118,8 +118,7 @@ procfs_doprocmap(PFS_FILL_ARGS)
|
|||||||
return (ESRCH);
|
return (ESRCH);
|
||||||
map = &vm->vm_map;
|
map = &vm->vm_map;
|
||||||
vm_map_lock_read(map);
|
vm_map_lock_read(map);
|
||||||
for (entry = map->header.next; entry != &map->header;
|
VM_MAP_ENTRY_FOREACH(entry, map) {
|
||||||
entry = entry->next) {
|
|
||||||
if (entry->eflags & MAP_ENTRY_IS_SUB_MAP)
|
if (entry->eflags & MAP_ENTRY_IS_SUB_MAP)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -262,8 +262,7 @@ tmpfs_all_rw_maps(struct mount *mp, bool (*cb)(struct mount *mp, vm_map_t,
|
|||||||
vm_map_lock(map);
|
vm_map_lock(map);
|
||||||
if (map->busy)
|
if (map->busy)
|
||||||
vm_map_wait_busy(map);
|
vm_map_wait_busy(map);
|
||||||
for (entry = map->header.next; entry != &map->header;
|
VM_MAP_ENTRY_FOREACH(entry, map) {
|
||||||
entry = entry->next) {
|
|
||||||
if ((entry->eflags & (MAP_ENTRY_GUARD |
|
if ((entry->eflags & (MAP_ENTRY_GUARD |
|
||||||
MAP_ENTRY_IS_SUB_MAP | MAP_ENTRY_COW)) != 0 ||
|
MAP_ENTRY_IS_SUB_MAP | MAP_ENTRY_COW)) != 0 ||
|
||||||
(entry->max_protection & VM_PROT_WRITE) == 0)
|
(entry->max_protection & VM_PROT_WRITE) == 0)
|
||||||
|
@ -1738,8 +1738,7 @@ each_dumpable_segment(struct thread *td, segment_callback func, void *closure)
|
|||||||
boolean_t ignore_entry;
|
boolean_t ignore_entry;
|
||||||
|
|
||||||
vm_map_lock_read(map);
|
vm_map_lock_read(map);
|
||||||
for (entry = map->header.next; entry != &map->header;
|
VM_MAP_ENTRY_FOREACH(entry, map) {
|
||||||
entry = entry->next) {
|
|
||||||
/*
|
/*
|
||||||
* Don't dump inaccessible mappings, deal with legacy
|
* Don't dump inaccessible mappings, deal with legacy
|
||||||
* coredump mode.
|
* coredump mode.
|
||||||
|
@ -2239,8 +2239,7 @@ sysctl_kern_proc_ovmmap(SYSCTL_HANDLER_ARGS)
|
|||||||
|
|
||||||
map = &vm->vm_map;
|
map = &vm->vm_map;
|
||||||
vm_map_lock_read(map);
|
vm_map_lock_read(map);
|
||||||
for (entry = map->header.next; entry != &map->header;
|
VM_MAP_ENTRY_FOREACH(entry, map) {
|
||||||
entry = entry->next) {
|
|
||||||
vm_object_t obj, tobj, lobj;
|
vm_object_t obj, tobj, lobj;
|
||||||
vm_offset_t addr;
|
vm_offset_t addr;
|
||||||
|
|
||||||
@ -2455,8 +2454,7 @@ kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, ssize_t maxlen, int flags)
|
|||||||
error = 0;
|
error = 0;
|
||||||
map = &vm->vm_map;
|
map = &vm->vm_map;
|
||||||
vm_map_lock_read(map);
|
vm_map_lock_read(map);
|
||||||
for (entry = map->header.next; entry != &map->header;
|
VM_MAP_ENTRY_FOREACH(entry, map) {
|
||||||
entry = entry->next) {
|
|
||||||
if (entry->eflags & MAP_ENTRY_IS_SUB_MAP)
|
if (entry->eflags & MAP_ENTRY_IS_SUB_MAP)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -382,22 +382,19 @@ ptrace_vm_entry(struct thread *td, struct proc *p, struct ptrace_vm_entry *pve)
|
|||||||
vm_map_lock_read(map);
|
vm_map_lock_read(map);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
entry = map->header.next;
|
|
||||||
index = 0;
|
|
||||||
while (index < pve->pve_entry && entry != &map->header) {
|
|
||||||
entry = entry->next;
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
if (index != pve->pve_entry) {
|
|
||||||
error = EINVAL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
KASSERT((map->header.eflags & MAP_ENTRY_IS_SUB_MAP) == 0,
|
KASSERT((map->header.eflags & MAP_ENTRY_IS_SUB_MAP) == 0,
|
||||||
("Submap in map header"));
|
("Submap in map header"));
|
||||||
while ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0) {
|
index = 0;
|
||||||
entry = entry->next;
|
VM_MAP_ENTRY_FOREACH(entry, map) {
|
||||||
|
if (index >= pve->pve_entry &&
|
||||||
|
(entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0)
|
||||||
|
break;
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
if (index < pve->pve_entry) {
|
||||||
|
error = EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (entry == &map->header) {
|
if (entry == &map->header) {
|
||||||
error = ENOENT;
|
error = ENOENT;
|
||||||
break;
|
break;
|
||||||
|
@ -264,7 +264,7 @@ mac_proc_vm_revoke_recurse(struct thread *td, struct ucred *cred,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
vm_map_lock(map);
|
vm_map_lock(map);
|
||||||
for (vme = map->header.next; vme != &map->header; vme = vme->next) {
|
VM_MAP_ENTRY_FOREACH(vme, map) {
|
||||||
if (vme->eflags & MAP_ENTRY_IS_SUB_MAP) {
|
if (vme->eflags & MAP_ENTRY_IS_SUB_MAP) {
|
||||||
mac_proc_vm_revoke_recurse(td, cred,
|
mac_proc_vm_revoke_recurse(td, cred,
|
||||||
vme->object.sub_map);
|
vme->object.sub_map);
|
||||||
|
@ -2621,7 +2621,7 @@ vmspace_swap_count(struct vmspace *vmspace)
|
|||||||
map = &vmspace->vm_map;
|
map = &vmspace->vm_map;
|
||||||
count = 0;
|
count = 0;
|
||||||
|
|
||||||
for (cur = map->header.next; cur != &map->header; cur = cur->next) {
|
VM_MAP_ENTRY_FOREACH(cur, map) {
|
||||||
if ((cur->eflags & MAP_ENTRY_IS_SUB_MAP) != 0)
|
if ((cur->eflags & MAP_ENTRY_IS_SUB_MAP) != 0)
|
||||||
continue;
|
continue;
|
||||||
object = cur->object.vm_object;
|
object = cur->object.vm_object;
|
||||||
|
@ -416,6 +416,10 @@ int vm_map_lookup_locked(vm_map_t *, vm_offset_t, vm_prot_t, vm_map_entry_t *, v
|
|||||||
vm_pindex_t *, vm_prot_t *, boolean_t *);
|
vm_pindex_t *, vm_prot_t *, boolean_t *);
|
||||||
void vm_map_lookup_done (vm_map_t, vm_map_entry_t);
|
void vm_map_lookup_done (vm_map_t, vm_map_entry_t);
|
||||||
boolean_t vm_map_lookup_entry (vm_map_t, vm_offset_t, vm_map_entry_t *);
|
boolean_t vm_map_lookup_entry (vm_map_t, vm_offset_t, vm_map_entry_t *);
|
||||||
|
#define VM_MAP_ENTRY_FOREACH(it, map) \
|
||||||
|
for ((it) = (map)->header.next; \
|
||||||
|
(it) != &(map)->header; \
|
||||||
|
(it) = (it)->next)
|
||||||
int vm_map_protect (vm_map_t, vm_offset_t, vm_offset_t, vm_prot_t, boolean_t);
|
int vm_map_protect (vm_map_t, vm_offset_t, vm_offset_t, vm_prot_t, boolean_t);
|
||||||
int vm_map_remove (vm_map_t, vm_offset_t, vm_offset_t);
|
int vm_map_remove (vm_map_t, vm_offset_t, vm_offset_t);
|
||||||
void vm_map_try_merge_entries(vm_map_t map, vm_map_entry_t prev,
|
void vm_map_try_merge_entries(vm_map_t map, vm_map_entry_t prev,
|
||||||
|
@ -2376,29 +2376,22 @@ _vm_object_in_map(vm_map_t map, vm_object_t object, vm_map_entry_t entry)
|
|||||||
vm_map_t tmpm;
|
vm_map_t tmpm;
|
||||||
vm_map_entry_t tmpe;
|
vm_map_entry_t tmpe;
|
||||||
vm_object_t obj;
|
vm_object_t obj;
|
||||||
int entcount;
|
|
||||||
|
|
||||||
if (map == 0)
|
if (map == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (entry == 0) {
|
if (entry == 0) {
|
||||||
tmpe = map->header.next;
|
VM_MAP_ENTRY_FOREACH(tmpe, map) {
|
||||||
entcount = map->nentries;
|
|
||||||
while (entcount-- && (tmpe != &map->header)) {
|
|
||||||
if (_vm_object_in_map(map, object, tmpe)) {
|
if (_vm_object_in_map(map, object, tmpe)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
tmpe = tmpe->next;
|
|
||||||
}
|
}
|
||||||
} else if (entry->eflags & MAP_ENTRY_IS_SUB_MAP) {
|
} else if (entry->eflags & MAP_ENTRY_IS_SUB_MAP) {
|
||||||
tmpm = entry->object.sub_map;
|
tmpm = entry->object.sub_map;
|
||||||
tmpe = tmpm->header.next;
|
VM_MAP_ENTRY_FOREACH(tmpe, tmpm) {
|
||||||
entcount = tmpm->nentries;
|
|
||||||
while (entcount-- && tmpe != &tmpm->header) {
|
|
||||||
if (_vm_object_in_map(tmpm, object, tmpe)) {
|
if (_vm_object_in_map(tmpm, object, tmpe)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
tmpe = tmpe->next;
|
|
||||||
}
|
}
|
||||||
} else if ((obj = entry->object.vm_object) != NULL) {
|
} else if ((obj = entry->object.vm_object) != NULL) {
|
||||||
for (; obj; obj = obj->backing_object)
|
for (; obj; obj = obj->backing_object)
|
||||||
|
@ -1783,8 +1783,7 @@ vm_pageout_oom_pagecount(struct vmspace *vmspace)
|
|||||||
KASSERT(!map->system_map, ("system map"));
|
KASSERT(!map->system_map, ("system map"));
|
||||||
sx_assert(&map->lock, SA_LOCKED);
|
sx_assert(&map->lock, SA_LOCKED);
|
||||||
res = 0;
|
res = 0;
|
||||||
for (entry = map->header.next; entry != &map->header;
|
VM_MAP_ENTRY_FOREACH(entry, map) {
|
||||||
entry = entry->next) {
|
|
||||||
if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0)
|
if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0)
|
||||||
continue;
|
continue;
|
||||||
obj = entry->object.vm_object;
|
obj = entry->object.vm_object;
|
||||||
|
@ -284,8 +284,7 @@ vm_swapout_map_deactivate_pages(vm_map_t map, long desired)
|
|||||||
* first, search out the biggest object, and try to free pages from
|
* first, search out the biggest object, and try to free pages from
|
||||||
* that.
|
* that.
|
||||||
*/
|
*/
|
||||||
tmpe = map->header.next;
|
VM_MAP_ENTRY_FOREACH(tmpe, map) {
|
||||||
while (tmpe != &map->header) {
|
|
||||||
if ((tmpe->eflags & MAP_ENTRY_IS_SUB_MAP) == 0) {
|
if ((tmpe->eflags & MAP_ENTRY_IS_SUB_MAP) == 0) {
|
||||||
obj = tmpe->object.vm_object;
|
obj = tmpe->object.vm_object;
|
||||||
if (obj != NULL && VM_OBJECT_TRYRLOCK(obj)) {
|
if (obj != NULL && VM_OBJECT_TRYRLOCK(obj)) {
|
||||||
@ -302,7 +301,6 @@ vm_swapout_map_deactivate_pages(vm_map_t map, long desired)
|
|||||||
}
|
}
|
||||||
if (tmpe->wired_count > 0)
|
if (tmpe->wired_count > 0)
|
||||||
nothingwired = FALSE;
|
nothingwired = FALSE;
|
||||||
tmpe = tmpe->next;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bigobj != NULL) {
|
if (bigobj != NULL) {
|
||||||
@ -313,8 +311,7 @@ vm_swapout_map_deactivate_pages(vm_map_t map, long desired)
|
|||||||
* Next, hunt around for other pages to deactivate. We actually
|
* Next, hunt around for other pages to deactivate. We actually
|
||||||
* do this search sort of wrong -- .text first is not the best idea.
|
* do this search sort of wrong -- .text first is not the best idea.
|
||||||
*/
|
*/
|
||||||
tmpe = map->header.next;
|
VM_MAP_ENTRY_FOREACH(tmpe, map) {
|
||||||
while (tmpe != &map->header) {
|
|
||||||
if (pmap_resident_count(vm_map_pmap(map)) <= desired)
|
if (pmap_resident_count(vm_map_pmap(map)) <= desired)
|
||||||
break;
|
break;
|
||||||
if ((tmpe->eflags & MAP_ENTRY_IS_SUB_MAP) == 0) {
|
if ((tmpe->eflags & MAP_ENTRY_IS_SUB_MAP) == 0) {
|
||||||
@ -326,7 +323,6 @@ vm_swapout_map_deactivate_pages(vm_map_t map, long desired)
|
|||||||
VM_OBJECT_RUNLOCK(obj);
|
VM_OBJECT_RUNLOCK(obj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tmpe = tmpe->next;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user