svn commit: r253082 - in head/sys: net sys

Andrey V. Elsukov ae at FreeBSD.org
Tue Jul 9 09:37:22 UTC 2013


Author: ae
Date: Tue Jul  9 09:37:21 2013
New Revision: 253082
URL: http://svnweb.freebsd.org/changeset/base/253082

Log:
  Add several macros to help migrate statistics structures to PCPU counters.

Modified:
  head/sys/net/vnet.h
  head/sys/sys/counter.h

Modified: head/sys/net/vnet.h
==============================================================================
--- head/sys/net/vnet.h	Tue Jul  9 09:32:06 2013	(r253081)
+++ head/sys/net/vnet.h	Tue Jul  9 09:37:21 2013	(r253082)
@@ -85,6 +85,55 @@ struct vnet {
 
 #ifdef _KERNEL
 
+#define	VNET_PCPUSTAT_DECLARE(type, name)	\
+    VNET_DECLARE(counter_u64_t, name[sizeof(type) / sizeof(uint64_t)])
+
+#define	VNET_PCPUSTAT_DEFINE(type, name)	\
+    VNET_DEFINE(counter_u64_t, name[sizeof(type) / sizeof(uint64_t)])
+
+#define	VNET_PCPUSTAT_ALLOC(name, wait)	\
+    COUNTER_ARRAY_ALLOC(VNET(name), \
+	sizeof(VNET(name)) / sizeof(counter_u64_t), (wait))
+
+#define	VNET_PCPUSTAT_FREE(name)	\
+    COUNTER_ARRAY_FREE(VNET(name), sizeof(VNET(name)) / sizeof(counter_u64_t))
+
+#define	VNET_PCPUSTAT_ADD(type, name, f, v)	\
+    counter_u64_add(VNET(name)[offsetof(type, f) / sizeof(uint64_t)], (v))
+
+#define	VNET_PCPUSTAT_SYSINIT(name)	\
+static void				\
+vnet_##name##_init(const void *unused)	\
+{					\
+	VNET_PCPUSTAT_ALLOC(name, M_WAITOK);	\
+}					\
+VNET_SYSINIT(vnet_ ## name ## _init, SI_SUB_PROTO_IFATTACHDOMAIN,	\
+    SI_ORDER_ANY, vnet_ ## name ## _init, NULL)
+
+#define	VNET_PCPUSTAT_SYSUNINIT(name)					\
+static void								\
+vnet_##name##_uninit(const void *unused)				\
+{									\
+	VNET_PCPUSTAT_FREE(name);					\
+}									\
+VNET_SYSUNINIT(vnet_ ## name ## _uninit, SI_SUB_PROTO_IFATTACHDOMAIN,	\
+    SI_ORDER_ANY, vnet_ ## name ## _uninit, NULL)
+
+#define	SYSCTL_VNET_PCPUSTAT(parent, nbr, name, type, array, desc)	\
+static int								\
+array##_sysctl(SYSCTL_HANDLER_ARGS)					\
+{									\
+	type s;								\
+	CTASSERT(sizeof(type) == sizeof(VNET(array)));			\
+	COUNTER_ARRAY_COPY(VNET(array), &s, sizeof(type) / sizeof(uint64_t));\
+	if (req->newptr)						\
+		COUNTER_ARRAY_ZERO(VNET(array),				\
+		    sizeof(type) / sizeof(uint64_t));			\
+	return (SYSCTL_OUT(req, &s, sizeof(type)));			\
+}									\
+SYSCTL_VNET_PROC(parent, nbr, name, CTLTYPE_OPAQUE | CTLFLAG_RW, NULL,	\
+    0, array ## _sysctl, "I", desc)
+
 #ifdef VIMAGE
 #include <sys/lock.h>
 #include <sys/proc.h>			/* for struct thread */

Modified: head/sys/sys/counter.h
==============================================================================
--- head/sys/sys/counter.h	Tue Jul  9 09:32:06 2013	(r253081)
+++ head/sys/sys/counter.h	Tue Jul  9 09:37:21 2013	(r253082)
@@ -39,4 +39,23 @@ void		counter_u64_free(counter_u64_t);
 void		counter_u64_zero(counter_u64_t);
 uint64_t	counter_u64_fetch(counter_u64_t);
 
+#define	COUNTER_ARRAY_ALLOC(a, n, wait)	do {			\
+	for (int i = 0; i < (n); i++)				\
+		(a)[i] = counter_u64_alloc(wait);		\
+} while (0)
+
+#define	COUNTER_ARRAY_FREE(a, n)	do {			\
+	for (int i = 0; i < (n); i++)				\
+		counter_u64_free((a)[i]);			\
+} while (0)
+
+#define	COUNTER_ARRAY_COPY(a, dstp, n)	do {			\
+	for (int i = 0; i < (n); i++)				\
+		((uint64_t *)(dstp))[i] = counter_u64_fetch((a)[i]);\
+} while (0)
+
+#define	COUNTER_ARRAY_ZERO(a, n)	do {			\
+	for (int i = 0; i < (n); i++)				\
+		counter_u64_zero((a)[i]);			\
+} while (0)
 #endif	/* ! __SYS_COUNTER_H__ */


More information about the svn-src-head mailing list