From 0d636a21cfa5d81f7fd46808ce0789429c6a85ec Mon Sep 17 00:00:00 2001 From: Mateusz Guzik Date: Sun, 14 Aug 2022 18:06:08 +0000 Subject: [PATCH 4/7] routing: switch rt_addrmsg to EVENTHANDLER_SLEEPABLE Reviewed by: Differential Revision: --- sys/net/route.c | 7 +++++-- sys/net/route.h | 7 +++++++ sys/netinet/sctp_bsd_addr.c | 7 +++++-- sys/netinet/sctp_bsd_addr.h | 2 +- sys/netinet/sctp_pcb.h | 1 - sys/netinet/sctp_usrreq.c | 7 ++++--- sys/sys/eventhandler.h | 5 ----- 7 files changed, 22 insertions(+), 14 deletions(-) diff --git a/sys/net/route.c b/sys/net/route.c index 2ea8d4ab5c47..30921c577ad9 100644 --- a/sys/net/route.c +++ b/sys/net/route.c @@ -77,7 +77,7 @@ VNET_PCPUSTAT_SYSINIT(rtstat); VNET_PCPUSTAT_SYSUNINIT(rtstat); #endif -EVENTHANDLER_LIST_DEFINE(rt_addrmsg); +EVENTHANDLER_SLEEPABLE_DEFINE(rt_addrmsg); static int rt_ifdelroute(const struct rtentry *rt, const struct nhop_object *, void *arg); @@ -606,6 +606,7 @@ rt_maskedcopy(const struct sockaddr *src, struct sockaddr *dst, int rt_addrmsg(int cmd, struct ifaddr *ifa, int fibnum) { + struct rt_addrmsg_arg rta; #if defined(INET) || defined(INET6) struct sockaddr *sa = ifa->ifa_addr; struct ifnet *ifp = ifa->ifa_ifp; @@ -616,7 +617,9 @@ rt_addrmsg(int cmd, struct ifaddr *ifa, int fibnum) KASSERT((fibnum >= 0 && fibnum < rt_numfibs), ("%s: fib out of range 0 <=%d<%d", __func__, fibnum, rt_numfibs)); - EVENTHANDLER_DIRECT_INVOKE(rt_addrmsg, ifa, cmd); + rta.ifa = ifa; + rta.cmd = cmd; + EVENTHANDLER_SLEEPABLE_INVOKE(rt_addrmsg, &rta); #ifdef INET if (sa->sa_family == AF_INET) { diff --git a/sys/net/route.h b/sys/net/route.h index 87cbbbf1d83d..82211dc9b058 100644 --- a/sys/net/route.h +++ b/sys/net/route.h @@ -36,6 +36,7 @@ #define _NET_ROUTE_H_ #include +#include /* * Kernel resident routing tables. @@ -411,6 +412,12 @@ struct rt_addrinfo { struct ifmultiaddr; struct rib_head; +struct rt_addrmsg_arg { + struct ifaddr *ifa; + int cmd; +}; +EVENTHANDLER_SLEEPABLE_DECLARE(rt_addrmsg); + void rt_ieee80211msg(struct ifnet *, int, void *, size_t); void rt_ifmsg(struct ifnet *); void rt_missmsg(int, struct rt_addrinfo *, int, int); diff --git a/sys/netinet/sctp_bsd_addr.c b/sys/netinet/sctp_bsd_addr.c index c2f6b786948a..241fc6e48462 100644 --- a/sys/netinet/sctp_bsd_addr.c +++ b/sys/netinet/sctp_bsd_addr.c @@ -352,9 +352,12 @@ sctp_addr_change(struct ifaddr *ifa, int cmd) } void -sctp_addr_change_event_handler(void *arg __unused, struct ifaddr *ifa, int cmd) +sctp_addr_change_event_handler(void *arg) { - sctp_addr_change(ifa, cmd); + struct rt_addrmsg_arg *rta; + + rta = arg; + sctp_addr_change(rta->ifa, rta->cmd); } struct mbuf * diff --git a/sys/netinet/sctp_bsd_addr.h b/sys/netinet/sctp_bsd_addr.h index dbe2301d008a..f98e2d7ec911 100644 --- a/sys/netinet/sctp_bsd_addr.h +++ b/sys/netinet/sctp_bsd_addr.h @@ -60,7 +60,7 @@ int sctp_copy_out_packet_log(uint8_t *target, int length); void sctp_addr_change(struct ifaddr *ifa, int cmd); -void sctp_addr_change_event_handler(void *, struct ifaddr *, int); +void sctp_addr_change_event_handler(void *); void sctp_add_or_del_interfaces(int (*pred) (struct ifnet *), int add); diff --git a/sys/netinet/sctp_pcb.h b/sys/netinet/sctp_pcb.h index fd8115a8101a..b17c610009e5 100644 --- a/sys/netinet/sctp_pcb.h +++ b/sys/netinet/sctp_pcb.h @@ -257,7 +257,6 @@ struct sctp_base_info { int packet_log_end; uint8_t packet_log_buffer[SCTP_PACKET_LOG_SIZE]; #endif - eventhandler_tag eh_tag; }; /*- diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index 58a9d610b003..00a108dfb214 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -88,8 +88,8 @@ sctp_init(void *arg SCTP_UNUSED) SCTP_BASE_VAR(packet_log_end) = 0; memset(&SCTP_BASE_VAR(packet_log_buffer), 0, SCTP_PACKET_LOG_SIZE); #endif - SCTP_BASE_VAR(eh_tag) = EVENTHANDLER_REGISTER(rt_addrmsg, - sctp_addr_change_event_handler, NULL, EVENTHANDLER_PRI_FIRST); + EVENTHANDLER_SLEEPABLE_REGISTER(rt_addrmsg, + sctp_addr_change_event_handler, FIRST); } VNET_SYSINIT(sctp_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, sctp_init, NULL); @@ -98,7 +98,8 @@ VNET_SYSINIT(sctp_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, sctp_init, NULL); static void sctp_finish(void *unused __unused) { - EVENTHANDLER_DEREGISTER(rt_addrmsg, SCTP_BASE_VAR(eh_tag)); + EVENTHANDLER_SLEEPABLE_DEREGISTER(rt_addrmsg, + sctp_addr_change_event_handler); sctp_pcb_finish(); } diff --git a/sys/sys/eventhandler.h b/sys/sys/eventhandler.h index f08ffaa76251..e94540b0c632 100644 --- a/sys/sys/eventhandler.h +++ b/sys/sys/eventhandler.h @@ -280,11 +280,6 @@ EVENTHANDLER_DECLARE(device_attach, device_attach_fn); EVENTHANDLER_DECLARE(device_detach, device_detach_fn); EVENTHANDLER_DECLARE(device_nomatch, device_nomatch_fn); -/* Interface address addition and removal event */ -struct ifaddr; -typedef void (*rt_addrmsg_fn)(void *, struct ifaddr *, int); -EVENTHANDLER_DECLARE(rt_addrmsg, rt_addrmsg_fn); - /* * Preemptible and sleepable eventhandler support. */ -- 2.34.1