Date: Wed, 18 Feb 2009 16:45:13 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 157896 for review Message-ID: <200902181645.n1IGjDww078742@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=157896 Change 157896 by zec@zec_amdx2 on 2009/02/18 16:44:56 First pass at simplifying the initializer infrastructure. Define IS_DEFAULT_VNET() macro to always return true for non-VIMAGE builds, which paves the path for removal of many #ifdef VIMAGE lines in initializer functions. Consistently allocate a uma zone pool for each vnet subsystem, where needed. This might not be the most memory efficient strategy, but ATM releives us of the issue of handling overcommited zone pools shared by multiple vnets. OTOH we still haven't addressed the issue of potential uma_zcreate() failures on vnet creation. While here, nuke struct uma_zone *divcbzone, as it seems that no code uses / references it. Hmm. TODO: inet6, ipsec etc. Affected files ... .. //depot/projects/vimage/src/sys/net/if.c#65 edit .. //depot/projects/vimage/src/sys/net/if_loop.c#37 edit .. //depot/projects/vimage/src/sys/netinet/igmp.c#24 edit .. //depot/projects/vimage/src/sys/netinet/ip_divert.c#26 edit .. //depot/projects/vimage/src/sys/netinet/ip_input.c#47 edit .. //depot/projects/vimage/src/sys/netinet/raw_ip.c#40 edit .. //depot/projects/vimage/src/sys/netinet/tcp_sack.c#18 edit .. //depot/projects/vimage/src/sys/netinet/tcp_subr.c#73 edit .. //depot/projects/vimage/src/sys/netinet/tcp_timewait.c#26 edit .. //depot/projects/vimage/src/sys/netinet/udp_usrreq.c#48 edit .. //depot/projects/vimage/src/sys/netinet/vinet.h#45 edit .. //depot/projects/vimage/src/sys/sys/vimage.h#78 edit Differences ... ==== //depot/projects/vimage/src/sys/net/if.c#65 (text+ko) ==== @@ -661,17 +661,13 @@ mac_ifnet_create(ifp); #endif -#ifdef VIMAGE if (IS_DEFAULT_VNET(curvnet)) { -#endif - ifdev_setbyindex(ifp->if_index, make_dev(&net_cdevsw, - ifp->if_index, UID_ROOT, GID_WHEEL, 0600, "%s/%s", - net_cdevsw.d_name, ifp->if_xname)); - make_dev_alias(ifdev_byindex(ifp->if_index), "%s%d", - net_cdevsw.d_name, ifp->if_index); -#ifdef VIMAGE + ifdev_setbyindex(ifp->if_index, make_dev(&net_cdevsw, + ifp->if_index, UID_ROOT, GID_WHEEL, 0600, "%s/%s", + net_cdevsw.d_name, ifp->if_xname)); + make_dev_alias(ifdev_byindex(ifp->if_index), "%s%d", + net_cdevsw.d_name, ifp->if_index); } -#endif ifq_attach(&ifp->if_snd, ifp); @@ -723,10 +719,8 @@ if_attachdomain1(ifp); EVENTHANDLER_INVOKE(ifnet_arrival_event, ifp); -#ifdef VIMAGE if (IS_DEFAULT_VNET(curvnet)) -#endif - devctl_notify("IFNET", ifp->if_xname, "ATTACH", NULL); + devctl_notify("IFNET", ifp->if_xname, "ATTACH", NULL); /* Announce the interface. */ rt_ifannouncemsg(ifp, IFAN_ARRIVAL); @@ -931,13 +925,8 @@ * Clean up all addresses. */ ifp->if_addr = NULL; -#ifdef VIMAGE - if (IS_DEFAULT_VNET(curvnet)) { -#endif - destroy_dev(ifdev_byindex(ifp->if_index)); -#ifdef VIMAGE - } -#endif + if (IS_DEFAULT_VNET(curvnet)) + destroy_dev(ifdev_byindex(ifp->if_index)); ifdev_setbyindex(ifp->if_index, NULL); /* We can now free link ifaddr. */ @@ -966,10 +955,8 @@ /* Announce that the interface is gone. */ rt_ifannouncemsg(ifp, IFAN_DEPARTURE); EVENTHANDLER_INVOKE(ifnet_departure_event, ifp); -#ifdef VIMAGE if (IS_DEFAULT_VNET(curvnet)) -#endif - devctl_notify("IFNET", ifp->if_xname, "DETACH", NULL); + devctl_notify("IFNET", ifp->if_xname, "DETACH", NULL); IF_AFDATA_LOCK(ifp); for (dp = domains; dp; dp = dp->dom_next) { @@ -1633,11 +1620,10 @@ (*lagg_linkstate_p)(ifp, link_state); } -#ifdef VIMAGE if (IS_DEFAULT_VNET(curvnet)) -#endif - devctl_notify("IFNET", ifp->if_xname, - (link_state == LINK_STATE_UP) ? "LINK_UP" : "LINK_DOWN", NULL); + devctl_notify("IFNET", ifp->if_xname, + (link_state == LINK_STATE_UP) ? "LINK_UP" : "LINK_DOWN", + NULL); if (pending > 1) if_printf(ifp, "%d link states coalesced\n", pending); if (log_link_state_change) ==== //depot/projects/vimage/src/sys/net/if_loop.c#37 (text+ko) ==== @@ -185,14 +185,10 @@ INIT_VNET_NET(curvnet); LIST_INIT(&V_lo_list); -#ifdef VIMAGE if (IS_DEFAULT_VNET(curvnet)) if_clone_attach(&lo_cloner); else lo_cloner.ifc_attach(&lo_cloner); -#else - if_clone_attach(&lo_cloner); -#endif return 0; } ==== //depot/projects/vimage/src/sys/netinet/igmp.c#24 (text+ko) ==== @@ -125,9 +125,11 @@ INIT_VNET_INET(curvnet); struct ipoption *ra; -#ifdef VIMAGE - if (IS_DEFAULT_VNET(curvnet)) { -#endif + SLIST_INIT(&V_router_info_head); + + if (!IS_DEFAULT_VNET(curvnet)) + return; + /* * To avoid byte-swapping the same value over and over again. */ @@ -149,11 +151,6 @@ router_alert->m_len = sizeof(ra->ipopt_dst) + ra->ipopt_list[1]; mtx_init(&igmp_mtx, "igmp_mtx", NULL, MTX_DEF); -#ifdef VIMAGE - } -#endif - - SLIST_INIT(&V_router_info_head); } static struct router_info * ==== //depot/projects/vimage/src/sys/netinet/ip_divert.c#26 (text+ko) ==== @@ -122,56 +122,16 @@ static struct inpcbhead divcb; static struct inpcbinfo divcbinfo; #endif -static struct uma_zone *divcbzone; static u_long div_sendspace = DIVSNDQ; /* XXX sysctl ? */ static u_long div_recvspace = DIVRCVQ; /* XXX sysctl ? */ -/* - * Initialize divert connection block queue. - */ -static void -div_zone_change(void *tag) -{ - - uma_zone_set_max(divcbzone, maxsockets); -} - -static int -div_inpcb_init(void *mem, int size, int flags) -{ - struct inpcb *inp = mem; - - INP_LOCK_INIT(inp, "inp", "divinp"); - return (0); -} - -static void -div_inpcb_fini(void *mem, int size) -{ - struct inpcb *inp = mem; - - INP_LOCK_DESTROY(inp); -} - void div_init(void) { INIT_VNET_INET(curvnet); -#ifdef VIMAGE - if (IS_DEFAULT_VNET(curvnet)) { -#endif - divcbzone = uma_zcreate("divcb", sizeof(struct inpcb), - NULL, NULL, div_inpcb_init, div_inpcb_fini, UMA_ALIGN_PTR, - UMA_ZONE_NOFREE); - uma_zone_set_max(divcbzone, maxsockets); - EVENTHANDLER_REGISTER(maxsockets_change, div_zone_change, - NULL, EVENTHANDLER_PRI_ANY); -#ifdef VIMAGE - } V_divcbinfo.ipi_vnet = curvnet; -#endif INP_INFO_LOCK_INIT(&V_divcbinfo, "div"); LIST_INIT(&V_divcb); V_divcbinfo.ipi_listhead = &V_divcb; @@ -727,7 +687,7 @@ static int div_modevent(module_t mod, int type, void *unused) { - INIT_VNET_INET(curvnet); /* XXX fixme! */ + INIT_VNET_INET(curvnet); /* XXX fixme! MARKO */ int err = 0; int n; @@ -772,7 +732,6 @@ err = pf_proto_unregister(PF_INET, IPPROTO_DIVERT, SOCK_RAW); INP_INFO_WUNLOCK(&V_divcbinfo); INP_INFO_LOCK_DESTROY(&V_divcbinfo); - uma_zdestroy(divcbzone); break; default: err = EOPNOTSUPP; ==== //depot/projects/vimage/src/sys/netinet/ip_input.c#47 (text+ko) ==== @@ -294,11 +294,11 @@ NULL, UMA_ALIGN_PTR, 0); maxnipq_update(); -#ifdef VIMAGE + V_ip_id = time_second & 0xffff; + /* Skip initialization of globals for non-default instances. */ if (!IS_DEFAULT_VNET(curvnet)) return; -#endif pr = pffindproto(PF_INET, IPPROTO_RAW, SOCK_RAW); if (pr == NULL) @@ -337,7 +337,6 @@ /* Initialize various other remaining things. */ IPQ_LOCK_INIT(); - V_ip_id = time_second & 0xffff; ipintrq.ifq_maxlen = ipqmaxlen; mtx_init(&ipintrq.ifq_mtx, "ip_inq", NULL, MTX_DEF); netisr_register(NETISR_IP, ip_input, &ipintrq, 0); ==== //depot/projects/vimage/src/sys/netinet/raw_ip.c#40 (text+ko) ==== @@ -82,8 +82,8 @@ #ifdef VIMAGE_GLOBALS struct inpcbhead ripcb; struct inpcbinfo ripcbinfo; +static struct uma_zone *ripcb_zone; #endif -static struct uma_zone *ripcb_zone; /* control hooks for ipfw and dummynet */ ip_fw_ctl_t *ip_fw_ctl_ptr = NULL; @@ -185,15 +185,9 @@ { INIT_VNET_INET(curvnet); -#ifdef VIMAGE - if (IS_DEFAULT_VNET(curvnet)) { -#endif - ripcb_zone = uma_zcreate("ripcb", sizeof(struct inpcb), + V_ripcb_zone = uma_zcreate("ripcb", sizeof(struct inpcb), NULL, NULL, rip_inpcb_init, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); -#ifdef VIMAGE - } V_ripcbinfo.ipi_vnet = curvnet; -#endif INP_INFO_LOCK_INIT(&V_ripcbinfo, "rip"); LIST_INIT(&V_ripcb); @@ -202,7 +196,7 @@ hashinit(INP_PCBHASH_RAW_SIZE, M_PCB, &V_ripcbinfo.ipi_hashmask); V_ripcbinfo.ipi_porthashbase = hashinit(1, M_PCB, &V_ripcbinfo.ipi_porthashmask); - V_ripcbinfo.ipi_zone = ripcb_zone; + V_ripcbinfo.ipi_zone = V_ripcb_zone; uma_zone_set_max(V_ripcbinfo.ipi_zone, maxsockets); EVENTHANDLER_REGISTER(maxsockets_change, rip_zone_change, NULL, EVENTHANDLER_PRI_ANY); ==== //depot/projects/vimage/src/sys/netinet/tcp_sack.c#18 (text+ko) ==== @@ -123,9 +123,8 @@ #include <machine/in_cksum.h> +#ifdef VIMAGE_GLOBALS extern struct uma_zone *sack_hole_zone; - -#ifdef VIMAGE_GLOBALS int tcp_do_sack; int tcp_sack_maxholes; int tcp_sack_globalmaxholes; @@ -265,7 +264,7 @@ return NULL; } - hole = (struct sackhole *)uma_zalloc(sack_hole_zone, M_NOWAIT); + hole = (struct sackhole *)uma_zalloc(V_sack_hole_zone, M_NOWAIT); if (hole == NULL) return NULL; @@ -287,7 +286,7 @@ { INIT_VNET_INET(tp->t_vnet); - uma_zfree(sack_hole_zone, hole); + uma_zfree(V_sack_hole_zone, hole); tp->snd_numholes--; V_tcp_sack_globalholes--; ==== //depot/projects/vimage/src/sys/netinet/tcp_subr.c#73 (text+ko) ==== @@ -269,7 +269,6 @@ struct tcp_timer tt; }; -static uma_zone_t tcpcb_zone; MALLOC_DEFINE(M_TCPLOG, "tcplog", "TCP address and flags print buffers"); struct callout isn_callout; static struct mtx isn_mtx; @@ -278,7 +277,10 @@ #define ISN_LOCK() mtx_lock(&isn_mtx) #define ISN_UNLOCK() mtx_unlock(&isn_mtx) +#ifdef VIMAGE_GLOBALS +static uma_zone_t tcpcb_zone; static struct uma_zone *tcp_ipi_zone; +#endif /* * TCP initialization. @@ -286,9 +288,10 @@ static void tcp_zone_change(void *tag) { + INIT_VNET_INET(curvnet); /* XXX */ - uma_zone_set_max(tcp_ipi_zone, maxsockets); - uma_zone_set_max(tcpcb_zone, maxsockets); + uma_zone_set_max(V_tcp_ipi_zone, maxsockets); + uma_zone_set_max(V_tcpcb_zone, maxsockets); tcp_tw_zone_change(); } @@ -344,23 +347,17 @@ V_tcp_autosndbuf_max = 256*1024; -#ifdef VIMAGE - if (IS_DEFAULT_VNET(curvnet)) { -#endif - tcp_ipi_zone = uma_zcreate("inpcb", sizeof(struct inpcb), + V_tcp_ipi_zone = uma_zcreate("inpcb", sizeof(struct inpcb), NULL, NULL, tcp_inpcb_init, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); - uma_zone_set_max(tcp_ipi_zone, maxsockets); + uma_zone_set_max(V_tcp_ipi_zone, maxsockets); /* * These have to be type stable for the benefit of the timers. */ - tcpcb_zone = uma_zcreate("tcpcb", sizeof(struct tcpcb_mem), + V_tcpcb_zone = uma_zcreate("tcpcb", sizeof(struct tcpcb_mem), NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); - uma_zone_set_max(tcpcb_zone, maxsockets); - sack_hole_zone = uma_zcreate("sackhole", sizeof(struct sackhole), + uma_zone_set_max(V_tcpcb_zone, maxsockets); + V_sack_hole_zone = uma_zcreate("sackhole", sizeof(struct sackhole), NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); -#ifdef VIMAGE - } -#endif tcp_tw_init(); @@ -398,7 +395,7 @@ &V_tcbinfo.ipi_hashmask); V_tcbinfo.ipi_porthashbase = hashinit(hashsize, M_PCB, &V_tcbinfo.ipi_porthashmask); - V_tcbinfo.ipi_zone = tcp_ipi_zone; + V_tcbinfo.ipi_zone = V_tcp_ipi_zone; V_tcbinfo.ipi_vnet = curvnet; #ifdef INET6 #define TCP_MINPROTOHDR (sizeof(struct ip6_hdr) + sizeof(struct tcphdr)) @@ -413,13 +410,11 @@ syncache_init(); tcp_hc_init(); + tcp_reass_init(); -#ifdef VIMAGE if (!IS_DEFAULT_VNET(curvnet)) return; -#endif - tcp_reass_init(); ISN_LOCK_INIT(); callout_init(&isn_callout, CALLOUT_MPSAFE); callout_reset(&isn_callout, 1, tcp_isn_tick, NULL); @@ -723,7 +718,7 @@ int isipv6 = (inp->inp_vflag & INP_IPV6) != 0; #endif /* INET6 */ - tm = uma_zalloc(tcpcb_zone, M_NOWAIT | M_ZERO); + tm = uma_zalloc(V_tcpcb_zone, M_NOWAIT | M_ZERO); if (tm == NULL) return (NULL); tp = &tm->tcb; @@ -896,7 +891,7 @@ tcp_free_sackholes(tp); inp->inp_ppcb = NULL; tp->t_inpcb = NULL; - uma_zfree(tcpcb_zone, tp); + uma_zfree(V_tcpcb_zone, tp); } /* ==== //depot/projects/vimage/src/sys/netinet/tcp_timewait.c#26 (text+ko) ==== @@ -94,7 +94,6 @@ #include <security/mac/mac_framework.h> -static uma_zone_t tcptw_zone; static int maxtcptw; /* @@ -104,6 +103,7 @@ * tcbinfo lock, which must be held over queue iteration and modification. */ #ifdef VIMAGE_GLOBALS +static uma_zone_t tcptw_zone; static TAILQ_HEAD(, tcptw) twq_2msl; int nolocaltimewait; #endif @@ -132,6 +132,7 @@ static int sysctl_maxtcptw(SYSCTL_HANDLER_ARGS) { + INIT_VNET_INET(curvnet); int error, new; if (maxtcptw == 0) @@ -142,7 +143,7 @@ if (error == 0 && req->newptr) if (new >= 32) { maxtcptw = new; - uma_zone_set_max(tcptw_zone, maxtcptw); + uma_zone_set_max(V_tcptw_zone, maxtcptw); } return (error); } @@ -158,9 +159,10 @@ void tcp_tw_zone_change(void) { + INIT_VNET_INET(curvnet); /* XXX */ if (maxtcptw == 0) - uma_zone_set_max(tcptw_zone, tcptw_auto_size()); + uma_zone_set_max(V_tcptw_zone, tcptw_auto_size()); } void @@ -170,18 +172,13 @@ TAILQ_INIT(&V_twq_2msl); -#ifdef VIMAGE - if (!IS_DEFAULT_VNET(curvnet)) - return; -#endif - - tcptw_zone = uma_zcreate("tcptw", sizeof(struct tcptw), + V_tcptw_zone = uma_zcreate("tcptw", sizeof(struct tcptw), NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); TUNABLE_INT_FETCH("net.inet.tcp.maxtcptw", &maxtcptw); if (maxtcptw == 0) - uma_zone_set_max(tcptw_zone, tcptw_auto_size()); + uma_zone_set_max(V_tcptw_zone, tcptw_auto_size()); else - uma_zone_set_max(tcptw_zone, maxtcptw); + uma_zone_set_max(V_tcptw_zone, maxtcptw); } #ifdef VIMAGE @@ -224,7 +221,7 @@ return; } - tw = uma_zalloc(tcptw_zone, M_NOWAIT); + tw = uma_zalloc(V_tcptw_zone, M_NOWAIT); if (tw == NULL) { tw = tcp_tw_2msl_scan(1); if (tw == NULL) { @@ -542,7 +539,7 @@ tw->tw_cred = NULL; if (reuse) return; - uma_zfree(tcptw_zone, tw); + uma_zfree(V_tcptw_zone, tw); } int ==== //depot/projects/vimage/src/sys/netinet/udp_usrreq.c#48 (text+ko) ==== @@ -152,13 +152,16 @@ static int udp_output(struct inpcb *, struct mbuf *, struct sockaddr *, struct mbuf *, struct thread *); +#ifdef VIMAGE_GLOBALS static struct uma_zone *udp_ipi_zone; +#endif static void udp_zone_change(void *tag) { + INIT_VNET_INET(curvnet); /* XXX */ - uma_zone_set_max(udp_ipi_zone, maxsockets); + uma_zone_set_max(V_udp_ipi_zone, maxsockets); } static int @@ -178,18 +181,12 @@ V_udp_blackhole = 0; -#ifdef VIMAGE - if (IS_DEFAULT_VNET(curvnet)) { -#endif - udp_ipi_zone = uma_zcreate("udpcb", sizeof(struct inpcb), NULL, + V_udp_ipi_zone = uma_zcreate("udpcb", sizeof(struct inpcb), NULL, NULL, udp_inpcb_init, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); - uma_zone_set_max(udp_ipi_zone, maxsockets); + uma_zone_set_max(V_udp_ipi_zone, maxsockets); EVENTHANDLER_REGISTER(maxsockets_change, udp_zone_change, NULL, EVENTHANDLER_PRI_ANY); -#ifdef VIMAGE - } V_udbinfo.ipi_vnet = curvnet; -#endif INP_INFO_LOCK_INIT(&V_udbinfo, "udp"); LIST_INIT(&V_udb); @@ -198,7 +195,7 @@ &V_udbinfo.ipi_hashmask); V_udbinfo.ipi_porthashbase = hashinit(UDBHASHSIZE, M_PCB, &V_udbinfo.ipi_porthashmask); - V_udbinfo.ipi_zone = udp_ipi_zone; + V_udbinfo.ipi_zone = V_udp_ipi_zone; } #ifdef VIMAGE ==== //depot/projects/vimage/src/sys/netinet/vinet.h#45 (text+ko) ==== @@ -86,6 +86,12 @@ struct tcp_hostcache _tcp_hostcache; struct callout _tcp_hc_callout; + struct uma_zone *_tcp_ipi_zone; + struct uma_zone *_tcpcb_zone; + struct uma_zone *_tcptw_zone; + struct uma_zone *_sack_hole_zone; + struct uma_zone *_udp_ipi_zone; + struct tcp_syncache _tcp_syncache; int _tcp_syncookies; int _tcp_syncookiesonly; @@ -149,6 +155,7 @@ struct inpcbhead _ripcb; struct inpcbinfo _ripcbinfo; + struct uma_zone *_ripcb_zone; struct socket *_ip_mrouter; struct socket *_ip_rsvpd; @@ -277,6 +284,7 @@ #define V_reply_src VNET_INET(reply_src) #define V_ripcb VNET_INET(ripcb) #define V_ripcbinfo VNET_INET(ripcbinfo) +#define V_ripcb_zone VNET_INET(ripcb_zone) #define V_router_info_head VNET_INET(router_info_head) #define V_rsvp_on VNET_INET(rsvp_on) #define V_rtq_minreallyold VNET_INET(rtq_minreallyold) @@ -284,6 +292,7 @@ #define V_rtq_timeout VNET_INET(rtq_timeout) #define V_rtq_timer VNET_INET(rtq_timer) #define V_rtq_toomany VNET_INET(rtq_toomany) +#define V_sack_hole_zone VNET_INET(sack_hole_zone) #define V_sameprefixcarponly VNET_INET(sameprefixcarponly) #define V_ss_fltsz VNET_INET(ss_fltsz) #define V_ss_fltsz_local VNET_INET(ss_fltsz_local) @@ -315,6 +324,7 @@ #define V_tcp_inflight_rttthresh VNET_INET(tcp_inflight_rttthresh) #define V_tcp_inflight_stab VNET_INET(tcp_inflight_stab) #define V_tcp_insecure_rst VNET_INET(tcp_insecure_rst) +#define V_tcp_ipi_zone VNET_INET(tcp_ipi_zone) #define V_tcp_isn_reseed_interval VNET_INET(tcp_isn_reseed_interval) #define V_tcp_minmss VNET_INET(tcp_minmss) #define V_tcp_mssdflt VNET_INET(tcp_mssdflt) @@ -330,11 +340,14 @@ #define V_tcp_syncookies VNET_INET(tcp_syncookies) #define V_tcp_syncookiesonly VNET_INET(tcp_syncookiesonly) #define V_tcp_v6mssdflt VNET_INET(tcp_v6mssdflt) +#define V_tcpcb_zone VNET_INET(tcpcb_zone) +#define V_tcptw_zone VNET_INET(tcptw_zone) #define V_tcpstat VNET_INET(tcpstat) #define V_twq_2msl VNET_INET(twq_2msl) #define V_udb VNET_INET(udb) #define V_udbinfo VNET_INET(udbinfo) #define V_udp_blackhole VNET_INET(udp_blackhole) +#define V_udp_ipi_zone VNET_INET(udp_ipi_zone) #define V_udpstat VNET_INET(udpstat) #define V_useloopback VNET_INET(useloopback) ==== //depot/projects/vimage/src/sys/sys/vimage.h#78 (text+ko) ==== @@ -311,6 +311,7 @@ #else /* !VIMAGE */ /* Non-VIMAGE null-macros */ +#define IS_DEFAULT_VNET(arh) 1 #define CURVNET_SET(arg) #define CURVNET_SET_QUIET(arg) #define CURVNET_RESTORE()
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200902181645.n1IGjDww078742>