diff options
author | alc <alc@FreeBSD.org> | 2003-04-20 19:25:28 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-04-20 19:25:28 +0000 |
commit | 033a6f0bc724643e7275e0ffad5db4b9deec4c77 (patch) | |
tree | 34ad9183686b72f7b8dd9a5d3173f5ef9642c918 /sys/vm | |
parent | 4cb4acb5413a4713d2e49344777ecf8fd77108c3 (diff) | |
download | FreeBSD-src-033a6f0bc724643e7275e0ffad5db4b9deec4c77.zip FreeBSD-src-033a6f0bc724643e7275e0ffad5db4b9deec4c77.tar.gz |
- Lock the vm_object when performing vm_object_pip_wakeup().
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vm_fault.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index e16ad8e..d2d7372 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -137,12 +137,16 @@ static void _unlock_things(struct faultstate *fs, int dealloc) { GIANT_REQUIRED; + VM_OBJECT_LOCK(fs->object); vm_object_pip_wakeup(fs->object); + VM_OBJECT_UNLOCK(fs->object); if (fs->object != fs->first_object) { + VM_OBJECT_LOCK(fs->first_object); vm_page_lock_queues(); vm_page_free(fs->first_m); vm_page_unlock_queues(); vm_object_pip_wakeup(fs->first_object); + VM_OBJECT_UNLOCK(fs->first_object); fs->first_m = NULL; } if (dealloc) { @@ -614,7 +618,9 @@ readrest: * object with zeros. */ if (fs.object != fs.first_object) { + VM_OBJECT_LOCK(fs.object); vm_object_pip_wakeup(fs.object); + VM_OBJECT_UNLOCK(fs.object); fs.object = fs.first_object; fs.pindex = fs.first_pindex; @@ -635,7 +641,9 @@ readrest: break; /* break to PAGE HAS BEEN FOUND */ } else { if (fs.object != fs.first_object) { + VM_OBJECT_LOCK(fs.object); vm_object_pip_wakeup(fs.object); + VM_OBJECT_UNLOCK(fs.object); } KASSERT(fs.object != next_object, ("object loop %p", next_object)); fs.object = next_object; @@ -739,7 +747,9 @@ readrest: * fs.object != fs.first_object due to above * conditional */ + VM_OBJECT_LOCK(fs.object); vm_object_pip_wakeup(fs.object); + VM_OBJECT_UNLOCK(fs.object); /* * Only use the new page below... |