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:
parent
1a484d28dd
commit
b823bbd6be
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=74237
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user