summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_cow.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2010-12-25 21:26:56 +0000
committeralc <alc@FreeBSD.org>2010-12-25 21:26:56 +0000
commit971b02b7bcce9c49f919797dcad7b646c206b7b6 (patch)
tree069da87e128b6f0f35be7629bb29fa3f3c2db97e /sys/kern/uipc_cow.c
parent8e6dc31ba726f1333c1f0a995641a8d976ea3b4b (diff)
downloadFreeBSD-src-971b02b7bcce9c49f919797dcad7b646c206b7b6.zip
FreeBSD-src-971b02b7bcce9c49f919797dcad7b646c206b7b6.tar.gz
Introduce and use a new VM interface for temporarily pinning pages. This
new interface replaces the combined use of vm_fault_quick() and pmap_extract_and_hold() throughout the kernel. In collaboration with: kib@
Diffstat (limited to 'sys/kern/uipc_cow.c')
-rw-r--r--sys/kern/uipc_cow.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/sys/kern/uipc_cow.c b/sys/kern/uipc_cow.c
index 853b70b..f7ef798 100644
--- a/sys/kern/uipc_cow.c
+++ b/sys/kern/uipc_cow.c
@@ -103,24 +103,20 @@ socow_setup(struct mbuf *m0, struct uio *uio)
struct vmspace *vmspace;
struct vm_map *map;
vm_offset_t offset, uva;
+ vm_size_t len;
socow_stats.attempted++;
vmspace = curproc->p_vmspace;
map = &vmspace->vm_map;
uva = (vm_offset_t) uio->uio_iov->iov_base;
offset = uva & PAGE_MASK;
+ len = PAGE_SIZE - offset;
/*
* Verify that access to the given address is allowed from user-space.
*/
- if (vm_fault_quick((caddr_t)uva, VM_PROT_READ) < 0)
- return (0);
-
- /*
- * verify page is mapped & not already wired for i/o
- */
- pp = pmap_extract_and_hold(map->pmap, uva, VM_PROT_READ);
- if (pp == NULL) {
+ if (vm_fault_quick_hold_pages(map, uva, len, &pp, 1, VM_PROT_READ) <
+ 0) {
socow_stats.fail_not_mapped++;
return(0);
}
@@ -165,7 +161,7 @@ socow_setup(struct mbuf *m0, struct uio *uio)
*/
MEXTADD(m0, sf_buf_kva(sf), PAGE_SIZE, socow_iodone,
(void*)sf_buf_kva(sf), sf, M_RDONLY, EXT_SFBUF);
- m0->m_len = PAGE_SIZE - offset;
+ m0->m_len = len;
m0->m_data = (caddr_t)sf_buf_kva(sf) + offset;
socow_stats.success++;
OpenPOWER on IntegriCloud