uipc_syscalls.c (cfe30d02adda7c3b5c76156ac52d50d8cab325d9) uipc_syscalls.c (05d1f5bce0130b3220e260ca133b58cfa10a22a8)
1/*-
2 * Copyright (c) 1982, 1986, 1989, 1990, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * sendfile(2) and related extensions:
6 * Copyright (c) 1998, David Greenman. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 101 unchanged lines hidden (view full) ---

110static int accept1(struct thread *td, int s, struct sockaddr *uname,
111 socklen_t *anamelen, int flags);
112static int do_sendfile(struct thread *td, struct sendfile_args *uap, int compat);
113static int getsockname1(struct thread *td, struct getsockname_args *uap,
114 int compat);
115static int getpeername1(struct thread *td, struct getpeername_args *uap,
116 int compat);
117
1/*-
2 * Copyright (c) 1982, 1986, 1989, 1990, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * sendfile(2) and related extensions:
6 * Copyright (c) 1998, David Greenman. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 101 unchanged lines hidden (view full) ---

110static int accept1(struct thread *td, int s, struct sockaddr *uname,
111 socklen_t *anamelen, int flags);
112static int do_sendfile(struct thread *td, struct sendfile_args *uap, int compat);
113static int getsockname1(struct thread *td, struct getsockname_args *uap,
114 int compat);
115static int getpeername1(struct thread *td, struct getpeername_args *uap,
116 int compat);
117
118counter_u64_t sfstat[sizeof(struct sfstat) / sizeof(uint64_t)];
118/*
119 * NSFBUFS-related variables and associated sysctls
120 */
121int nsfbufs;
122int nsfbufspeak;
123int nsfbufsused;
124
125SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufs, CTLFLAG_RDTUN, &nsfbufs, 0,
126 "Maximum number of sendfile(2) sf_bufs available");
127SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufspeak, CTLFLAG_RD, &nsfbufspeak, 0,
128 "Number of sendfile(2) sf_bufs at peak usage");
129SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufsused, CTLFLAG_RD, &nsfbufsused, 0,
130 "Number of sendfile(2) sf_bufs in use");
131
119/*
120 * NSFBUFS-related variables and associated sysctls
121 */
122int nsfbufs;
123int nsfbufspeak;
124int nsfbufsused;
125
126SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufs, CTLFLAG_RDTUN, &nsfbufs, 0,
127 "Maximum number of sendfile(2) sf_bufs available");
128SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufspeak, CTLFLAG_RD, &nsfbufspeak, 0,
129 "Number of sendfile(2) sf_bufs at peak usage");
130SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufsused, CTLFLAG_RD, &nsfbufsused, 0,
131 "Number of sendfile(2) sf_bufs in use");
132
133static void
134sfstat_init(const void *unused)
135{
136
137 COUNTER_ARRAY_ALLOC(sfstat, sizeof(struct sfstat) / sizeof(uint64_t),
138 M_WAITOK);
139}
140SYSINIT(sfstat, SI_SUB_MBUF, SI_ORDER_FIRST, sfstat_init, NULL);
141
142static int
143sfstat_sysctl(SYSCTL_HANDLER_ARGS)
144{
145 struct sfstat s;
146
147 COUNTER_ARRAY_COPY(sfstat, &s, sizeof(s) / sizeof(uint64_t));
148 if (req->newptr)
149 COUNTER_ARRAY_ZERO(sfstat, sizeof(s) / sizeof(uint64_t));
150 return (SYSCTL_OUT(req, &s, sizeof(s)));
151}
152SYSCTL_PROC(_kern_ipc, OID_AUTO, sfstat, CTLTYPE_OPAQUE | CTLFLAG_RW,
153 NULL, 0, sfstat_sysctl, "I", "sendfile statistics");
132/*
133 * Convert a user file descriptor to a kernel file entry and check if required
134 * capability rights are present.
135 * A reference on the file entry is held upon returning.
136 */
137static int
138getsock_cap(struct filedesc *fdp, int fd, cap_rights_t rights,
139 struct file **fpp, u_int *fflagp)

