Fix a lock reversal problem in the VM subsystem related to threaded

programs.   There is a case during a fork() which can cause a deadlock.

From Tor -
The workaround that consists of setting a flag in the vm map that
indicates that a fork is in progress and using that mark in the page
fault handling to force a revalidation failure.  That change will only
affect (pessimize) page fault handling during fork for threaded
(linuxthreads style) applications and applications using aio_*().

Submited by: tegge
This commit is contained in:
Matthew Dillon 2001-03-14 06:48:53 +00:00
parent 1a484d28dd
commit b823bbd6be
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=74237
3 changed files with 10 additions and 0 deletions

View File

@ -725,6 +725,12 @@ RetryFault:;
vput(fs.vp);
fs.vp = NULL;
}
if (fs.map->infork) {
release_page(&fs);
unlock_and_deallocate(&fs);
goto RetryFault;
}
/*
* To avoid trying to write_lock the map while another process

View File

@ -254,6 +254,7 @@ vm_map_init(map, min, max)
map->nentries = 0;
map->size = 0;
map->system_map = 0;
map->infork = 0;
map->min_offset = min;
map->max_offset = max;
map->first_free = &map->header;
@ -2123,6 +2124,7 @@ vmspace_fork(vm1)
vm_object_t object;
vm_map_lock(old_map);
old_map->infork = 1;
vm2 = vmspace_alloc(old_map->min_offset, old_map->max_offset);
bcopy(&vm1->vm_startcopy, &vm2->vm_startcopy,
@ -2215,6 +2217,7 @@ vmspace_fork(vm1)
}
new_map->size = old_map->size;
old_map->infork = 0;
vm_map_unlock(old_map);
return (vm2);

View File

@ -162,6 +162,7 @@ struct vm_map {
int nentries; /* Number of entries */
vm_size_t size; /* virtual size */
u_char system_map; /* Am I a system map? */
u_char infork; /* Am I in fork processing? */
vm_map_entry_t hint; /* hint for quick lookups */
unsigned int timestamp; /* Version number */
vm_map_entry_t first_free; /* First free space hint */