diff options
author | alc <alc@FreeBSD.org> | 2010-12-17 22:41:22 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2010-12-17 22:41:22 +0000 |
commit | 303f816df2775b26995e491e0f85a92ece216376 (patch) | |
tree | f8247f2e64a2bf626c77369f8a64afbd8d2de891 /sys/kern/sys_pipe.c | |
parent | 76685b94905e80dbe3579c45ca040d9de78bdf75 (diff) | |
download | FreeBSD-src-303f816df2775b26995e491e0f85a92ece216376.zip FreeBSD-src-303f816df2775b26995e491e0f85a92ece216376.tar.gz |
Implement and use a single optimized function for unholding a set of pages.
Reviewed by: kib@
Diffstat (limited to 'sys/kern/sys_pipe.c')
-rw-r--r-- | sys/kern/sys_pipe.c | 15 |
1 files changed, 3 insertions, 12 deletions
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index 22401a7..444b424 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -749,7 +749,7 @@ pipe_build_write_buffer(wpipe, uio) { pmap_t pmap; u_int size; - int i, j; + int i; vm_offset_t addr, endaddr; PIPE_LOCK_ASSERT(wpipe, MA_NOTOWNED); @@ -771,11 +771,7 @@ pipe_build_write_buffer(wpipe, uio) */ race: if (vm_fault_quick((caddr_t)addr, VM_PROT_READ) < 0) { - for (j = 0; j < i; j++) { - vm_page_lock(wpipe->pipe_map.ms[j]); - vm_page_unhold(wpipe->pipe_map.ms[j]); - vm_page_unlock(wpipe->pipe_map.ms[j]); - } + vm_page_unhold_pages(wpipe->pipe_map.ms, i); return (EFAULT); } wpipe->pipe_map.ms[i] = pmap_extract_and_hold(pmap, addr, @@ -812,14 +808,9 @@ static void pipe_destroy_write_buffer(wpipe) struct pipe *wpipe; { - int i; PIPE_LOCK_ASSERT(wpipe, MA_OWNED); - for (i = 0; i < wpipe->pipe_map.npages; i++) { - vm_page_lock(wpipe->pipe_map.ms[i]); - vm_page_unhold(wpipe->pipe_map.ms[i]); - vm_page_unlock(wpipe->pipe_map.ms[i]); - } + vm_page_unhold_pages(wpipe->pipe_map.ms, wpipe->pipe_map.npages); wpipe->pipe_map.npages = 0; } |