Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_sendfile.c
Show First 20 Lines • Show All 113 Lines • ▼ Show 20 Lines | sfstat_sysctl(SYSCTL_HANDLER_ARGS) | ||||
if (req->newptr) | if (req->newptr) | ||||
COUNTER_ARRAY_ZERO(sfstat, sizeof(s) / sizeof(uint64_t)); | COUNTER_ARRAY_ZERO(sfstat, sizeof(s) / sizeof(uint64_t)); | ||||
return (SYSCTL_OUT(req, &s, sizeof(s))); | return (SYSCTL_OUT(req, &s, sizeof(s))); | ||||
} | } | ||||
SYSCTL_PROC(_kern_ipc, OID_AUTO, sfstat, CTLTYPE_OPAQUE | CTLFLAG_RW, | SYSCTL_PROC(_kern_ipc, OID_AUTO, sfstat, CTLTYPE_OPAQUE | CTLFLAG_RW, | ||||
NULL, 0, sfstat_sysctl, "I", "sendfile statistics"); | NULL, 0, sfstat_sysctl, "I", "sendfile statistics"); | ||||
/* | /* | ||||
* Add more references to a vm_page + sf_buf + sendfile_sync. Called | |||||
* by mbuf(9) code to add extra references to a page. | |||||
*/ | |||||
void | |||||
sf_ext_ref(void *arg1, void *arg2) | |||||
{ | |||||
struct sf_buf *sf = arg1; | |||||
struct sendfile_sync *sfs = arg2; | |||||
vm_page_t pg = sf_buf_page(sf); | |||||
sf_buf_ref(sf); | |||||
vm_page_lock(pg); | |||||
vm_page_wire(pg); | |||||
vm_page_unlock(pg); | |||||
if (sfs != NULL) { | |||||
mtx_lock(&sfs->mtx); | |||||
KASSERT(sfs->count > 0, ("Sendfile sync botchup count == 0")); | |||||
sfs->count++; | |||||
mtx_unlock(&sfs->mtx); | |||||
} | |||||
} | |||||
/* | |||||
* Detach mapped page and release resources back to the system. Called | * Detach mapped page and release resources back to the system. Called | ||||
* by mbuf(9) code when last reference to a page is freed. | * by mbuf(9) code when last reference to a page is freed. | ||||
*/ | */ | ||||
void | void | ||||
sf_ext_free(void *arg1, void *arg2) | sf_ext_free(void *arg1, void *arg2) | ||||
{ | { | ||||
struct sf_buf *sf = arg1; | struct sf_buf *sf = arg1; | ||||
struct sendfile_sync *sfs = arg2; | struct sendfile_sync *sfs = arg2; | ||||
▲ Show 20 Lines • Show All 647 Lines • ▼ Show 20 Lines | for (int i = 0; i < npages; i++) { | ||||
*/ | */ | ||||
if ((flags & SF_NOCACHE) == 0 || | if ((flags & SF_NOCACHE) == 0 || | ||||
(i == npages - 1 && | (i == npages - 1 && | ||||
((off + space) & PAGE_MASK) && | ((off + space) & PAGE_MASK) && | ||||
(rem > space || rhpages > 0))) | (rem > space || rhpages > 0))) | ||||
m0->m_ext.ext_type = EXT_SFBUF; | m0->m_ext.ext_type = EXT_SFBUF; | ||||
else | else | ||||
m0->m_ext.ext_type = EXT_SFBUF_NOCACHE; | m0->m_ext.ext_type = EXT_SFBUF_NOCACHE; | ||||
m0->m_ext.ext_flags = 0; | m0->m_ext.ext_flags = EXT_FLAG_EMBREF; | ||||
m0->m_ext.ext_count = 1; | |||||
m0->m_flags |= (M_EXT | M_RDONLY); | m0->m_flags |= (M_EXT | M_RDONLY); | ||||
if (nios) | if (nios) | ||||
m0->m_flags |= M_NOTREADY; | m0->m_flags |= M_NOTREADY; | ||||
m0->m_data = (char *)sf_buf_kva(sf) + | m0->m_data = (char *)sf_buf_kva(sf) + | ||||
(vmoff(i, off) & PAGE_MASK); | (vmoff(i, off) & PAGE_MASK); | ||||
m0->m_len = xfsize(i, npages, off, space); | m0->m_len = xfsize(i, npages, off, space); | ||||
if (i == 0) | if (i == 0) | ||||
▲ Show 20 Lines • Show All 220 Lines • Show Last 20 Lines |