svn commit: r296880 - in head: share/man/man9 sys/kern sys/sys

Gleb Smirnoff glebius at FreeBSD.org
Tue Mar 15 00:05:02 UTC 2016


Author: glebius
Date: Tue Mar 15 00:05:00 2016
New Revision: 296880
URL: https://svnweb.freebsd.org/changeset/base/296880

Log:
  Provide sysctl(9) macro to deal with array of counter(9).

Modified:
  head/share/man/man9/counter.9
  head/sys/kern/subr_counter.c
  head/sys/sys/sysctl.h

Modified: head/share/man/man9/counter.9
==============================================================================
--- head/share/man/man9/counter.9	Mon Mar 14 23:49:16 2016	(r296879)
+++ head/share/man/man9/counter.9	Tue Mar 15 00:05:00 2016	(r296880)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd February 7, 2014
+.Dd March 14, 2016
 .Dt COUNTER 9
 .Os
 .Sh NAME
@@ -54,6 +54,8 @@
 .In sys/sysctl.h
 .Fn SYSCTL_COUNTER_U64 parent nbr name access ptr descr
 .Fn SYSCTL_ADD_COUNTER_U64 ctx parent nbr name access ptr descr
+.Fn SYSCTL_COUNTER_U64_ARRAY parent nbr name access ptr len descr
+.Fn SYSCTL_ADD_COUNTER_U64_ARRAY ctx parent nbr name access ptr len descr
 .Sh DESCRIPTION
 .Nm
 is a generic facility to create counters
@@ -150,6 +152,40 @@ argument should be a pointer to allocate
 A read of the oid returns value obtained through
 .Fn counter_u64_fetch .
 Any write to the oid zeroes it.
+.It Fn SYSCTL_COUNTER_U64_ARRAY parent nbr name access ptr len descr
+Declare a static
+.Xr sysctl  
+oid that would represent an array of
+.Nm .
+The
+.Fa ptr
+argument should be a pointer to allocated array of
+.Vt counter_u64_t's .
+The
+.Fa len
+argument should specify number of elements in the array.
+A read of the oid returns len-sized array of
+.Vt uint64_t
+values  obtained through
+.Fn counter_u64_fetch .
+Any write to the oid zeroes all array elements.
+.It Fn SYSCTL_ADD_COUNTER_U64_ARRAY ctx parent nbr name access ptr len descr
+Create a
+.Xr sysctl
+oid that would represent an array of 
+.Nm .
+The
+.Fa ptr
+argument should be a pointer to allocated array of
+.Vt counter_u64_t's .
+The
+.Fa len
+argument should specify number of elements in the array.
+A read of the oid returns len-sized array of 
+.Vt uint64_t 
+values  obtained through
+.Fn counter_u64_fetch .
+Any write to the oid zeroes all array elements.
 .El
 .Sh IMPLEMENTATION DETAILS
 On all architectures

Modified: head/sys/kern/subr_counter.c
==============================================================================
--- head/sys/kern/subr_counter.c	Mon Mar 14 23:49:16 2016	(r296879)
+++ head/sys/kern/subr_counter.c	Tue Mar 15 00:05:00 2016	(r296880)
@@ -94,3 +94,27 @@ sysctl_handle_counter_u64(SYSCTL_HANDLER
 
 	return (0);
 }
+
+int
+sysctl_handle_counter_u64_array(SYSCTL_HANDLER_ARGS)
+{
+	uint64_t *out;
+	int error;
+
+	out = malloc(arg2 * sizeof(uint64_t), M_TEMP, M_WAITOK);
+	for (int i = 0; i < arg2; i++)
+		out[i] = counter_u64_fetch(((counter_u64_t *)arg1)[i]);
+
+	error = SYSCTL_OUT(req, out, arg2 * sizeof(uint64_t));
+
+	if (error || !req->newptr)
+		return (error);
+
+	/*
+	 * Any write attempt to a counter zeroes it.
+	 */
+	for (int i = 0; i < arg2; i++)
+		counter_u64_zero(((counter_u64_t *)arg1)[i]);
+ 
+	return (0);
+}

Modified: head/sys/sys/sysctl.h
==============================================================================
--- head/sys/sys/sysctl.h	Mon Mar 14 23:49:16 2016	(r296879)
+++ head/sys/sys/sysctl.h	Tue Mar 15 00:05:00 2016	(r296880)
@@ -204,6 +204,7 @@ int sysctl_handle_long(SYSCTL_HANDLER_AR
 int sysctl_handle_string(SYSCTL_HANDLER_ARGS);
 int sysctl_handle_opaque(SYSCTL_HANDLER_ARGS);
 int sysctl_handle_counter_u64(SYSCTL_HANDLER_ARGS);
+int sysctl_handle_counter_u64_array(SYSCTL_HANDLER_ARGS);
 
 int sysctl_handle_uma_zone_max(SYSCTL_HANDLER_ARGS);
 int sysctl_handle_uma_zone_cur(SYSCTL_HANDLER_ARGS);
@@ -648,6 +649,26 @@ TAILQ_HEAD(sysctl_ctx_list, sysctl_ctx_e
 	    __ptr, 0, sysctl_handle_counter_u64, "QU", __DESCR(descr));	\
 })
 
+/* Oid for an array of counter(9)s.  The pointer and length must be non zero. */
+#define	SYSCTL_COUNTER_U64_ARRAY(parent, nbr, name, access, ptr, len, descr) \
+	SYSCTL_OID(parent, nbr, name,					\
+	    CTLTYPE_OPAQUE | CTLFLAG_MPSAFE | (access),			\
+	    (ptr), (len), sysctl_handle_counter_u64_array, "S", descr);	\
+	CTASSERT(((access) & CTLTYPE) == 0 ||				\
+	    ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE)
+
+#define	SYSCTL_ADD_COUNTER_U64_ARRAY(ctx, parent, nbr, name, access,	\
+    ptr, len, descr)							\
+({									\
+	counter_u64_t *__ptr = (ptr);					\
+	CTASSERT(((access) & CTLTYPE) == 0 ||				\
+	    ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE);	\
+	sysctl_add_oid(ctx, parent, nbr, name,				\
+	    CTLTYPE_OPAQUE | CTLFLAG_MPSAFE | (access),			\
+	    __ptr, len, sysctl_handle_counter_u64_array, "S",		\
+	    __DESCR(descr));						\
+})
+
 /* Oid for an opaque object.  Specified by a pointer and a length. */
 #define	SYSCTL_OPAQUE(parent, nbr, name, access, ptr, len, fmt, descr)	\
 	SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access),		\


More information about the svn-src-all mailing list