summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/uipc_cow.c4
-rw-r--r--sys/vm/vm_page.c11
2 files changed, 8 insertions, 7 deletions
diff --git a/sys/kern/uipc_cow.c b/sys/kern/uipc_cow.c
index 14231a2..f570677 100644
--- a/sys/kern/uipc_cow.c
+++ b/sys/kern/uipc_cow.c
@@ -96,7 +96,9 @@ socow_iodone(void *addr, void *args)
pp = PHYS_TO_VM_PAGE(paddr);
s = splvm();
/* remove COW mapping */
+ vm_page_lock_queues();
vm_page_cowclear(pp);
+ vm_page_unlock_queues();
vm_object_deallocate(pp->object);
splx(s);
/* note that sf_buf_free() unwires the page for us*/
@@ -141,12 +143,12 @@ socow_setup(struct mbuf *m0, struct uio *uio)
/*
* set up COW
*/
+ vm_page_lock_queues();
vm_page_cowsetup(pp);
/*
* wire the page for I/O
*/
- vm_page_lock_queues();
vm_page_wire(pp);
vm_page_unlock_queues();
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 637d2c0..535f566 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -1812,10 +1812,9 @@ void
vm_page_cowclear(vm_page_t m)
{
- /* XXX KDM find out if giant is required here. */
- GIANT_REQUIRED;
+ mtx_assert(&vm_page_queue_mtx, MA_OWNED);
if (m->cow) {
- atomic_subtract_int(&m->cow, 1);
+ m->cow--;
/*
* let vm_fault add back write permission lazily
*/
@@ -1828,9 +1827,9 @@ vm_page_cowclear(vm_page_t m)
void
vm_page_cowsetup(vm_page_t m)
{
- /* XXX KDM find out if giant is required here */
- GIANT_REQUIRED;
- atomic_add_int(&m->cow, 1);
+
+ mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+ m->cow++;
vm_page_protect(m, VM_PROT_READ);
}
OpenPOWER on IntegriCloud