38 #include <sys/cdefs.h>
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/sysctl.h>
44 #include <sys/kernel.h>
47 #include <sys/mutex.h>
49 #include <sys/sf_buf.h>
50 #include <sys/socketvar.h>
54 #include <vm/vm_extern.h>
55 #include <vm/vm_param.h>
57 #include <vm/vm_map.h>
58 #include <vm/vm_page.h>
59 #include <vm/vm_object.h>
61 FEATURE(zero_copy_sockets,
"Zero copy sockets support");
87 vm_page_unwire(pp, 0);
93 if (pp->wire_count == 0 && pp->object == NULL)
105 struct vmspace *vmspace;
107 vm_offset_t offset, uva;
111 vmspace = curproc->p_vmspace;
112 map = &vmspace->vm_map;
113 uva = (vm_offset_t) uio->uio_iov->iov_base;
114 offset = uva & PAGE_MASK;
115 len = PAGE_SIZE - offset;
120 if (vm_fault_quick_hold_pages(map, uva, len, VM_PROT_READ, &pp, 1) <
130 if (vm_page_cowsetup(pp) != 0) {
145 sf = sf_buf_alloc(pp, SFB_CATCH);
148 vm_page_cowclear(pp);
149 vm_page_unwire(pp, 0);
155 if (pp->wire_count == 0 && pp->object == NULL)
165 (
void*)sf_buf_kva(sf), sf, M_RDONLY, EXT_SFBUF);
167 m0->m_data = (caddr_t)sf_buf_kva(sf) + offset;
171 iov->iov_base = (
char *)iov->iov_base + m0->m_len;
172 iov->iov_len -= m0->m_len;
173 uio->uio_resid -= m0->m_len;
174 uio->uio_offset += m0->m_len;
175 if (iov->iov_len == 0) {
static struct netsend_cow_stats socow_stats
static void socow_iodone(void *addr, void *args)
int socow_setup(struct mbuf *m0, struct uio *uio)
FEATURE(zero_copy_sockets,"Zero copy sockets support")