diff options
author | alc <alc@FreeBSD.org> | 2010-12-25 21:26:56 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2010-12-25 21:26:56 +0000 |
commit | 971b02b7bcce9c49f919797dcad7b646c206b7b6 (patch) | |
tree | 069da87e128b6f0f35be7629bb29fa3f3c2db97e /sys/kern/uipc_cow.c | |
parent | 8e6dc31ba726f1333c1f0a995641a8d976ea3b4b (diff) | |
download | FreeBSD-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.c | 14 |
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++; |