diff options
author | alc <alc@FreeBSD.org> | 2003-06-22 05:36:53 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-06-22 05:36:53 +0000 |
commit | 5d0aaa2a8797f36a0400abe3aac546b308192bcf (patch) | |
tree | 807e41fbc20b0da811e0f1accb611a148737fcbb /sys/vm/vm_fault.c | |
parent | 9e1cffe0692d16b27f8ce86102ece15af0bf7a9d (diff) | |
download | FreeBSD-src-5d0aaa2a8797f36a0400abe3aac546b308192bcf.zip FreeBSD-src-5d0aaa2a8797f36a0400abe3aac546b308192bcf.tar.gz |
As vm_fault() descends the chain of backing objects, set paging-in-
progress on the next object before clearing it on the current object.
Diffstat (limited to 'sys/vm/vm_fault.c')
-rw-r--r-- | sys/vm/vm_fault.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index cefcfb9..d3ccd93 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -642,16 +642,16 @@ readrest: fs.m->valid = VM_PAGE_BITS_ALL; 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; + KASSERT(fs.object != next_object, + ("object loop %p", next_object)); + VM_OBJECT_LOCK(next_object); + vm_object_pip_add(next_object, 1); + VM_OBJECT_UNLOCK(next_object); VM_OBJECT_LOCK(fs.object); - vm_object_pip_add(fs.object, 1); + if (fs.object != fs.first_object) + vm_object_pip_wakeup(fs.object); VM_OBJECT_UNLOCK(fs.object); + fs.object = next_object; } } |