--- 2096 unchanged lines hidden (view full) ---

2236 error = vn_rdwr(UIO_READ, vp, NULL, MAXBSIZE,
2237 trunc_page(off), UIO_NOCOPY, IO_NODELOCKED |
2238 IO_VMIO | ((MAXBSIZE / bsize) << IO_SEQSHIFT),
2239 td->td_ucred, NOCRED, &resid, td);
2240 VM_OBJECT_WLOCK(obj);
2241 vm_page_io_finish(pg);
2242 if (!error)
2243 VM_OBJECT_WUNLOCK(obj);
154/*
155 * Convert a user file descriptor to a kernel file entry and check if required
156 * capability rights are present.
157 * A reference on the file entry is held upon returning.
158 */
159static int
160getsock_cap(struct filedesc *fdp, int fd, cap_rights_t rights,
161 struct file **fpp, u_int *fflagp)

--- 2096 unchanged lines hidden (view full) ---

2258 error = vn_rdwr(UIO_READ, vp, NULL, MAXBSIZE,
2259 trunc_page(off), UIO_NOCOPY, IO_NODELOCKED |
2260 IO_VMIO | ((MAXBSIZE / bsize) << IO_SEQSHIFT),
2261 td->td_ucred, NOCRED, &resid, td);
2262 VM_OBJECT_WLOCK(obj);
2263 vm_page_io_finish(pg);
2264 if (!error)
2265 VM_OBJECT_WUNLOCK(obj);
2244 mbstat.sf_iocnt++;
2266 SFSTAT_INC(sf_iocnt);
2245 }
2246 if (error) {
2247 vm_page_lock(pg);
2248 vm_page_unwire(pg, 0);
2249 /*
2250 * See if anyone else might know about
2251 * this page. If not and it is not valid,
2252 * then free it.

--- 15 unchanged lines hidden (view full) ---

2268 * can be interrupted. For consequent
2269 * buffers, do not sleep, since several
2270 * threads might exhaust the buffers and then
2271 * deadlock.
2272 */
2273 sf = sf_buf_alloc(pg, (mnw || m != NULL) ? SFB_NOWAIT :
2274 SFB_CATCH);
2275 if (sf == NULL) {
2267 }
2268 if (error) {
2269 vm_page_lock(pg);
2270 vm_page_unwire(pg, 0);
2271 /*
2272 * See if anyone else might know about
2273 * this page. If not and it is not valid,
2274 * then free it.

--- 15 unchanged lines hidden (view full) ---

2290 * can be interrupted. For consequent
2291 * buffers, do not sleep, since several
2292 * threads might exhaust the buffers and then
2293 * deadlock.
2294 */
2295 sf = sf_buf_alloc(pg, (mnw || m != NULL) ? SFB_NOWAIT :
2296 SFB_CATCH);
2297 if (sf == NULL) {
2276 mbstat.sf_allocfail++;
2298 SFSTAT_INC(sf_allocfail);
2277 vm_page_lock(pg);
2278 vm_page_unwire(pg, 0);
2279 KASSERT(pg->object != NULL,
2280 ("kern_sendfile: object disappeared"));
2281 vm_page_unlock(pg);
2282 if (m == NULL)
2283 error = (mnw ? EAGAIN : EINTR);
2284 break;

--- 628 unchanged lines hidden ---
2299 vm_page_lock(pg);
2300 vm_page_unwire(pg, 0);
2301 KASSERT(pg->object != NULL,
2302 ("kern_sendfile: object disappeared"));
2303 vm_page_unlock(pg);
2304 if (m == NULL)
2305 error = (mnw ? EAGAIN : EINTR);
2306 break;

--- 628 unchanged lines hidden ---