Subject: work in progress: network info commpage
To: None <tech-net@netbsd.org>
From: David Young <dyoung@pobox.com>
List: tech-net
Date: 12/10/2007 18:55:09
--oyUTqETQ0mS9luUI
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

I am working to speed up getifaddrs(3) by caching results in userland.
The kernel counts changes to ifaddrs, and shares its counter with
userland through a shared page of memory.  Userland discards its cache
if the counter has changed since the last getifaddrs(3) call.  I have
attached my sources for this.

By using cached results, getifaddrs(3) avoids two system calls
(sysctl).  That can lower CPU overhead if you sockaddr_snprintf()
hundreds of IPv6 addresses with scope identifiers to produce a
diagnostic log, as I was doing.  (FYI, sockaddr_snprintf calls
getnameinfo->if_indextoname->getifaddrs.)

I haven't run any performance tests, yet.

My getifaddrs(3) changes are not thread-safe.  It will be easy enough
to use a rwlock to protect the cache.

Dave

-- 
David Young             OJC Technologies
dyoung@ojctech.com      Urbana, IL * (217) 278-3933 ext 24

--oyUTqETQ0mS9luUI
Content-Type: application/x-gzip
Content-Disposition: attachment; filename="neticp.tgz"
Content-Transfer-Encoding: base64

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
MGDA4G3gX/4jdZQAUAAA

--oyUTqETQ0mS9luUI
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="neticp.patch"

Index: distrib/sets/lists/comp/mi
===================================================================
RCS file: /cvsroot/src/distrib/sets/lists/comp/mi,v
retrieving revision 1.1091
diff -p -u -u -p -r1.1091 mi
--- distrib/sets/lists/comp/mi	21 Nov 2007 22:49:05 -0000	1.1091
+++ distrib/sets/lists/comp/mi	10 Dec 2007 23:10:41 -0000
@@ -1347,6 +1347,7 @@
 ./usr/include/net/if_tun.h			comp-c-include
 ./usr/include/net/if_types.h			comp-c-include
 ./usr/include/net/if_vlanvar.h			comp-c-include
+./usr/include/net/neticpio.h			comp-c-include
 ./usr/include/net/netisr.h			comp-c-include
 ./usr/include/net/pfil.h			comp-c-include
 ./usr/include/net/pfkeyv2.h			comp-c-include
Index: etc/MAKEDEV.tmpl
===================================================================
RCS file: /cvsroot/src/etc/MAKEDEV.tmpl,v
retrieving revision 1.91
diff -p -u -u -p -r1.91 MAKEDEV.tmpl
--- etc/MAKEDEV.tmpl	20 Nov 2007 18:58:46 -0000	1.91
+++ etc/MAKEDEV.tmpl	10 Dec 2007 23:10:53 -0000
@@ -1674,6 +1674,10 @@ drvctl)
 	mkdev drvctl c %drvctl_chr% 0 644
 	;;
 
