diff --git a/sys/dev/if_wg/include/sys/wg_module.h b/sys/dev/if_wg/include/sys/wg_module.h index cc662104d64..0c6305ff6fc 100644 --- a/sys/dev/if_wg/include/sys/wg_module.h +++ b/sys/dev/if_wg/include/sys/wg_module.h @@ -113,9 +113,4 @@ __atomic_load_acq_size(volatile void *p, void *res, int size) __u.__val; \ }) - -int wg_ctx_init(void); -void wg_ctx_uninit(void); - - #endif diff --git a/sys/dev/if_wg/module/module.c b/sys/dev/if_wg/module/module.c index a40a304616c..a2b048d2f64 100644 --- a/sys/dev/if_wg/module/module.c +++ b/sys/dev/if_wg/module/module.c @@ -775,9 +775,9 @@ static driver_t wg_iflib_driver = { "wg", wg_if_methods, sizeof(struct wg_softc) }; -char wg_driver_version[] = "0.0.1"; +static const char wg_driver_version[] = "0.0.1"; -static struct if_shared_ctx wg_sctx_init = { +static const struct if_shared_ctx wg_sctx_init = { .isc_magic = IFLIB_MAGIC, .isc_driver_version = wg_driver_version, .isc_driver = &wg_iflib_driver, @@ -785,64 +785,61 @@ static struct if_shared_ctx wg_sctx_init = { .isc_name = "wg", }; -if_shared_ctx_t wg_sctx = &wg_sctx_init; -static if_pseudo_t wg_pseudo; +VNET_DEFINE_STATIC(if_pseudo_t, wg_pseudo); +#define V_wg_pseudo VNET(wg_pseudo) - -int -wg_ctx_init(void) +static void +wg_vnet_sysinit(void *arg) { - ratelimit_zone = uma_zcreate("wg ratelimit", sizeof(struct ratelimit), - NULL, NULL, NULL, NULL, 0, 0); - return (0); + /* + * Deregistration is handled during VNET teardown. + */ + V_wg_pseudo = iflib_clone_register(&wg_sctx_init); + if (V_wg_pseudo == NULL) + printf("%s: failed to register cloner\n", __func__); } +VNET_SYSINIT(vnet_wg_init, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY, + wg_vnet_sysinit, NULL); -void -wg_ctx_uninit(void) +static void +wg_vnet_sysuninit(void *arg) { - uma_zdestroy(ratelimit_zone); + if (V_wg_pseudo != NULL) { + iflib_clone_deregister(V_wg_pseudo); + V_wg_pseudo = NULL; + } } +VNET_SYSUNINIT(vnet_wg_uninit, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY, + wg_vnet_sysuninit, NULL); -static int +static void wg_module_init(void) { - int rc; - - if ((rc = wg_ctx_init())) - return (rc); - - wg_pseudo = iflib_clone_register(wg_sctx); - if (wg_pseudo == NULL) - return (ENXIO); - - return (0); + ratelimit_zone = uma_zcreate("wg ratelimit", sizeof(struct ratelimit), + NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); } static void wg_module_deinit(void) { - wg_ctx_uninit(); - iflib_clone_deregister(wg_pseudo); + uma_zdestroy(ratelimit_zone); } static int wg_module_event_handler(module_t mod, int what, void *arg) { - int err; - switch (what) { - case MOD_LOAD: - if ((err = wg_module_init()) != 0) - return (err); - break; - case MOD_UNLOAD: - if (clone_count == 0) - wg_module_deinit(); - else - return (EBUSY); - break; - default: - return (EOPNOTSUPP); + case MOD_LOAD: + wg_module_init(); + break; + case MOD_UNLOAD: + if (clone_count == 0) + wg_module_deinit(); + else + return (EBUSY); + break; + default: + return (EOPNOTSUPP); } return (0); } diff --git a/sys/net/iflib_clone.c b/sys/net/iflib_clone.c index 975873c4a19..01a528284c0 100644 --- a/sys/net/iflib_clone.c +++ b/sys/net/iflib_clone.c @@ -106,7 +106,9 @@ struct if_pseudo { int ip_on_list; }; -static LIST_HEAD(, if_pseudo) iflib_pseudos = LIST_HEAD_INITIALIZER(iflib_pseudos); +LIST_HEAD(if_pseudo_list, if_pseudo); +VNET_DEFINE_STATIC(struct if_pseudo_list, iflib_pseudos) = LIST_HEAD_INITIALIZER(iflib_pseudos); +#define V_iflib_pseudos VNET(iflib_pseudos) /* * XXX this assumes that the rest of the @@ -119,7 +121,7 @@ iflib_ip_lookup(const char *name) if_pseudo_t ip = NULL; PSEUDO_LOCK(); - LIST_FOREACH(ip, &iflib_pseudos, ip_list) { + LIST_FOREACH(ip, &V_iflib_pseudos, ip_list) { if (!strcmp(ip->ip_sctx->isc_name, name)) break; } @@ -143,7 +145,7 @@ iflib_ip_insert(if_pseudo_t ip) { PSEUDO_LOCK(); if (!ip->ip_on_list) { - LIST_INSERT_HEAD(&iflib_pseudos, ip, ip_list); + LIST_INSERT_HEAD(&V_iflib_pseudos, ip, ip_list); ip->ip_on_list = 1; } PSEUDO_UNLOCK(); @@ -268,12 +270,11 @@ iflib_clone_register(if_shared_ctx_t sctx) goto fail_clone; } ip->ip_lladdr_tag = EVENTHANDLER_REGISTER(iflladdr_event, - iflib_iflladdr, NULL, EVENTHANDLER_PRI_ANY); + iflib_iflladdr, NULL, EVENTHANDLER_PRI_ANY); if (ip->ip_lladdr_tag == NULL) goto fail_addr; ip->ip_detach_tag = EVENTHANDLER_REGISTER(ifnet_departure_event, - iflib_ifdetach, NULL, EVENTHANDLER_PRI_ANY); - + iflib_ifdetach, NULL, EVENTHANDLER_PRI_ANY); if (ip->ip_detach_tag == NULL) goto fail_depart;