From owner-p4-projects@FreeBSD.ORG Wed Apr 15 23:26:01 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 22A761065670; Wed, 15 Apr 2009 23:26:01 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D5387106564A for ; Wed, 15 Apr 2009 23:26:00 +0000 (UTC) (envelope-from zec@fer.hr) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id C2F678FC13 for ; Wed, 15 Apr 2009 23:26:00 +0000 (UTC) (envelope-from zec@fer.hr) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n3FNQ0h0069299 for ; Wed, 15 Apr 2009 23:26:00 GMT (envelope-from zec@fer.hr) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n3FNQ0Li069297 for perforce@freebsd.org; Wed, 15 Apr 2009 23:26:00 GMT (envelope-from zec@fer.hr) Date: Wed, 15 Apr 2009 23:26:00 GMT Message-Id: <200904152326.n3FNQ0Li069297@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to zec@fer.hr using -f From: Marko Zec To: Perforce Change Reviews Cc: Subject: PERFORCE change 160676 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 15 Apr 2009 23:26:02 -0000 http://perforce.freebsd.org/chv.cgi?CH=160676 Change 160676 by zec@zec_amdx2 on 2009/04/15 23:25:57 A small step towards allowing for "options VIMAGE" builds to compile. Affected files ... .. //depot/projects/vimage-commit2/src/sys/kern/kern_vimage.c#15 edit .. //depot/projects/vimage-commit2/src/sys/net/if_gif.c#22 edit .. //depot/projects/vimage-commit2/src/sys/net/if_loop.c#24 edit .. //depot/projects/vimage-commit2/src/sys/net/if_var.h#16 edit .. //depot/projects/vimage-commit2/src/sys/net/route.c#33 edit .. //depot/projects/vimage-commit2/src/sys/net/rtsock.c#20 edit .. //depot/projects/vimage-commit2/src/sys/netinet/igmp.c#24 edit .. //depot/projects/vimage-commit2/src/sys/netinet/in.c#21 edit .. //depot/projects/vimage-commit2/src/sys/netinet/in_mcast.c#19 edit .. //depot/projects/vimage-commit2/src/sys/netinet/in_pcb.h#16 edit .. //depot/projects/vimage-commit2/src/sys/netinet/in_rmx.c#25 edit .. //depot/projects/vimage-commit2/src/sys/netinet/tcp_subr.c#46 edit .. //depot/projects/vimage-commit2/src/sys/netinet/tcp_syncache.h#5 edit .. //depot/projects/vimage-commit2/src/sys/netinet/tcp_timewait.c#23 edit .. //depot/projects/vimage-commit2/src/sys/netinet/tcp_var.h#11 edit .. //depot/projects/vimage-commit2/src/sys/netinet/udp_usrreq.c#33 edit .. //depot/projects/vimage-commit2/src/sys/netinet6/in6_rmx.c#26 edit .. //depot/projects/vimage-commit2/src/sys/netinet6/nd6.c#25 edit .. //depot/projects/vimage-commit2/src/sys/netinet6/nd6_rtr.c#23 edit .. //depot/projects/vimage-commit2/src/sys/sys/socketvar.h#4 edit .. //depot/projects/vimage-commit2/src/sys/sys/sysctl.h#17 edit .. //depot/projects/vimage-commit2/src/sys/sys/vimage.h#38 edit Differences ... ==== //depot/projects/vimage-commit2/src/sys/kern/kern_vimage.c#15 (text+ko) ==== @@ -42,12 +42,18 @@ #ifndef VIMAGE_GLOBALS MALLOC_DEFINE(M_VIMAGE, "vimage", "vimage resource container"); +MALLOC_DEFINE(M_VNET, "vnet", "network stack control block"); static TAILQ_HEAD(vnet_modlink_head, vnet_modlink) vnet_modlink_head; static TAILQ_HEAD(vnet_modpending_head, vnet_modlink) vnet_modpending_head; static void vnet_mod_complete_registration(struct vnet_modlink *); static int vnet_mod_constructor(struct vnet_modlink *); +/* curvnet should be thread-local - this is only a temporary step */ +#ifdef VIMAGE +struct vnet *curvnet; +#endif + void vnet_mod_register(const struct vnet_modinfo *vmi) { @@ -194,7 +200,13 @@ for (mapentry = vml->vml_modinfo->vmi_symmap; mapentry->name != NULL; mapentry++) { if (strcmp(symstr, mapentry->name) == 0) { - lookup->symvalue = (u_long) mapentry->base; +#ifdef VIMAGE + lookup->symvalue = + (u_long) curvnet->mod_data[vml->vml_modinfo->vmi_id]; + lookup->symvalue += mapentry->offset; +#else + lookup->symvalue = (u_long) mapentry->offset; +#endif lookup->symsize = mapentry->size; return (0); } @@ -206,9 +218,21 @@ static void vi_init(void *unused) { + struct vnet *vnet; TAILQ_INIT(&vnet_modlink_head); TAILQ_INIT(&vnet_modpending_head); + +#ifdef VIMAGE + LIST_INIT(&vnet_head); + + vnet = malloc(sizeof(struct vnet), M_VNET, M_NOWAIT | M_ZERO); + if (vnet == NULL) + panic("vi_alloc: malloc failed"); + LIST_INSERT_HEAD(&vnet_head, vnet, vnet_le); + + curvnet = LIST_FIRST(&vnet_head); +#endif } static void ==== //depot/projects/vimage-commit2/src/sys/net/if_gif.c#22 (text+ko) ==== @@ -303,8 +303,10 @@ if_clone_detach(&gif_cloner); mtx_destroy(&gif_mtx); #ifdef INET6 +#ifndef VIMAGE V_ip6_gif_hlim = 0; /* XXX -> vnet_gif_idetach() */ #endif +#endif break; default: return EOPNOTSUPP; ==== //depot/projects/vimage-commit2/src/sys/net/if_loop.c#24 (text+ko) ==== @@ -174,7 +174,6 @@ static int loop_modevent(module_t mod, int type, void *data) { - INIT_VNET_NET(curvnet); switch (type) { case MOD_LOAD: ==== //depot/projects/vimage-commit2/src/sys/net/if_var.h#16 (text+ko) ==== @@ -116,6 +116,7 @@ struct ifnet { void *if_softc; /* pointer to driver state */ void *if_l2com; /* pointer to protocol bits */ + struct vnet *if_vnet; /* pointer to vnet */ TAILQ_ENTRY(ifnet) if_link; /* all struct ifnets are chained */ char if_xname[IFNAMSIZ]; /* external name (name + unit) */ const char *if_dname; /* driver name */ ==== //depot/projects/vimage-commit2/src/sys/net/route.c#33 (text+ko) ==== @@ -178,7 +178,7 @@ static int vnet_route_iattach(const void *unused __unused) { - INIT_VNET_INET(curvnet); + INIT_VNET_NET(curvnet); int table; struct domain *dom; int fam; ==== //depot/projects/vimage-commit2/src/sys/net/rtsock.c#20 (text+ko) ==== @@ -1203,7 +1203,6 @@ static void rt_dispatch(struct mbuf *m, const struct sockaddr *sa) { - INIT_VNET_NET(curvnet); struct m_tag *tag; /* ==== //depot/projects/vimage-commit2/src/sys/netinet/igmp.c#24 (text+ko) ==== @@ -141,13 +141,8 @@ static int sysctl_igmp_gsr(SYSCTL_HANDLER_ARGS); static int sysctl_igmp_ifinfo(SYSCTL_HANDLER_ARGS); -#ifdef VIMAGE static vnet_attach_fn vnet_igmp_iattach; static vnet_detach_fn vnet_igmp_idetach; -#else -static int vnet_igmp_iattach(const void *); -static int vnet_igmp_idetach(const void *); -#endif /* VIMAGE */ /* * System-wide globals. @@ -340,6 +335,7 @@ static int sysctl_igmp_default_version(SYSCTL_HANDLER_ARGS) { + INIT_VNET_INET(curvnet); int error; int new; @@ -379,6 +375,7 @@ static int sysctl_igmp_gsr(SYSCTL_HANDLER_ARGS) { + INIT_VNET_INET(curvnet); int error; int i; @@ -420,6 +417,7 @@ sysctl_igmp_ifinfo(SYSCTL_HANDLER_ARGS) { INIT_VNET_NET(curvnet); + INIT_VNET_INET(curvnet); int *name; int error; u_int namelen; @@ -505,6 +503,7 @@ static __inline int igmp_isgroupreported(const struct in_addr addr) { + INIT_VNET_INET(curvnet); if (in_allhosts(addr) || ((!V_igmp_sendlocal && IN_LOCAL_GROUP(ntohl(addr.s_addr))))) @@ -567,6 +566,7 @@ static struct igmp_ifinfo * igi_alloc_locked(/*const*/ struct ifnet *ifp) { + INIT_VNET_INET(ifp->if_vnet); struct igmp_ifinfo *igi; IGMP_LOCK_ASSERT(); @@ -712,6 +712,7 @@ static void igi_delete_locked(const struct ifnet *ifp) { + INIT_VNET_INET(ifp->if_vnet); struct igmp_ifinfo *igi, *tigi; CTR3(KTR_IGMPV3, "%s: freeing igmp_ifinfo for ifp %p(%s)", @@ -836,6 +837,7 @@ igmp_input_v2_query(struct ifnet *ifp, const struct ip *ip, const struct igmp *igmp) { + INIT_VNET_INET(ifp->if_vnet); struct ifmultiaddr *ifma; struct igmp_ifinfo *igi; struct in_multi *inm; @@ -928,6 +930,7 @@ static void igmp_v2_update_group(struct in_multi *inm, const int timer) { + INIT_VNET_INET(curvnet); CTR4(KTR_IGMPV3, "%s: %s/%s timer=%d", __func__, inet_ntoa(inm->inm_addr), inm->inm_ifp->if_xname, timer); @@ -975,6 +978,7 @@ igmp_input_v3_query(struct ifnet *ifp, const struct ip *ip, /*const*/ struct igmpv3 *igmpv3) { + INIT_VNET_INET(ifp->if_vnet); struct igmp_ifinfo *igi; struct in_multi *inm; uint32_t maxresp, nsrc, qqi; @@ -1119,6 +1123,7 @@ igmp_input_v3_group_query(struct in_multi *inm, struct igmp_ifinfo *igi, int timer, /*const*/ struct igmpv3 *igmpv3) { + INIT_VNET_INET(curvnet); int retval; uint16_t nsrc; @@ -1221,6 +1226,7 @@ igmp_input_v1_report(struct ifnet *ifp, /*const*/ struct ip *ip, /*const*/ struct igmp *igmp) { + INIT_VNET_INET(ifp->if_vnet); struct in_ifaddr *ia; struct in_multi *inm; @@ -1327,6 +1333,7 @@ igmp_input_v2_report(struct ifnet *ifp, /*const*/ struct ip *ip, /*const*/ struct igmp *igmp) { + INIT_VNET_INET(ifp->if_vnet); struct in_ifaddr *ia; struct in_multi *inm; @@ -1612,21 +1619,15 @@ void igmp_fasttimo(void) { -#ifdef VIMAGE VNET_ITERATOR_DECL(vnet_iter); VNET_LIST_RLOCK(); VNET_FOREACH(vnet_iter) { CURVNET_SET(vnet_iter); - INIT_VNET_INET(vnet_iter); igmp_fasttimo_vnet(); CURVNET_RESTORE(); } VNET_LIST_RUNLOCK(); -#else /* !VIMAGE */ - - igmp_fasttimo_vnet(); -#endif /* VIMAGE */ } /* @@ -1638,6 +1639,7 @@ static void igmp_fasttimo_vnet(void) { + INIT_VNET_INET(curvnet); struct ifqueue scq; /* State-change packets */ struct ifqueue qrq; /* Query response packets */ struct ifnet *ifp; @@ -1765,6 +1767,7 @@ static void igmp_v1v2_process_group_timer(struct in_multi *inm, const int version) { + INIT_VNET_INET(curvnet); int report_timer_expired; IN_MULTI_LOCK_ASSERT(); @@ -1813,6 +1816,7 @@ struct ifqueue *qrq, struct ifqueue *scq, struct in_multi *inm, const int uri_fasthz) { + INIT_VNET_INET(curvnet); int query_response_timer_expired; int state_change_retransmit_timer_expired; @@ -2002,6 +2006,7 @@ static void igmp_v3_cancel_link_timers(struct igmp_ifinfo *igi) { + INIT_VNET_INET(curvnet); struct ifmultiaddr *ifma; struct ifnet *ifp; struct in_multi *inm; @@ -2077,6 +2082,7 @@ static void igmp_v1v2_process_querier_timers(struct igmp_ifinfo *igi) { + INIT_VNET_INET(curvnet); IGMP_LOCK_ASSERT(); @@ -2153,20 +2159,15 @@ void igmp_slowtimo(void) { -#ifdef VIMAGE VNET_ITERATOR_DECL(vnet_iter); VNET_LIST_RLOCK(); VNET_FOREACH(vnet_iter) { CURVNET_SET(vnet_iter); - INIT_VNET_INET(vnet_iter); igmp_slowtimo_vnet(); CURVNET_RESTORE(); } VNET_LIST_RUNLOCK(); -#else /* !VIMAGE */ - igmp_slowtimo_vnet(); -#endif /* VIMAGE */ } /* @@ -2175,6 +2176,7 @@ static void igmp_slowtimo_vnet(void) { + INIT_VNET_INET(curvnet); struct igmp_ifinfo *igi; IGMP_LOCK(); @@ -2202,9 +2204,6 @@ IGMP_LOCK_ASSERT(); ifp = inm->inm_ifp; - /* XXX are these needed ? */ - INIT_VNET_NET(ifp->if_vnet); - INIT_VNET_INET(ifp->if_vnet); MGETHDR(m, M_DONTWAIT, MT_DATA); if (m == NULL) @@ -2342,6 +2341,7 @@ static int igmp_initial_join(struct in_multi *inm, struct igmp_ifinfo *igi) { + INIT_VNET_INET(curvnet); struct ifnet *ifp; struct ifqueue *ifq; int error, retval, syncstates; @@ -2470,6 +2470,7 @@ static int igmp_handle_state_change(struct in_multi *inm, struct igmp_ifinfo *igi) { + INIT_VNET_INET(curvnet); struct ifnet *ifp; int retval; @@ -2529,6 +2530,7 @@ static void igmp_final_leave(struct in_multi *inm, struct igmp_ifinfo *igi) { + INIT_VNET_INET(curvnet); int syncstates; syncstates = 1; @@ -3314,6 +3316,7 @@ static void igmp_v3_dispatch_general_query(struct igmp_ifinfo *igi) { + INIT_VNET_INET(curvnet); struct ifmultiaddr *ifma, *tifma; struct ifnet *ifp; struct in_multi *inm; @@ -3395,12 +3398,14 @@ CTR2(KTR_IGMPV3, "%s: transmit %p", __func__, m); /* - * Restore VNET image pointer from enqueued mbuf chain + * Set VNET image pointer from enqueued mbuf chain * before doing anything else. Whilst we use interface * indexes to guard against interface detach, they are * unique to each VIMAGE and must be retrieved. */ CURVNET_SET(m->m_pkthdr.header); + INIT_VNET_NET(curvnet); + INIT_VNET_INET(curvnet); ifindex = igmp_restore_context(m); /* @@ -3482,7 +3487,6 @@ static struct mbuf * igmp_v3_encap_report(struct ifnet *ifp, struct mbuf *m) { - INIT_VNET_NET(curvnet); INIT_VNET_INET(curvnet); struct igmp_report *igmp; struct ip *ip; @@ -3661,15 +3665,28 @@ return (0); } -#ifdef VIMAGE +/* + * XXX Are igi_head and igmpstat really accessed via kmem / kldsym? + * If so, given that they are members of struct vnet_inet, they should + * be registered with VNET_MOD_INET, not here. Revisit!!! + */ +#if 0 static struct vnet_symmap vnet_igmp_symmap[] = { VNET_SYMMAP(igmp, igi_head), VNET_SYMMAP(igmp, igmpstat), VNET_SYMMAP_END }; -VNET_MOD_DECLARE(IGMP, igmp, vnet_igmp_iattach, vnet_igmp_idetach, - vnet_igmp_symmap); -#endif /* VIMAGE */ +#endif + +#ifndef VIMAGE_GLOBALS +static vnet_modinfo_t vnet_igmp_modinfo = { + .vmi_id = VNET_MOD_IGMP, + .vmi_name = "igmp", + .vmi_dependson = VNET_MOD_INET, + .vmi_iattach = vnet_igmp_iattach, + .vmi_idetach = vnet_igmp_idetach +}; +#endif static int igmp_modevent(module_t mod, int type, void *unused __unused) @@ -3678,22 +3695,20 @@ switch (type) { case MOD_LOAD: igmp_sysinit(); -#ifdef VIMAGE +#ifndef VIMAGE_GLOBALS vnet_mod_register(&vnet_igmp_modinfo); #else - (void)vnet_igmp_iattach(NULL); -#endif /* VIMAGE */ + vnet_igmp_iattach(NULL); +#endif break; case MOD_UNLOAD: -#ifdef VIMAGE - /* - * TODO: Allow module unload if any VIMAGE instances - * are using this module. - */ - return (EBUSY); +#ifndef VIMAGE_GLOBALS +#ifdef NOTYET + vnet_mod_deregister(&vnet_igmp_modinfo); +#endif #else - (void)vnet_igmp_idetach(NULL); -#endif /* VIMAGE */ + vnet_igmp_idetach(NULL); +#endif igmp_sysuninit(); break; default: ==== //depot/projects/vimage-commit2/src/sys/netinet/in.c#21 (text+ko) ==== @@ -1017,7 +1017,6 @@ static void in_purgemaddrs(struct ifnet *ifp) { - INIT_VNET_INET(ifp->if_vnet); LIST_HEAD(,in_multi) purgeinms; struct in_multi *inm, *tinm; struct ifmultiaddr *ifma; ==== //depot/projects/vimage-commit2/src/sys/netinet/in_mcast.c#19 (text+ko) ==== @@ -392,7 +392,6 @@ in_getmulti(struct ifnet *ifp, const struct in_addr *group, struct in_multi **pinm) { - INIT_VNET_INET(ifp->if_vnet); struct sockaddr_in gsin; struct ifmultiaddr *ifma; struct in_ifinfo *ii; @@ -1821,6 +1820,7 @@ inp_lookup_mcast_ifp(const struct inpcb *inp, const struct sockaddr_in *gsin, const struct in_addr ina) { + INIT_VNET_INET(curvnet); struct ifnet *ifp; KASSERT(gsin->sin_family == AF_INET, ("%s: not AF_INET", __func__)); @@ -1866,7 +1866,6 @@ inp_join_group(struct inpcb *inp, struct sockopt *sopt) { INIT_VNET_NET(curvnet); - INIT_VNET_INET(curvnet); struct group_source_req gsr; sockunion_t *gsa, *ssa; struct ifnet *ifp; @@ -2319,6 +2318,7 @@ inp_set_multicast_if(struct inpcb *inp, struct sockopt *sopt) { INIT_VNET_NET(curvnet); + INIT_VNET_INET(curvnet); struct in_addr addr; struct ip_mreqn mreqn; struct ifnet *ifp; ==== //depot/projects/vimage-commit2/src/sys/netinet/in_pcb.h#16 (text+ko) ==== @@ -221,6 +221,8 @@ #define in6p_icmp6filt inp_depend6.inp6_icmp6filt #define in6p_cksum inp_depend6.inp6_cksum +#define inp_vnet inp_pcbinfo->ipi_vnet + /* * The range of the generation count, as used in this implementation, is 9e19. * We would have to create 300 billion connections per second for this number @@ -298,8 +300,12 @@ struct rwlock ipi_lock; /* - * vimage 1 - * general use 1 + * Pointer to network stack instance + */ + struct vnet *ipi_vnet; + + /* + * general use 2 */ void *ipi_pspare[2]; }; ==== //depot/projects/vimage-commit2/src/sys/netinet/in_rmx.c#25 (text+ko) ==== @@ -250,6 +250,8 @@ static void in_rtqtimo(void *rock) { + INIT_VNET_NET(curvnet); /* XXX revisit!!! */ + INIT_VNET_INET(curvnet); /* XXX revisit!!! */ int fibnum; void *newrock; struct timeval atv; ==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_subr.c#46 (text+ko) ==== @@ -288,6 +288,7 @@ static void tcp_zone_change(void *tag) { + INIT_VNET_INET(curvnet); uma_zone_set_max(V_tcbinfo.ipi_zone, maxsockets); uma_zone_set_max(V_tcpcb_zone, maxsockets); ==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_syncache.h#5 (text+ko) ==== @@ -96,6 +96,7 @@ #define SYNCOOKIE_LIFETIME 16 /* seconds */ struct syncache_head { + struct vnet *sch_vnet; struct mtx sch_mtx; TAILQ_HEAD(sch_head, syncache) sch_bucket; struct callout sch_timer; ==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_timewait.c#23 (text+ko) ==== @@ -132,6 +132,7 @@ static int sysctl_maxtcptw(SYSCTL_HANDLER_ARGS) { + INIT_VNET_INET(curvnet); int error, new; if (maxtcptw == 0) @@ -158,6 +159,7 @@ void tcp_tw_zone_change(void) { + INIT_VNET_INET(curvnet); if (maxtcptw == 0) uma_zone_set_max(V_tcptw_zone, tcptw_auto_size()); ==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_var.h#11 (text+ko) ==== @@ -35,6 +35,8 @@ #include +struct vnet; + /* * Kernel variables for tcp. */ @@ -186,7 +188,8 @@ int t_rttlow; /* smallest observerved RTT */ u_int32_t rfbuf_ts; /* recv buffer autoscaling timestamp */ int rfbuf_cnt; /* recv buffer autoscaling byte count */ - void *t_pspare[3]; /* toe usrreqs / toepcb * / congestion algo / vimage / 1 general use */ + struct vnet *t_vnet; /* pointer to parent vnet */ + void *t_pspare[2]; /* toe usrreqs / toepcb * / congestion algo / vimage / 1 general use */ struct toe_usrreqs *t_tu; /* offload operations vector */ void *t_toe; /* TOE pcb pointer */ int t_bytes_acked; /* # bytes acked during current RTT */ ==== //depot/projects/vimage-commit2/src/sys/netinet/udp_usrreq.c#33 (text+ko) ==== @@ -155,6 +155,7 @@ static void udp_zone_change(void *tag) { + INIT_VNET_INET(curvnet); uma_zone_set_max(V_udbinfo.ipi_zone, maxsockets); } ==== //depot/projects/vimage-commit2/src/sys/netinet6/in6_rmx.c#26 (text+ko) ==== @@ -289,7 +289,6 @@ in6_rtqtimo(void *rock) { CURVNET_SET_QUIET((struct vnet *) rock); - INIT_VNET_NET((struct vnet *) rock); INIT_VNET_INET6((struct vnet *) rock); struct radix_node_head *rnh = rock; struct rtqk_arg arg; @@ -377,7 +376,6 @@ in6_mtutimo(void *rock) { CURVNET_SET_QUIET((struct vnet *) rock); - INIT_VNET_NET((struct vnet *) rock); INIT_VNET_INET6((struct vnet *) rock); struct radix_node_head *rnh = rock; struct mtuex_arg arg; ==== //depot/projects/vimage-commit2/src/sys/netinet6/nd6.c#25 (text+ko) ==== @@ -869,7 +869,6 @@ struct llentry * nd6_lookup(struct in6_addr *addr6, int flags, struct ifnet *ifp) { - INIT_VNET_INET6(curvnet); struct sockaddr_in6 sin6; struct llentry *ln; int llflags = 0; ==== //depot/projects/vimage-commit2/src/sys/netinet6/nd6_rtr.c#23 (text+ko) ==== @@ -1543,6 +1543,7 @@ int nd6_prefix_onlink(struct nd_prefix *pr) { + INIT_VNET_NET(curvnet); INIT_VNET_INET6(curvnet); struct ifaddr *ifa; struct ifnet *ifp = pr->ndpr_ifp; ==== //depot/projects/vimage-commit2/src/sys/sys/socketvar.h#4 (text+ko) ==== @@ -45,6 +45,8 @@ #include #endif +struct vnet; + /* * Kernel structure per socket. * Contains send and receive buffer queues, @@ -72,6 +74,7 @@ short so_state; /* (b) internal state flags SS_* */ int so_qstate; /* (e) internal state flags SQ_* */ void *so_pcb; /* protocol control block */ + struct vnet *so_vnet; /* network stack instance */ struct protosw *so_proto; /* (a) protocol handle */ /* * Variables for connection queuing. ==== //depot/projects/vimage-commit2/src/sys/sys/sysctl.h#17 (text+ko) ==== @@ -163,6 +163,8 @@ const char *oid_fmt; int oid_refcnt; const char *oid_descr; + short oid_v_subs; + short oid_v_mod; }; #define SYSCTL_IN(r, p, l) (r->newfunc)(r, p, l) ==== //depot/projects/vimage-commit2/src/sys/sys/vimage.h#38 (text+ko) ==== @@ -48,8 +48,8 @@ struct vnet_symmap { char *name; - void *base; - size_t size; + size_t offset; + size_t size; }; typedef struct vnet_symmap vnet_symmap_t; @@ -71,12 +71,6 @@ const char *vml_iname; }; -#define VNET_SYMMAP(mod, name) \ - { #name, &(vnet_ ## mod ## _0._ ## name), \ - sizeof(vnet_ ## mod ## _0._ ## name) } - -#define VNET_SYMMAP_END { NULL, 0 } - /* stateful modules */ #define VNET_MOD_NET 0 /* MUST be 0 - implicit dependency */ #define VNET_MOD_NETGRAPH 1 @@ -108,7 +102,11 @@ #define VNET_MOD_DYNAMIC_START 32 #define VNET_MOD_MAX 64 -/* Sysctl virtualization macros need these name mappings bellow */ +/* Major module IDs for vimage sysctl virtualization */ +#define V_GLOBAL 0 /* global variable - no indirection */ +#define V_NET 1 + +/* Name mappings for minor module IDs in vimage sysctl virtualization */ #define V_MOD_vnet_net VNET_MOD_NET #define V_MOD_vnet_netgraph VNET_MOD_NETGRAPH #define V_MOD_vnet_inet VNET_MOD_INET @@ -128,21 +126,67 @@ #define VSYM(base, sym) (sym) #else #ifdef VIMAGE -#error "No option VIMAGE yet!" +#define VSYM(base, sym) ((base)->_ ## sym) #else #define VSYM(base, sym) (base ## _0._ ## sym) #endif #endif +#ifndef VIMAGE_GLOBALS +#ifdef VIMAGE +#define VNET_SYMMAP(mod, name) \ + { #name, offsetof(struct vnet_ ## mod, _ ## name), \ + sizeof(((struct vnet_ ## mod *) curthread)->_ ## name) } +#else +#define VNET_SYMMAP(mod, name) \ + { #name, &(vnet_ ## mod ## _0._ ## name), \ + sizeof(vnet_ ## mod ## _0._ ## name) } +#endif +#define VNET_SYMMAP_END { NULL, 0 } +#endif /* !VIMAGE_GLOBALS */ + +#ifdef VIMAGE +struct vnet { + void *mod_data[VNET_MOD_MAX]; + LIST_ENTRY(vnet) vnet_le; /* all vnets list */ + u_int vnet_magic_n; +}; + +extern struct vnet *curvnet; +#endif + +#ifdef VIMAGE +#ifdef VNET_DEBUG +#define INIT_FROM_VNET(vnet, modindex, modtype, sym) \ + if (vnet != curvnet) \ + panic("in %s:%d %s()\n vnet=%p curvnet=%p", \ + __FILE__, __LINE__, __FUNCTION__, \ + vnet, curvnet); \ + modtype *sym = (vnet)->mod_data[modindex]; +#else /* !VNET_DEBUG */ +#define INIT_FROM_VNET(vnet, modindex, modtype, sym) \ + modtype *sym = (vnet)->mod_data[modindex]; +#endif /* !VNET_DEBUG */ +#else /* !VIMAGE */ +#define INIT_FROM_VNET(vnet, modindex, modtype, sym) +#endif + +#ifdef VIMAGE +LIST_HEAD(vnet_list_head, vnet); +extern struct vnet_list_head vnet_head; +#define VNET_ITERATOR_DECL(arg) struct vnet *arg; +#define VNET_FOREACH(arg) LIST_FOREACH(arg, &vnet_head, vnet_le) +#else +#define VNET_ITERATOR_DECL(arg) +#define VNET_FOREACH(arg) +#endif + /* Non-VIMAGE null-macros */ #define IS_DEFAULT_VNET(arg) 1 #define CURVNET_SET(arg) #define CURVNET_SET_QUIET(arg) #define CURVNET_RESTORE() #define VNET_ASSERT(condition) -#define INIT_FROM_VNET(vnet, modindex, modtype, sym) -#define VNET_ITERATOR_DECL(arg) -#define VNET_FOREACH(arg) #define VNET_LIST_RLOCK() #define VNET_LIST_RUNLOCK() #define INIT_VPROCG(arg)