+neticp)
+	mkdev neticp c %neticp_chr% 0 644
+	;;
+
 tap*)
 	unit=${i#tap}
 	case "$unit" in
Index: lib/libc/net/Makefile.inc
===================================================================
RCS file: /cvsroot/src/lib/libc/net/Makefile.inc,v
retrieving revision 1.72
diff -p -u -u -p -r1.72 Makefile.inc
--- lib/libc/net/Makefile.inc	9 Aug 2007 15:23:02 -0000	1.72
+++ lib/libc/net/Makefile.inc	10 Dec 2007 23:13:21 -0000
@@ -5,6 +5,7 @@
 .PATH: ${ARCHDIR}/net ${.CURDIR}/net
 
 SRCS+=	__cmsg_alignbytes.c base64.c ethers.c gethnamaddr.c getifaddrs.c \
+	getifaddrs2.c \
 	getnetnamadr.c getnetent.c getpeereid.c \
 	getprotobyname.c getprotobynumber.c getprotoent.c \
 	getprotobyname_r.c getprotobynumber_r.c getprotoent_r.c \
Index: lib/libc/net/getifaddrs.c
===================================================================
RCS file: /cvsroot/src/lib/libc/net/getifaddrs.c,v
retrieving revision 1.11
diff -p -u -u -p -r1.11 getifaddrs.c
--- lib/libc/net/getifaddrs.c	6 Dec 2007 22:51:57 -0000	1.11
+++ lib/libc/net/getifaddrs.c	10 Dec 2007 23:13:22 -0000
@@ -47,6 +47,8 @@ __RCSID("$NetBSD: getifaddrs.c,v 1.11 20
 #include <string.h>
 
 #ifdef __weak_alias
+__weak_alias(_getifaddrs,__getifaddrs)
+__weak_alias(_freeifaddrs,__freeifaddrs)
 __weak_alias(getifaddrs,_getifaddrs)
 __weak_alias(freeifaddrs,_freeifaddrs)
 #endif
@@ -54,8 +56,11 @@ __weak_alias(freeifaddrs,_freeifaddrs)
 #define	SALIGN	(sizeof(long) - 1)
 #define	SA_RLEN(sa)	((sa)->sa_len ? (((sa)->sa_len + SALIGN) & ~SALIGN) : (SALIGN + 1))
 
+int __getifaddrs(struct ifaddrs **);
+void __freeifaddrs(struct ifaddrs *);
+
 int
-getifaddrs(struct ifaddrs **pif)
+__getifaddrs(struct ifaddrs **pif)
 {
 	int icnt = 1;
 	int dcnt = 0;
@@ -286,7 +291,7 @@ getifaddrs(struct ifaddrs **pif)
 }
 
 void
-freeifaddrs(struct ifaddrs *ifp)
+__freeifaddrs(struct ifaddrs *ifp)
 {
 
 	_DIAGASSERT(ifp != NULL);
Index: sys/arch/i386/conf/ALL
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/conf/ALL,v
retrieving revision 1.142
diff -p -u -u -p -r1.142 ALL
--- sys/arch/i386/conf/ALL	20 Nov 2007 18:54:31 -0000	1.142
+++ sys/arch/i386/conf/ALL	10 Dec 2007 23:14:10 -0000
@@ -1471,6 +1471,9 @@ options 	FILEASSOC		# fileassoc(9) - req
 # Veriexec
 pseudo-device	veriexec
 
+# neticp - network common page
+pseudo-device	neticp
+
 # drvctl - needed to show device dictionary via drvctl(8)
 pseudo-device	drvctl
 
Index: sys/conf/files
===================================================================
RCS file: /cvsroot/src/sys/conf/files,v
retrieving revision 1.875
diff -p -u -u -p -r1.875 files
--- sys/conf/files	20 Nov 2007 18:54:31 -0000	1.875
+++ sys/conf/files	10 Dec 2007 23:14:30 -0000
@@ -1222,6 +1222,10 @@ defpseudo fwiso:	ieee1394
 defpseudo drvctl
 file	kern/kern_drvctl.c		drvctl
 
+# network common page
+defpseudo neticp
+file	net/neticpio.c		neticp
+
 # cpu control
 defpseudo cpuctl
 
@@ -1460,6 +1464,7 @@ file	net/bpf.c			bpfilter		needs-flag
 file	net/bpf_filter.c		bpf_filter
 file	net/bsd-comp.c			ppp & ppp_bsdcomp
 file	net/if.c
+file	net/neticp.c
 file	net/if_arcsubr.c		arcnet			needs-flag
 file	net/if_atmsubr.c		atm
 file	net/if_bridge.c			bridge			needs-flag
Index: sys/conf/majors
===================================================================
RCS file: /cvsroot/src/sys/conf/majors,v
retrieving revision 1.38
diff -p -u -u -p -r1.38 majors
--- sys/conf/majors	13 Nov 2007 13:13:10 -0000	1.38
+++ sys/conf/majors	10 Dec 2007 23:14:30 -0000
@@ -34,3 +34,4 @@ device-major	bio		char 181		bio
 device-major	twa		char 187		twa
 device-major	cpuctl		char 188
 device-major	pad		char 189		pad
+device-major	neticp		char 190		neticp
Index: sys/net/Makefile
===================================================================
RCS file: /cvsroot/src/sys/net/Makefile,v
retrieving revision 1.22
diff -p -u -u -p -r1.22 Makefile
--- sys/net/Makefile	13 Jan 2007 14:13:54 -0000	1.22
+++ sys/net/Makefile	10 Dec 2007 23:15:12 -0000
@@ -7,7 +7,8 @@ INCS=	bpf.h bpfdesc.h dlt.h ethertypes.h
 	if_gre.h if_hippi.h if_ieee1394.h if_llc.h if_media.h \
 	if_pflog.h if_ppp.h if_pppoe.h if_sppp.h if_srt.h if_stf.h \
 	if_tap.h if_token.h if_tun.h if_types.h if_vlanvar.h \
-	netisr.h pfil.h pfkeyv2.h pfvar.h ppp-comp.h ppp_defs.h radix.h \
+	neticpio.h netisr.h \
+	pfil.h pfkeyv2.h pfvar.h ppp-comp.h ppp_defs.h radix.h \
 	raw_cb.h route.h slcompress.h slip.h zlib.h
 
 .include <bsd.kinc.mk>
Index: sys/net/if.c
===================================================================
RCS file: /cvsroot/src/sys/net/if.c,v
retrieving revision 1.208
diff -p -u -u -p -r1.208 if.c
--- sys/net/if.c	6 Dec 2007 02:23:42 -0000	1.208
+++ sys/net/if.c	10 Dec 2007 23:15:14 -0000
@@ -129,6 +129,7 @@ __KERNEL_RCSID(0, "$NetBSD: if.c,v 1.208
 #include <net/if_types.h>
 #include <net/radix.h>
 #include <net/route.h>
+#include <net/neticp.h>
 #include <net/netisr.h>
 #ifdef NETATALK
 #include <netatalk/at_extern.h>
@@ -904,6 +911,8 @@ ifa_insert(struct ifnet *ifp, struct ifa
 	ifa->ifa_ifp = ifp;
 	TAILQ_INSERT_TAIL(&ifp->if_addrlist, ifa, ifa_list);
 	IFAREF(ifa);
+	if (neticp_commpage != NULL)
+		neticp_commpage->ni_ifaddrs_gen++;
 }
 
 void
@@ -912,6 +921,8 @@ ifa_remove(struct ifnet *ifp, struct ifa
 	KASSERT(ifa->ifa_ifp == ifp);
 	TAILQ_REMOVE(&ifp->if_addrlist, ifa, ifa_list);
 	IFAFREE(ifa);
+	if (neticp_commpage != NULL)
+		neticp_commpage->ni_ifaddrs_gen++;
 }
 
 static inline int

--oyUTqETQ0mS9luUI--