diff options
author | alc <alc@FreeBSD.org> | 2003-04-19 22:11:41 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-04-19 22:11:41 +0000 |
commit | dc48d3db81e4e6fe22622e0d7918174a41a9e4e8 (patch) | |
tree | d9d7d5c327a08db059b8b872181c6a659ee359ca /sys/vm | |
parent | ef4e8a19cfc9fb054dbda2b5efdaef60ef82438c (diff) | |
download | FreeBSD-src-dc48d3db81e4e6fe22622e0d7918174a41a9e4e8.zip FreeBSD-src-dc48d3db81e4e6fe22622e0d7918174a41a9e4e8.tar.gz |
- Lock the vm_object when performing vm_object_pip_subtract().
- Assert that the vm_object lock is held in vm_object_pip_subtract().
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/swap_pager.c | 4 | ||||
-rw-r--r-- | sys/vm/vm_object.c | 1 |
2 files changed, 5 insertions, 0 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 997e682..2adaf6f 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -1693,7 +1693,9 @@ swp_pager_force_pagein(struct swblock *swap, int idx) vm_object_pip_add(object, 1); m = vm_page_grab(object, pindex + idx, VM_ALLOC_NORMAL|VM_ALLOC_RETRY); if (m->valid == VM_PAGE_BITS_ALL) { + VM_OBJECT_LOCK(object); vm_object_pip_subtract(object, 1); + VM_OBJECT_UNLOCK(object); vm_page_lock_queues(); vm_page_activate(m); vm_page_dirty(m); @@ -1706,7 +1708,9 @@ swp_pager_force_pagein(struct swblock *swap, int idx) if (swap_pager_getpages(object, &m, 1, 0) != VM_PAGER_OK) panic("swap_pager_force_pagein: read from swap failed");/*XXX*/ + VM_OBJECT_LOCK(object); vm_object_pip_subtract(object, 1); + VM_OBJECT_UNLOCK(object); vm_page_lock_queues(); vm_page_dirty(m); diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 4f784b0..2a8a2ce 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -277,6 +277,7 @@ void vm_object_pip_subtract(vm_object_t object, short i) { GIANT_REQUIRED; + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); object->paging_in_progress -= i; } |