Move the per-thread deferred user map entries list into a private list

in vm_map_process_deferred() which is then iterated to release map entries.
This avoids having a nested vm map unlock operation called from the loop
body attempt to recuse into vm_map_process_deferred().  This can happen if
the vm_map_remove() triggers the OOM killer.

Reviewed by:	alc, kib
MFC after:	1 week
This commit is contained in:
John Baldwin 2012-06-20 18:00:26 +00:00
parent f89d8b9a0f
commit 6fbe60fa8b

View file

@ -475,12 +475,14 @@ static void
vm_map_process_deferred(void)
{
struct thread *td;
vm_map_entry_t entry;
vm_map_entry_t entry, next;
vm_object_t object;
td = curthread;
while ((entry = td->td_map_def_user) != NULL) {
td->td_map_def_user = entry->next;
entry = td->td_map_def_user;
td->td_map_def_user = NULL;
while (entry != NULL) {
next = entry->next;
if ((entry->eflags & MAP_ENTRY_VN_WRITECNT) != 0) {
/*
* Decrement the object's writemappings and
@ -494,6 +496,7 @@ vm_map_process_deferred(void)
entry->end);
}
vm_map_entry_deallocate(entry, FALSE);
entry = next;
}
}