summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_syscalls.c
diff options
context:
space:
mode:
authorae <ae@FreeBSD.org>2013-07-15 06:16:57 +0000
committerae <ae@FreeBSD.org>2013-07-15 06:16:57 +0000
commit6f8e41d6cbe4a6159abeaba412a9adbc4bd819ee (patch)
tree5932d71f2b8a3afd2e76291fe74b70726eac9ee1 /sys/kern/uipc_syscalls.c
parent1a49123d7477a3a956dfa33644d7f1483b56dbc2 (diff)
downloadFreeBSD-src-6f8e41d6cbe4a6159abeaba412a9adbc4bd819ee.zip
FreeBSD-src-6f8e41d6cbe4a6159abeaba412a9adbc4bd819ee.tar.gz
Introduce new structure sfstat for collecting sendfile's statistics
and remove corresponding fields from struct mbstat. Use PCPU counters and SFSTAT_INC() macro for update these statistics. Discussed with: glebius
Diffstat (limited to 'sys/kern/uipc_syscalls.c')
-rw-r--r--sys/kern/uipc_syscalls.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index a477820..46ceef2 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -115,6 +115,7 @@ static int getsockname1(struct thread *td, struct getsockname_args *uap,
static int getpeername1(struct thread *td, struct getpeername_args *uap,
int compat);
+counter_u64_t sfstat[sizeof(struct sfstat) / sizeof(uint64_t)];
/*
* NSFBUFS-related variables and associated sysctls
*/
@@ -129,6 +130,27 @@ SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufspeak, CTLFLAG_RD, &nsfbufspeak, 0,
SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufsused, CTLFLAG_RD, &nsfbufsused, 0,
"Number of sendfile(2) sf_bufs in use");
+static void
+sfstat_init(const void *unused)
+{
+
+ COUNTER_ARRAY_ALLOC(sfstat, sizeof(struct sfstat) / sizeof(uint64_t),
+ M_WAITOK);
+}
+SYSINIT(sfstat, SI_SUB_MBUF, SI_ORDER_FIRST, sfstat_init, NULL);
+
+static int
+sfstat_sysctl(SYSCTL_HANDLER_ARGS)
+{
+ struct sfstat s;
+
+ COUNTER_ARRAY_COPY(sfstat, &s, sizeof(s) / sizeof(uint64_t));
+ if (req->newptr)
+ COUNTER_ARRAY_ZERO(sfstat, sizeof(s) / sizeof(uint64_t));
+ return (SYSCTL_OUT(req, &s, sizeof(s)));
+}
+SYSCTL_PROC(_kern_ipc, OID_AUTO, sfstat, CTLTYPE_OPAQUE | CTLFLAG_RW,
+ NULL, 0, sfstat_sysctl, "I", "sendfile statistics");
/*
* Convert a user file descriptor to a kernel file entry and check if required
* capability rights are present.
@@ -2241,7 +2263,7 @@ retry_space:
vm_page_io_finish(pg);
if (!error)
VM_OBJECT_WUNLOCK(obj);
- mbstat.sf_iocnt++;
+ SFSTAT_INC(sf_iocnt);
}
if (error) {
vm_page_lock(pg);
@@ -2273,7 +2295,7 @@ retry_space:
sf = sf_buf_alloc(pg, (mnw || m != NULL) ? SFB_NOWAIT :
SFB_CATCH);
if (sf == NULL) {
- mbstat.sf_allocfail++;
+ SFSTAT_INC(sf_allocfail);
vm_page_lock(pg);
vm_page_unwire(pg, 0);
KASSERT(pg->object != NULL,
OpenPOWER on IntegriCloud