From ee3dc7d7fe3e62359fd1ce4b2df304641df8dafa Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sat, 25 Oct 2003 23:42:17 +0000 Subject: [PATCH] - Add some of the required vm object locking, including assertions where the vm object lock is required and already held. --- sys/vm/swap_pager.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 9beff9255ccf..9cffa80f99af 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -491,14 +491,18 @@ swap_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, OFF_TO_IDX(offset + PAGE_MASK + size)); object->handle = handle; + VM_OBJECT_LOCK(object); swp_pager_meta_build(object, 0, SWAPBLK_NONE); + VM_OBJECT_UNLOCK(object); } sx_xunlock(&sw_alloc_sx); } else { object = vm_object_allocate(OBJT_DEFAULT, OFF_TO_IDX(offset + PAGE_MASK + size)); + VM_OBJECT_LOCK(object); swp_pager_meta_build(object, 0, SWAPBLK_NONE); + VM_OBJECT_UNLOCK(object); } mtx_unlock(&Giant); return (object); @@ -722,6 +726,7 @@ swap_pager_reserve(vm_object_t object, vm_pindex_t start, vm_size_t size) vm_pindex_t beg = start; /* save start index */ s = splvm(); + VM_OBJECT_LOCK(object); while (size) { if (n == 0) { n = BLIST_MAX_ALLOC; @@ -729,6 +734,7 @@ swap_pager_reserve(vm_object_t object, vm_pindex_t start, vm_size_t size) n >>= 1; if (n == 0) { swp_pager_meta_free(object, beg, start - beg); + VM_OBJECT_UNLOCK(object); splx(s); return (-1); } @@ -741,6 +747,7 @@ swap_pager_reserve(vm_object_t object, vm_pindex_t start, vm_size_t size) --n; } swp_pager_meta_free(object, start, n); + VM_OBJECT_UNLOCK(object); splx(s); return (0); } @@ -830,8 +837,11 @@ swap_pager_copy(vm_object_t srcobject, vm_object_t dstobject, SWM_POP ); - if (srcaddr != SWAPBLK_NONE) + if (srcaddr != SWAPBLK_NONE) { + VM_OBJECT_LOCK(dstobject); swp_pager_meta_build(dstobject, i, srcaddr); + VM_OBJECT_UNLOCK(dstobject); + } } else { /* * Destination has valid swapblk or it is represented @@ -849,7 +859,9 @@ swap_pager_copy(vm_object_t srcobject, vm_object_t dstobject, * double-remove the object from the swap queues. */ if (destroysource) { + VM_OBJECT_LOCK(srcobject); swp_pager_meta_free_all(srcobject); + VM_OBJECT_UNLOCK(srcobject); /* * Reverting the type is not necessary, the caller is going * to destroy srcobject directly, but I'm doing it here @@ -880,6 +892,7 @@ swap_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before, int *aft daddr_t blk0; int s; + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); /* * do we have good backing store at the requested index ? */ @@ -954,6 +967,7 @@ static void swap_pager_unswapped(vm_page_t m) { + VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); swp_pager_meta_ctl(m->object, m->pindex, SWM_FREE); } @@ -1187,7 +1201,7 @@ swap_pager_putpages(vm_object_t object, vm_page_t *m, int count, m[0]->object ); } - VM_OBJECT_UNLOCK(object); + /* * Step 1 * @@ -1197,6 +1211,7 @@ swap_pager_putpages(vm_object_t object, vm_page_t *m, int count, */ if (object->type != OBJT_SWAP) swp_pager_meta_build(object, 0, SWAPBLK_NONE); + VM_OBJECT_UNLOCK(object); if (curproc != pageproc) sync = TRUE; @@ -1298,6 +1313,7 @@ swap_pager_putpages(vm_object_t object, vm_page_t *m, int count, bp->b_bufsize = PAGE_SIZE * n; bp->b_blkno = blk; + VM_OBJECT_LOCK(object); for (j = 0; j < n; ++j) { vm_page_t mreq = m[i+j]; @@ -1314,6 +1330,7 @@ swap_pager_putpages(vm_object_t object, vm_page_t *m, int count, vm_page_unlock_queues(); bp->b_pages[j] = mreq; } + VM_OBJECT_UNLOCK(object); bp->b_npages = n; /* * Must set dirty range for NFS to work. @@ -1775,6 +1792,7 @@ swp_pager_meta_build(vm_object_t object, vm_pindex_t pindex, daddr_t swapblk) int idx; GIANT_REQUIRED; + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); /* * Convert default object to swap object if necessary */ @@ -1815,7 +1833,9 @@ swp_pager_meta_build(vm_object_t object, vm_pindex_t pindex, daddr_t swapblk) swap = *pswap = uma_zalloc(swap_zone, M_NOWAIT); if (swap == NULL) { + VM_OBJECT_UNLOCK(object); VM_WAIT; + VM_OBJECT_LOCK(object); goto retry; } @@ -1864,7 +1884,7 @@ static void swp_pager_meta_free(vm_object_t object, vm_pindex_t index, daddr_t count) { GIANT_REQUIRED; - + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); if (object->type != OBJT_SWAP) return; @@ -1911,7 +1931,7 @@ swp_pager_meta_free_all(vm_object_t object) daddr_t index = 0; GIANT_REQUIRED; - + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); if (object->type != OBJT_SWAP) return;