mirror of
https://git.FreeBSD.org/src.git
synced 2024-10-19 02:29:40 +00:00
- Add some of the required vm object locking, including assertions where
the vm object lock is required and already held.
This commit is contained in:
parent
b89fbbb14b
commit
ee3dc7d7fe
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=121517
@ -491,14 +491,18 @@ swap_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot,
|
|||||||
OFF_TO_IDX(offset + PAGE_MASK + size));
|
OFF_TO_IDX(offset + PAGE_MASK + size));
|
||||||
object->handle = handle;
|
object->handle = handle;
|
||||||
|
|
||||||
|
VM_OBJECT_LOCK(object);
|
||||||
swp_pager_meta_build(object, 0, SWAPBLK_NONE);
|
swp_pager_meta_build(object, 0, SWAPBLK_NONE);
|
||||||
|
VM_OBJECT_UNLOCK(object);
|
||||||
}
|
}
|
||||||
sx_xunlock(&sw_alloc_sx);
|
sx_xunlock(&sw_alloc_sx);
|
||||||
} else {
|
} else {
|
||||||
object = vm_object_allocate(OBJT_DEFAULT,
|
object = vm_object_allocate(OBJT_DEFAULT,
|
||||||
OFF_TO_IDX(offset + PAGE_MASK + size));
|
OFF_TO_IDX(offset + PAGE_MASK + size));
|
||||||
|
|
||||||
|
VM_OBJECT_LOCK(object);
|
||||||
swp_pager_meta_build(object, 0, SWAPBLK_NONE);
|
swp_pager_meta_build(object, 0, SWAPBLK_NONE);
|
||||||
|
VM_OBJECT_UNLOCK(object);
|
||||||
}
|
}
|
||||||
mtx_unlock(&Giant);
|
mtx_unlock(&Giant);
|
||||||
return (object);
|
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 */
|
vm_pindex_t beg = start; /* save start index */
|
||||||
|
|
||||||
s = splvm();
|
s = splvm();
|
||||||
|
VM_OBJECT_LOCK(object);
|
||||||
while (size) {
|
while (size) {
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
n = BLIST_MAX_ALLOC;
|
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;
|
n >>= 1;
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
swp_pager_meta_free(object, beg, start - beg);
|
swp_pager_meta_free(object, beg, start - beg);
|
||||||
|
VM_OBJECT_UNLOCK(object);
|
||||||
splx(s);
|
splx(s);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -741,6 +747,7 @@ swap_pager_reserve(vm_object_t object, vm_pindex_t start, vm_size_t size)
|
|||||||
--n;
|
--n;
|
||||||
}
|
}
|
||||||
swp_pager_meta_free(object, start, n);
|
swp_pager_meta_free(object, start, n);
|
||||||
|
VM_OBJECT_UNLOCK(object);
|
||||||
splx(s);
|
splx(s);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@ -830,8 +837,11 @@ swap_pager_copy(vm_object_t srcobject, vm_object_t dstobject,
|
|||||||
SWM_POP
|
SWM_POP
|
||||||
);
|
);
|
||||||
|
|
||||||
if (srcaddr != SWAPBLK_NONE)
|
if (srcaddr != SWAPBLK_NONE) {
|
||||||
|
VM_OBJECT_LOCK(dstobject);
|
||||||
swp_pager_meta_build(dstobject, i, srcaddr);
|
swp_pager_meta_build(dstobject, i, srcaddr);
|
||||||
|
VM_OBJECT_UNLOCK(dstobject);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Destination has valid swapblk or it is represented
|
* 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.
|
* double-remove the object from the swap queues.
|
||||||
*/
|
*/
|
||||||
if (destroysource) {
|
if (destroysource) {
|
||||||
|
VM_OBJECT_LOCK(srcobject);
|
||||||
swp_pager_meta_free_all(srcobject);
|
swp_pager_meta_free_all(srcobject);
|
||||||
|
VM_OBJECT_UNLOCK(srcobject);
|
||||||
/*
|
/*
|
||||||
* Reverting the type is not necessary, the caller is going
|
* Reverting the type is not necessary, the caller is going
|
||||||
* to destroy srcobject directly, but I'm doing it here
|
* 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;
|
daddr_t blk0;
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
|
VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
|
||||||
/*
|
/*
|
||||||
* do we have good backing store at the requested index ?
|
* do we have good backing store at the requested index ?
|
||||||
*/
|
*/
|
||||||
@ -954,6 +967,7 @@ static void
|
|||||||
swap_pager_unswapped(vm_page_t m)
|
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);
|
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
|
m[0]->object
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
VM_OBJECT_UNLOCK(object);
|
|
||||||
/*
|
/*
|
||||||
* Step 1
|
* Step 1
|
||||||
*
|
*
|
||||||
@ -1197,6 +1211,7 @@ swap_pager_putpages(vm_object_t object, vm_page_t *m, int count,
|
|||||||
*/
|
*/
|
||||||
if (object->type != OBJT_SWAP)
|
if (object->type != OBJT_SWAP)
|
||||||
swp_pager_meta_build(object, 0, SWAPBLK_NONE);
|
swp_pager_meta_build(object, 0, SWAPBLK_NONE);
|
||||||
|
VM_OBJECT_UNLOCK(object);
|
||||||
|
|
||||||
if (curproc != pageproc)
|
if (curproc != pageproc)
|
||||||
sync = TRUE;
|
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_bufsize = PAGE_SIZE * n;
|
||||||
bp->b_blkno = blk;
|
bp->b_blkno = blk;
|
||||||
|
|
||||||
|
VM_OBJECT_LOCK(object);
|
||||||
for (j = 0; j < n; ++j) {
|
for (j = 0; j < n; ++j) {
|
||||||
vm_page_t mreq = m[i+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();
|
vm_page_unlock_queues();
|
||||||
bp->b_pages[j] = mreq;
|
bp->b_pages[j] = mreq;
|
||||||
}
|
}
|
||||||
|
VM_OBJECT_UNLOCK(object);
|
||||||
bp->b_npages = n;
|
bp->b_npages = n;
|
||||||
/*
|
/*
|
||||||
* Must set dirty range for NFS to work.
|
* 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;
|
int idx;
|
||||||
|
|
||||||
GIANT_REQUIRED;
|
GIANT_REQUIRED;
|
||||||
|
VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
|
||||||
/*
|
/*
|
||||||
* Convert default object to swap object if necessary
|
* 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);
|
swap = *pswap = uma_zalloc(swap_zone, M_NOWAIT);
|
||||||
if (swap == NULL) {
|
if (swap == NULL) {
|
||||||
|
VM_OBJECT_UNLOCK(object);
|
||||||
VM_WAIT;
|
VM_WAIT;
|
||||||
|
VM_OBJECT_LOCK(object);
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1864,7 +1884,7 @@ static void
|
|||||||
swp_pager_meta_free(vm_object_t object, vm_pindex_t index, daddr_t count)
|
swp_pager_meta_free(vm_object_t object, vm_pindex_t index, daddr_t count)
|
||||||
{
|
{
|
||||||
GIANT_REQUIRED;
|
GIANT_REQUIRED;
|
||||||
|
VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
|
||||||
if (object->type != OBJT_SWAP)
|
if (object->type != OBJT_SWAP)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1911,7 +1931,7 @@ swp_pager_meta_free_all(vm_object_t object)
|
|||||||
daddr_t index = 0;
|
daddr_t index = 0;
|
||||||
|
|
||||||
GIANT_REQUIRED;
|
GIANT_REQUIRED;
|
||||||
|
VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
|
||||||
if (object->type != OBJT_SWAP)
|
if (object->type != OBJT_SWAP)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user