From owner-p4-projects@FreeBSD.ORG Mon Jul 30 13:37:53 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6E4D916A46B; Mon, 30 Jul 2007 13:37:53 +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 3DAE816A419 for ; Mon, 30 Jul 2007 13:37:53 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 2F6A013C48D for ; Mon, 30 Jul 2007 13:37:53 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l6UDbrlX044333 for ; Mon, 30 Jul 2007 13:37:53 GMT (envelope-from zec@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l6UDbq0H044330 for perforce@freebsd.org; Mon, 30 Jul 2007 13:37:52 GMT (envelope-from zec@FreeBSD.org) Date: Mon, 30 Jul 2007 13:37:52 GMT Message-Id: <200707301337.l6UDbq0H044330@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to zec@FreeBSD.org using -f From: Marko Zec To: Perforce Change Reviews Cc: Subject: PERFORCE change 124354 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: Mon, 30 Jul 2007 13:37:53 -0000 http://perforce.freebsd.org/chv.cgi?CH=124354 Change 124354 by zec@zec_tpx32 on 2007/07/30 13:37:17 Overhaul of memory allocation handling for vnet modules. Previously, attach / detach functions in vnet modules were individually responsible for allocating and freeing memory for storing private state. This change hides the details of memory management from vnet modules by providing them with already allocated and zeroed storage before vnet's attach method (if provided) is called, and by ensuring that this storage will be freed immediately after vnet's detach method (if provided) is executed. From now on all vnet modules have to be declared through one of the following two macros: VNET_MOD_DECLARE() or VNET_MOD_DECLARE_STATELESS(). The former macro is to be used when a vnet module requires an instance of private storage to be allocated per each vnet, while the later form should be used when no private storage is required, but only the initialization ordering has to be enforced. While here, deprecate backpointers from vnet modules to the corresponding parent vnets, given that so far they have never been used. Affected files ... .. //depot/projects/vimage/src/sys/kern/kern_vimage.c#27 edit .. //depot/projects/vimage/src/sys/kern/uipc_domain.c#8 edit .. //depot/projects/vimage/src/sys/net/if.c#17 edit .. //depot/projects/vimage/src/sys/net/if_gif.c#7 edit .. //depot/projects/vimage/src/sys/net/if_gif.h#4 edit .. //depot/projects/vimage/src/sys/net/if_loop.c#15 edit .. //depot/projects/vimage/src/sys/net/route.c#9 edit .. //depot/projects/vimage/src/sys/net/vnet.h#7 edit .. //depot/projects/vimage/src/sys/netgraph/ng_base.c#11 edit .. //depot/projects/vimage/src/sys/netinet/if_ether.c#12 edit .. //depot/projects/vimage/src/sys/netinet/in_proto.c#7 edit .. //depot/projects/vimage/src/sys/netinet/ip_fw.h#7 edit .. //depot/projects/vimage/src/sys/netinet/ip_fw2.c#19 edit .. //depot/projects/vimage/src/sys/netinet/ip_input.c#19 edit .. //depot/projects/vimage/src/sys/netinet/ip_var.h#7 edit .. //depot/projects/vimage/src/sys/netinet/tcp_subr.c#24 edit .. //depot/projects/vimage/src/sys/netinet/tcp_syncache.h#6 edit .. //depot/projects/vimage/src/sys/netinet/vinet.h#18 edit .. //depot/projects/vimage/src/sys/netinet6/ip6_input.c#16 edit .. //depot/projects/vimage/src/sys/netinet6/udp6_usrreq.c#16 edit .. //depot/projects/vimage/src/sys/netinet6/vinet6.h#8 edit .. //depot/projects/vimage/src/sys/netipsec/ipsec.c#12 edit .. //depot/projects/vimage/src/sys/netipsec/vipsec.h#9 edit .. //depot/projects/vimage/src/sys/netipsec/xform_ah.c#8 edit .. //depot/projects/vimage/src/sys/netipsec/xform_esp.c#7 edit .. //depot/projects/vimage/src/sys/netipsec/xform_ipcomp.c#6 edit .. //depot/projects/vimage/src/sys/netipsec/xform_ipip.c#9 edit .. //depot/projects/vimage/src/sys/sys/vimage.h#28 edit Differences ... ==== //depot/projects/vimage/src/sys/kern/kern_vimage.c#27 (text+ko) ==== @@ -69,6 +69,8 @@ MALLOC_DEFINE(M_VCPU, "vcpu", "cpu resource control block"); static void vi_destroy(struct vimage *); +static int vnet_mod_constructor(struct vnet_modlink *); +static int vnet_mod_destructor(struct vnet_modlink *); struct vimage vimage_0; struct vprocg vprocg_0; @@ -84,25 +86,25 @@ static TAILQ_HEAD(vnet_modlink_head, vnet_modlink) vnet_modlink_head; -void vnet_mod_register(modinfo) - struct vnet_modinfo *modinfo; +void vnet_mod_register(vmi) + const struct vnet_modinfo *vmi; { - vnet_mod_register_multi(modinfo, NULL, NULL); + vnet_mod_register_multi(vmi, NULL, NULL); } -void vnet_mod_register_multi(modinfo, iarg, iname) - struct vnet_modinfo *modinfo; - void *iarg; - char *iname; +void vnet_mod_register_multi(vmi, iarg, iname) + const struct vnet_modinfo *vmi; + const void *iarg; + const char *iname; { struct vnet_modlink *vml; /* Do not register the same module instance more than once */ - TAILQ_FOREACH(vml, &vnet_modlink_head, mod_le) - if (vml->modinfo == modinfo && vml->iarg == iarg) + TAILQ_FOREACH(vml, &vnet_modlink_head, vml_mod_le) + if (vml->vml_modinfo == vmi && vml->vml_iarg == iarg) break; if (vml != NULL) - panic("attempt to register already registered vnet module"); + panic("attempt to register an already registered vnet module"); vml = malloc(sizeof(struct vnet_modlink), M_VIMAGE, M_NOWAIT); /* @@ -110,47 +112,43 @@ * In principle modules should be able to get a dynamically * assigned ID at registration time. */ - VNET_ASSERT(modinfo->id > 0 || modinfo->id < VNET_MOD_MAX); + VNET_ASSERT(vmi->vmi_id > 0 || vmi->vmi_id < VNET_MOD_MAX); VNET_ASSERT(!((iarg == NULL) ^ (iname == NULL))); - vml->modinfo = modinfo; - vml->iarg = iarg; - vml->iname = iname; - TAILQ_INSERT_TAIL(&vnet_modlink_head, vml, mod_le); + vml->vml_modinfo = vmi; + vml->vml_iarg = iarg; + vml->vml_iname = iname; + TAILQ_INSERT_TAIL(&vnet_modlink_head, vml, vml_mod_le); - if (modinfo->i_attach) { - VNET_ITERLOOP_BEGIN_QUIET(); - modinfo->i_attach(iarg); - VNET_ITERLOOP_END(); - } + VNET_ITERLOOP_BEGIN_QUIET(); + vnet_mod_constructor(vml); + VNET_ITERLOOP_END(); } -void vnet_mod_deregister(modinfo) - struct vnet_modinfo *modinfo; +void vnet_mod_deregister(vmi) + const struct vnet_modinfo *vmi; { - vnet_mod_deregister_multi(modinfo, NULL, NULL); + vnet_mod_deregister_multi(vmi, NULL, NULL); } -void vnet_mod_deregister_multi(modinfo, iarg, iname) - struct vnet_modinfo *modinfo; - void *iarg; - char *iname; +void vnet_mod_deregister_multi(vmi, iarg, iname) + const struct vnet_modinfo *vmi; + const void *iarg; + const char *iname; { struct vnet_modlink *vml; - TAILQ_FOREACH(vml, &vnet_modlink_head, mod_le) - if (vml->modinfo == modinfo && vml->iarg == iarg) + TAILQ_FOREACH(vml, &vnet_modlink_head, vml_mod_le) + if (vml->vml_modinfo == vmi && vml->vml_iarg == iarg) break; if (vml == NULL) panic("cannot deregister unregistered vnet module"); - if (modinfo->i_detach) { - VNET_ITERLOOP_BEGIN_QUIET(); - modinfo->i_detach(iarg); - VNET_ITERLOOP_END(); - } + VNET_ITERLOOP_BEGIN_QUIET(); + vnet_mod_destructor(vml); + VNET_ITERLOOP_END(); - TAILQ_REMOVE(&vnet_modlink_head, vml, mod_le); + TAILQ_REMOVE(&vnet_modlink_head, vml, vml_mod_le); free(vml, M_VIMAGE); } @@ -415,17 +413,17 @@ { struct vnet_modlink *vml; - TAILQ_FOREACH(vml, &vnet_modlink_head, mod_le) { + TAILQ_FOREACH(vml, &vnet_modlink_head, vml_mod_le) { struct vnet_symmap *mapentry; - if (vml->modinfo->symmap == NULL) + if (vml->vml_modinfo->vmi_symmap == NULL) continue; - for (mapentry = vml->modinfo->symmap; + for (mapentry = vml->vml_modinfo->vmi_symmap; mapentry->name != NULL; mapentry++) { if (strcmp(symstr, mapentry->name) == 0) { lookup->symvalue = - (int) curvnet->mod_data[vml->modinfo->id]; + (int) curvnet->mod_data[vml->vml_modinfo->vmi_id]; /* XXX */ lookup->symvalue += mapentry->offset; lookup->symsize = mapentry->size; return 0; @@ -457,29 +455,25 @@ if (vip == NULL) goto vi_alloc_done; - vip = realloc(vip, sizeof(struct vimage), M_VIMAGE, M_NOWAIT); + vip = realloc(vip, sizeof(struct vimage), M_VIMAGE, M_NOWAIT | M_ZERO); if (vip == NULL) panic("vi_alloc: malloc failed for vimage \"%s\"\n", name); - bzero(vip, sizeof(struct vimage)); vip->vi_id = last_vi_id++; - vnet = malloc(sizeof(struct vnet), M_VNET, M_NOWAIT); + vnet = malloc(sizeof(struct vnet), M_VNET, M_NOWAIT | M_ZERO); if (vnet == NULL) panic("vi_alloc: malloc failed for vnet \"%s\"\n", name); - bzero(vnet, sizeof(struct vnet)); vip->v_vnet = vnet; vnet->vnet_magic_n = VNET_MAGIC_N; - vprocg = malloc(sizeof(struct vprocg), M_VPROCG, M_NOWAIT); + vprocg = malloc(sizeof(struct vprocg), M_VPROCG, M_NOWAIT | M_ZERO); if (vprocg == NULL) panic("vi_alloc: malloc failed for vprocg \"%s\"\n", name); - bzero(vprocg, sizeof(struct vprocg)); vip->v_procg = vprocg; - vcpu = malloc(sizeof(struct vcpu), M_VCPU, M_NOWAIT); + vcpu = malloc(sizeof(struct vcpu), M_VCPU, M_NOWAIT | M_ZERO); if (vcpu == NULL) panic ("vi_alloc: malloc failed for vcpu \"%s\"\n", name); - bzero (vcpu, sizeof(struct vcpu)); vip->v_cpu = vcpu; /* Some initialization stuff... */ @@ -487,12 +481,9 @@ CURVNET_SET_QUIET(vnet); - /* - * Initialize / attach module instances. - */ - TAILQ_FOREACH(vml, &vnet_modlink_head, mod_le) - if (vml->modinfo->i_attach != NULL) - vml->modinfo->i_attach(vml->iarg); + /* Initialize / attach module instances. */ + TAILQ_FOREACH(vml, &vnet_modlink_head, vml_mod_le) + vnet_mod_constructor(vml); CURVNET_RESTORE(); @@ -553,9 +544,8 @@ * Detach / free per-module state instances. */ TAILQ_FOREACH_REVERSE(vml, &vnet_modlink_head, - vnet_modlink_head, mod_le) - if (vml->modinfo->i_detach) - vml->modinfo->i_detach(vml->iarg); + vnet_modlink_head, vml_mod_le) + vnet_mod_destructor(vml); #if 0 free((caddr_t)vnet->ifnet_addrs, M_IFADDR); @@ -578,7 +568,42 @@ free(vip, M_VIMAGE); } +static int vnet_mod_constructor(vml) +struct vnet_modlink *vml; +{ + const struct vnet_modinfo *vmi = vml->vml_modinfo; + if (vml->vml_modinfo->vmi_struct_size) { + void *mem = malloc(vmi->vmi_struct_size, M_VNET, M_NOWAIT); + if (mem == NULL) /* XXX should return error, not panic */ + panic("vi_alloc: malloc for %s\n", vmi->vmi_name); + bzero(mem, vmi->vmi_struct_size); + curvnet->mod_data[vmi->vmi_id] = mem; + } + + if (vml->vml_modinfo->vmi_iattach != NULL) + vml->vml_modinfo->vmi_iattach(vml->vml_iarg); + + return 0; +} + +static int vnet_mod_destructor(vml) +struct vnet_modlink *vml; +{ + if (vml->vml_modinfo->vmi_idetach) + vml->vml_modinfo->vmi_idetach(vml->vml_iarg); + if (vml->vml_modinfo->vmi_struct_size) { + if (curvnet->mod_data[vml->vml_modinfo->vmi_id] == NULL) + panic("vi_destroy: %s\n", + vml->vml_modinfo->vmi_name); + free(curvnet->mod_data[vml->vml_modinfo->vmi_id], + M_VNET); + curvnet->mod_data[vml->vml_modinfo->vmi_id] = NULL; + } + + return 0; +} + static void vi_init(void *unused) { @@ -621,19 +646,20 @@ if (arg) db_printf(" %p", arg); else - db_printf(" 0x0"); + db_printf(" 0"); } DB_SHOW_COMMAND(vnets, db_show_vnets) { - db_printf(" vnet ifcs socks"); - db_printf(" net inet inet6 netgraph\n"); + db_printf(" vnet ifs socks"); + db_printf(" net inet inet6 ipsec netgraph\n"); VNET_ITERLOOP_BEGIN_QUIET(); - db_printf("%p %4d %5d", + db_printf("%p %3d %5d", vnet_iter, vnet_iter->ifccnt, vnet_iter->sockcnt); db_vnet_ptr(vnet_iter->mod_data[VNET_MOD_NET]); db_vnet_ptr(vnet_iter->mod_data[VNET_MOD_INET]); db_vnet_ptr(vnet_iter->mod_data[VNET_MOD_INET6]); + db_vnet_ptr(vnet_iter->mod_data[VNET_MOD_IPSEC]); db_vnet_ptr(vnet_iter->mod_data[VNET_MOD_NETGRAPH]); db_printf("\n"); VNET_ITERLOOP_END(); ==== //depot/projects/vimage/src/sys/kern/uipc_domain.c#8 (text+ko) ==== @@ -67,9 +67,9 @@ SYSINIT(domainfin, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_FIRST, domainfinalize, NULL) -static int net_init_domain(void *); +static vnet_attach_fn net_init_domain; #ifdef VIMAGE -static int net_detach_domain(void *); +static vnet_detach_fn net_detach_domain; #endif static struct callout pffast_callout; @@ -108,14 +108,7 @@ .pru_sopoll = pru_sopoll_notsupp, }; -#ifdef VIMAGE -static struct vnet_modinfo vnet_domain_modinfo = { - .id = VNET_MOD_DOMAIN, - .name = "domain", - .i_attach = net_init_domain, - .i_detach = net_detach_domain -}; -#endif +VNET_MOD_DECLARE_STATELESS(DOMAIN, domain, net_init_domain, net_detach_domain) static void protosw_init(struct protosw *pr) @@ -148,9 +141,9 @@ * Initialize a domain instance. */ static int -net_init_domain(void *arg) +net_init_domain(const void *arg) { - struct domain *dp = arg; + const struct domain *dp = arg; struct protosw *pr; if (dp->dom_init) @@ -172,9 +165,9 @@ * Detach / free a domain instance. */ static int -net_detach_domain(void *arg) +net_detach_domain(const void *arg) { - struct domain *dp = arg; + const struct domain *dp = arg; struct protosw *pr; if (dp->dom_destroy) ==== //depot/projects/vimage/src/sys/net/if.c#17 (text+ko) ==== @@ -137,9 +137,9 @@ extern void nd6_setmtu(struct ifnet *); #endif -static int vnet_net_iattach(void *); +static int vnet_net_iattach(const void *); #ifdef VIMAGE -static int vnet_net_idetach(void *); +static int vnet_net_idetach(const void *); #endif int ifqmaxlen = IFQ_MAXLEN; @@ -163,8 +163,6 @@ { 1, NULL, filt_netdetach, filt_netdev }; #ifdef VIMAGE -struct vnet_net vnet_net_0; - static struct vnet_symmap vnet_net_symmap[] = { VNET_SYMMAP(net, ifnet), VNET_SYMMAP(net, rt_tables), @@ -173,15 +171,7 @@ VNET_SYMMAP_END }; -static struct vnet_modinfo vnet_net_modinfo = { - .id = VNET_MOD_NET, - .name = "net", - .symmap = vnet_net_symmap, - .i_attach = vnet_net_iattach, - .i_detach = vnet_net_idetach -}; - -MALLOC_DEFINE(M_NET, "net", "NET instance"); +VNET_MOD_DECLARE(NET, net, vnet_net_symmap, vnet_net_iattach, vnet_net_idetach) #endif /* @@ -348,23 +338,10 @@ static int vnet_net_iattach(unused) - void *unused; + const void *unused; { -#ifdef VIMAGE - struct vnet_net *vnet_net; + INIT_VNET_NET(curvnet); - if (IS_VNET_0(curvnet)) { - vnet_net = &vnet_net_0; - } else { - vnet_net = malloc(sizeof(struct vnet_net), - M_NET, M_NOWAIT | M_ZERO); - if (vnet_net == NULL) - panic("couldn't allocate memory for vnet_net"); - } - curvnet->mod_data[vnet_net_modinfo.id] = vnet_net; - vnet_net->parent_vnet = curvnet; -#endif - TAILQ_INIT(&V_ifnet); TAILQ_INIT(&V_ifg_head); knlist_init(&V_ifklist, NULL, NULL, NULL, NULL); @@ -377,7 +354,7 @@ #ifdef VIMAGE static int vnet_net_idetach(unused) - void *unused; + const void *unused; { INIT_VNET_NET(curvnet); @@ -389,9 +366,6 @@ free((caddr_t)V_ifindex_table, M_IFNET); - curvnet->mod_data[vnet_net_modinfo.id] = NULL; - free((caddr_t)vnet_net, M_NET); - return 0; } #endif ==== //depot/projects/vimage/src/sys/net/if_gif.c#7 (text+ko) ==== @@ -107,8 +107,7 @@ static void gif_start(struct ifnet *); static int gif_clone_create(struct if_clone *, int, caddr_t); static void gif_clone_destroy(struct ifnet *); -static int vnet_gif_iattach(void *); -static int vnet_gif_idetach(void *); +static int vnet_gif_iattach(const void *); IFC_SIMPLE_DECLARE(gif, 0); @@ -145,14 +144,7 @@ SYSCTL_V_INT(V_NET, vnet_gif, _net_link_gif, OID_AUTO, parallel_tunnels, CTLFLAG_RW, parallel_tunnels, 0, "Allow parallel tunnels?"); -#ifdef VIMAGE -static struct vnet_modinfo vnet_gif_modinfo = { - .id = VNET_MOD_GIF, - .name = "gif", - .i_attach = vnet_gif_iattach, - .i_detach = vnet_gif_idetach -}; -#endif +VNET_MOD_DECLARE(GIF, gif, NULL, vnet_gif_iattach, NULL) static int gif_clone_create(ifc, unit, params) @@ -238,17 +230,9 @@ static int vnet_gif_iattach(unused) - void *unused; + const void *unused; { -#ifdef VIMAGE - struct vnet_gif *vnet_gif; - - vnet_gif = malloc(sizeof(*vnet_gif), M_GIF, M_NOWAIT | M_ZERO); - if (vnet_gif == NULL) - panic("couldn't allocate memory for vnet_gif"); - curvnet->mod_data[vnet_gif_modinfo.id] = vnet_gif; - vnet_gif->parent_vnet = curvnet; -#endif + INIT_VNET_GIF(curvnet); LIST_INIT(&V_gif_softc_list); V_max_gif_nesting = MAX_GIF_NEST; @@ -265,20 +249,6 @@ } static int -vnet_gif_idetach(unused) - void *unused; -{ - INIT_VNET_GIF(curvnet); - -#ifdef VIMAGE - curvnet->mod_data[vnet_gif_modinfo.id] = NULL; - free(vnet_gif, M_GIF); -#endif - - return 0; -} - -static int gifmodevent(mod, type, data) module_t mod; int type; @@ -299,8 +269,6 @@ if_clone_detach(&gif_cloner); #ifdef VIMAGE vnet_mod_deregister(&vnet_gif_modinfo); -#else - vnet_gif_idetach(NULL); #endif mtx_destroy(&gif_mtx); break; ==== //depot/projects/vimage/src/sys/net/if_gif.h#4 (text+ko) ==== @@ -119,8 +119,6 @@ #define VNET_GIF(sym) VSYM(vnet_gif, sym) struct vnet_gif { - struct vnet *parent_vnet; - LIST_HEAD(, gif_softc) _gif_softc_list; int _max_gif_nesting; int _parallel_tunnels; ==== //depot/projects/vimage/src/sys/net/if_loop.c#15 (text+ko) ==== @@ -106,9 +106,9 @@ struct sockaddr *dst, struct rtentry *rt); static int lo_clone_create(struct if_clone *, int, caddr_t); static void lo_clone_destroy(struct ifnet *); -static int vnet_loif_iattach(void *); +static int vnet_loif_iattach(const void *); #ifdef VIMAGE -static int vnet_loif_idetach(void *); +static int vnet_loif_idetach(const void *); #endif #ifndef VIMAGE @@ -180,17 +180,10 @@ return (0); } -#ifdef VIMAGE -static struct vnet_modinfo vnet_loif_modinfo = { - .id = VNET_MOD_LOIF, - .name = "loif", - .i_attach = vnet_loif_iattach, - .i_detach = vnet_loif_idetach -}; -#endif +VNET_MOD_DECLARE_STATELESS(LOIF, loif, vnet_loif_iattach, vnet_loif_idetach) static int vnet_loif_iattach(unused) - void *unused; + const void *unused; { INIT_VNET_NET(curvnet); @@ -208,7 +201,7 @@ #ifdef VIMAGE static int vnet_loif_idetach(unused) - void *unused; + const void *unused; { INIT_VNET_NET(curvnet); struct lo_softc *sc, *nsc; ==== //depot/projects/vimage/src/sys/net/route.c#9 (text+ko) ==== @@ -60,9 +60,9 @@ static void rt_maskedcopy(struct sockaddr *, struct sockaddr *, struct sockaddr *); -static int rtable_init(void *); +static int rtable_init(const void *); #ifdef VIMAGE -static int rtable_idetach(void *); +static int rtable_idetach(const void *); #endif /* compare two sockaddr structures */ @@ -80,18 +80,11 @@ */ #define RNTORT(p) ((struct rtentry *)(p)) -#ifdef VIMAGE -static struct vnet_modinfo vnet_rtable_modinfo = { - .id = VNET_MOD_RTABLE, - .name = "rtable", - .i_attach = rtable_init, - .i_detach = rtable_idetach -}; -#endif +VNET_MOD_DECLARE_STATELESS(RTABLE, rtable, rtable_init, rtable_idetach) static int rtable_init(unused) - void *unused; + const void *unused; { INIT_VNET_NET(curvnet); @@ -106,7 +99,7 @@ #ifdef VIMAGE static int rtable_idetach(unused) - void *unused; + const void *unused; { INIT_VNET_NET(curvnet); ==== //depot/projects/vimage/src/sys/net/vnet.h#7 (text+ko) ==== @@ -45,8 +45,6 @@ #include struct vnet_net { - struct vnet *parent_vnet; - int _if_index; struct ifindex_entry *_ifindex_table; struct ifnethead _ifnet; ==== //depot/projects/vimage/src/sys/netgraph/ng_base.c#11 (text+ko) ==== @@ -248,17 +248,9 @@ #define NG_WORKLIST_UNLOCK() \ mtx_unlock(&ng_worklist_mtx) -static int vnet_netgraph_iattach(void); +static vnet_attach_fn vnet_netgraph_iattach; -#ifdef VIMAGE -struct vnet_netgraph vnet_netgraph_0; - -static struct vnet_modinfo vnet_netgraph_modinfo = { - .id = VNET_MOD_NETGRAPH, - .name = "netgraph", - .i_attach = vnet_netgraph_iattach, -}; -#endif +VNET_MOD_DECLARE(NETGRAPH, netgraph, NULL, vnet_netgraph_iattach, NULL) #ifdef NETGRAPH_DEBUG /*----------------------------------------------*/ /* @@ -3196,7 +3188,7 @@ #ifdef VIMAGE vnet_mod_register(&vnet_netgraph_modinfo); #else - vnet_netgraph_iattach(); + vnet_netgraph_iattach(NULL); #endif break; case MOD_UNLOAD: @@ -3210,22 +3202,9 @@ return (error); } -static int vnet_netgraph_iattach(void) +static int vnet_netgraph_iattach(const void *unused) { -#ifdef VIMAGE - struct vnet_netgraph *vnet_netgraph; - - if (IS_VNET_0(curvnet)) { - vnet_netgraph = &vnet_netgraph_0; - } else { - vnet_netgraph = malloc(sizeof(struct vnet_netgraph), - M_NETGRAPH, M_NOWAIT | M_ZERO); - if (vnet_netgraph == NULL) - panic("couldn't allocate memory for vnet_netgraph"); - } - curvnet->mod_data[vnet_netgraph_modinfo.id] = vnet_netgraph; - vnet_netgraph->parent_vnet = curvnet; -#endif + INIT_VNET_NETGRAPH(curvnet); LIST_INIT(&V_ng_nodelist); ==== //depot/projects/vimage/src/sys/netinet/if_ether.c#12 (text+ko) ==== @@ -119,7 +119,7 @@ "Enable proxy ARP for all suitable requests"); static void arp_init(void); -static int arp_iattach(void *); +static int arp_iattach(const void *); static void arp_rtrequest(int, struct rtentry *, struct rt_addrinfo *); static void arprequest(struct ifnet *, struct in_addr *, struct in_addr *, u_char *); @@ -131,14 +131,7 @@ static void in_arpinput(struct mbuf *); #endif -#ifdef VIMAGE -static struct vnet_modinfo vnet_arp_modinfo = { - .id = VNET_MOD_ARP, - .name = "arp", - .i_attach = arp_iattach, - .i_detach = NULL, -}; -#endif +VNET_MOD_DECLARE_STATELESS(ARP, arp, arp_iattach, NULL) /* * Timeout routine. @@ -982,7 +975,7 @@ static int arp_iattach(unused) - void *unused; + const void *unused; { INIT_VNET_INET(curvnet); ==== //depot/projects/vimage/src/sys/netinet/in_proto.c#7 (text+ko) ==== @@ -106,9 +106,6 @@ .pr_domain = &inetdomain, .pr_protocol = IPPROTO_IP, .pr_init = ip_init, -#ifdef VIMAGE - .pr_destroy = ip_detach, -#endif .pr_slowtimo = ip_slowtimo, .pr_drain = ip_drain, .pr_usrreqs = &nousrreqs ==== //depot/projects/vimage/src/sys/netinet/ip_fw.h#7 (text+ko) ==== @@ -654,8 +654,6 @@ */ #ifdef VIMAGE struct vnet_ipfw { - struct vnet *parent_vnet; - int _fw_one_pass; int _fw_enable; int _fw6_enable; ==== //depot/projects/vimage/src/sys/netinet/ip_fw2.c#19 (text+ko) ==== @@ -112,17 +112,10 @@ #include -static int vnet_ipfw_iattach(void); -static int vnet_ipfw_idetach(void); +static int vnet_ipfw_iattach(const void *); +static int vnet_ipfw_idetach(const void *); -#ifdef VIMAGE -static struct vnet_modinfo vnet_ipfw_modinfo = { - .id = VNET_MOD_IPFW, - .name = "ipfw", - .i_attach = vnet_ipfw_iattach, - .i_detach = vnet_ipfw_idetach, -}; -#endif +VNET_MOD_DECLARE(IPFW, ipfw, NULL, vnet_ipfw_iattach, vnet_ipfw_idetach) /* * set_disable contains one bit per set value (0..31). @@ -4955,19 +4948,11 @@ ipfw_tick, arg); } -static int vnet_ipfw_iattach(void) +static int vnet_ipfw_iattach(const void *unused) { + INIT_VNET_IPFW(curvnet); struct ip_fw default_rule; int error; -#ifdef VIMAGE - struct vnet_ipfw *vnet_ipfw; - - vnet_ipfw = malloc(sizeof(*vnet_ipfw), M_IPFW, M_NOWAIT | M_ZERO); - if (vnet_ipfw == NULL) - panic("couldn't allocate memory for vnet_ipfw"); - curvnet->mod_data[vnet_ipfw_modinfo.id] = vnet_ipfw; - vnet_ipfw->parent_vnet = curvnet; -#endif V_fw_debug = 1; V_autoinc_step = 100; /* bounded to 1..1000 in add_rule() */ @@ -5057,7 +5042,7 @@ #ifdef VIMAGE vnet_mod_register(&vnet_ipfw_modinfo); #else - vnet_ipfw_iattach(); + vnet_ipfw_iattach(NULL); #endif printf("ipfw2 " @@ -5104,7 +5089,7 @@ return (0); } -static int vnet_ipfw_idetach(void) +static int vnet_ipfw_idetach(const void *unused) { INIT_VNET_IPFW(curvnet); struct ip_fw *reap; @@ -5131,11 +5116,6 @@ reap_rules(reap); IPFW_LOCK_DESTROY(&V_layer3_chain); -#ifdef VIMAGE - curvnet->mod_data[vnet_ipfw_modinfo.id] = NULL; - free(vnet_ipfw, M_IPFW); -#endif - return 0; } @@ -5148,7 +5128,7 @@ #ifdef VIMAGE vnet_mod_deregister(&vnet_ipfw_modinfo); #else - vnet_ipfw_idetach(); + vnet_ipfw_idetach(NULL); #endif #ifdef IPFIREWALL_NAT ==== //depot/projects/vimage/src/sys/netinet/ip_input.c#19 (text+ko) ==== @@ -213,22 +213,17 @@ static void ip_freef(struct ipqhead *, struct ipq *); #ifdef VIMAGE -static struct vnet_inet vnet_inet_0; +static void vnet_inet_register(void); -struct vnet_symmap vnet_inet_symmap[] = { - VNET_SYMMAP_END -}; +VNET_MOD_DECLARE(INET, inet, NULL, NULL, NULL) -static struct vnet_modinfo vnet_inet_modinfo = { - .id = VNET_MOD_INET, - .name = "inet", - .symmap = vnet_inet_symmap, - .i_attach = NULL, - .i_detach = NULL, -}; +static void vnet_inet_register() +{ + vnet_mod_register(&vnet_inet_modinfo); +} -MALLOC_DEFINE(M_INET, "inet", "INET domain instance"); -#endif /* VIMAGE */ +SYSINIT(inet, SI_SUB_PROTO_BEGIN, SI_ORDER_FIRST, vnet_inet_register, 0); +#endif /* * IP initialization: fill in IP protocol switch table. @@ -237,25 +232,10 @@ void ip_init(void) { + INIT_VNET_INET(curvnet); struct protosw *pr; int i; -#ifdef VIMAGE - struct vnet_inet *vnet_inet; - - if (IS_VNET_0(curvnet)) { - vnet_mod_register(&vnet_inet_modinfo); - vnet_inet = &vnet_inet_0; - } else { - vnet_inet = malloc(sizeof(struct vnet_inet), - M_INET, M_NOWAIT | M_ZERO); - if (vnet_inet == NULL) - panic("couldn't allocate memory for vnet_inet"); - } - curvnet->mod_data[vnet_inet_modinfo.id] = vnet_inet; - vnet_inet->parent_vnet = curvnet; -#endif - TAILQ_INIT(&V_in_ifaddrhead); V_in_ifaddrhashtbl = hashinit(INADDR_NHASH, M_IFADDR, &V_in_ifaddrhmask); @@ -347,17 +327,6 @@ netisr_register(NETISR_IP, ip_input, &ipintrq, NETISR_MPSAFE); } -#ifdef VIMAGE -void -ip_detach() -{ - INIT_VNET_INET(curvnet); - - free(vnet_inet, M_INET); - curvnet->mod_data[vnet_inet_modinfo.id] = NULL; -} -#endif - void ip_fini(void *xtp) { ==== //depot/projects/vimage/src/sys/netinet/ip_var.h#7 (text+ko) ==== @@ -201,9 +201,6 @@ u_long if_hwassist_flags, int sw_csum); void ip_forward(struct mbuf *m, int srcrt); void ip_init(void); -#ifdef VIMAGE -void ip_detach(void); -#endif extern int (*ip_mforward)(struct ip *, struct ifnet *, struct mbuf *, struct ip_moptions *); ==== //depot/projects/vimage/src/sys/netinet/tcp_subr.c#24 (text+ko) ==== ==== //depot/projects/vimage/src/sys/netinet/tcp_syncache.h#6 (text+ko) ==== ==== //depot/projects/vimage/src/sys/netinet/vinet.h#18 (text+ko) ==== @@ -55,8 +55,6 @@ #include struct vnet_inet { - struct vnet *parent_vnet; - struct in_ifaddrhashhead *_in_ifaddrhashtbl; struct in_ifaddrhead _in_ifaddrhead; u_long _in_ifaddrhmask; ==== //depot/projects/vimage/src/sys/netinet6/ip6_input.c#16 (text+ko) ==== @@ -146,21 +146,16 @@ #endif #ifdef VIMAGE -static struct vnet_inet6 vnet_inet6_0; +static void vnet_inet6_register(void); + +VNET_MOD_DECLARE(INET6, inet6, NULL, NULL, NULL) + +static void vnet_inet6_register() +{ + vnet_mod_register(&vnet_inet6_modinfo); +} -struct vnet_symmap vnet_inet6_symmap[] = { - VNET_SYMMAP_END -}; - -static struct vnet_modinfo vnet_inet6_modinfo = { - .id = VNET_MOD_INET6, - .name = "inet6", - .symmap = vnet_inet6_symmap, - .i_attach = NULL, - .i_detach = NULL, >>> TRUNCATED FOR MAIL (1000 lines) <<<