Setting variable arpinit_done is not MP save if we want to execute
authorbluhm <bluhm@openbsd.org>
Fri, 23 Apr 2021 21:55:36 +0000 (21:55 +0000)
committerbluhm <bluhm@openbsd.org>
Fri, 23 Apr 2021 21:55:36 +0000 (21:55 +0000)
arp_rtrequest() in parallel.  Move initialization to arpinit()
function.
OK kettenis@ mvs@

sys/netinet/if_ether.c
sys/netinet/if_ether.h
sys/netinet/ip_input.c

index 710f7d5..79ea9e1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_ether.c,v 1.244 2021/04/23 21:47:32 bluhm Exp $    */
+/*     $OpenBSD: if_ether.c,v 1.245 2021/04/23 21:55:36 bluhm Exp $    */
 /*     $NetBSD: if_ether.c,v 1.31 1996/05/11 12:59:58 mycroft Exp $    */
 
 /*
@@ -96,7 +96,6 @@ struct niqueue arpinq = NIQUEUE_INITIALIZER(50, NETISR_ARP);
 LIST_HEAD(, llinfo_arp) arp_list;
 struct pool arp_pool;          /* pool for llinfo_arp structures */
 int    arp_maxtries = 5;
-int    arpinit_done;
 int    la_hold_total;
 
 #ifdef NFSCLIENT
@@ -113,7 +112,7 @@ unsigned int revarp_ifidx;
 void
 arptimer(void *arg)
 {
-       struct timeout *to = (struct timeout *)arg;
+       struct timeout *to = arg;
        struct llinfo_arp *la, *nla;
 
        NET_LOCK();
@@ -128,21 +127,22 @@ arptimer(void *arg)
 }
 
 void
-arp_rtrequest(struct ifnet *ifp, int req, struct rtentry *rt)
+arpinit(void)
 {
-       struct sockaddr *gate = rt->rt_gateway;
-       struct llinfo_arp *la = (struct llinfo_arp *)rt->rt_llinfo;
+       static struct timeout arptimer_to;
 
-       if (!arpinit_done) {
-               static struct timeout arptimer_to;
+       pool_init(&arp_pool, sizeof(struct llinfo_arp), 0,
+           IPL_SOFTNET, 0, "arp", NULL);
 
-               arpinit_done = 1;
-               pool_init(&arp_pool, sizeof(struct llinfo_arp), 0,
-                   IPL_SOFTNET, 0, "arp", NULL);
+       timeout_set_proc(&arptimer_to, arptimer, &arptimer_to);
+       timeout_add_sec(&arptimer_to, arpt_prune);
+}
 
-               timeout_set_proc(&arptimer_to, arptimer, &arptimer_to);
-               timeout_add_sec(&arptimer_to, arpt_prune);
-       }
+void
+arp_rtrequest(struct ifnet *ifp, int req, struct rtentry *rt)
+{
+       struct sockaddr *gate = rt->rt_gateway;
+       struct llinfo_arp *la = (struct llinfo_arp *)rt->rt_llinfo;
 
        if (ISSET(rt->rt_flags,
            RTF_GATEWAY|RTF_BROADCAST|RTF_MULTICAST|RTF_MPLS))
index a3e5dc7..56e6384 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_ether.h,v 1.81 2021/03/10 10:21:48 jsg Exp $       */
+/*     $OpenBSD: if_ether.h,v 1.82 2021/04/23 21:55:36 bluhm Exp $     */
 /*     $NetBSD: if_ether.h,v 1.22 1996/05/11 13:00:00 mycroft Exp $    */
 
 /*
@@ -257,6 +257,7 @@ void        revarprequest(struct ifnet *);
 int    revarpwhoarewe(struct ifnet *, struct in_addr *, struct in_addr *);
 int    revarpwhoami(struct in_addr *, struct ifnet *);
 
+void   arpinit(void);
 void   arpinput(struct ifnet *, struct mbuf *);
 void   arprequest(struct ifnet *, u_int32_t *, u_int32_t *, u_int8_t *);
 void   arpwhohas(struct arpcom *, struct in_addr *);
index 69d5646..7578303 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ip_input.c,v 1.357 2021/04/23 21:47:32 bluhm Exp $    */
+/*     $OpenBSD: ip_input.c,v 1.358 2021/04/23 21:55:36 bluhm Exp $    */
 /*     $NetBSD: ip_input.c,v 1.30 1996/03/16 23:53:58 christos Exp $   */
 
 /*
@@ -223,6 +223,7 @@ ip_init(void)
        mq_init(&ipsend_mq, 64, IPL_SOFTNET);
        mq_init(&ipsendraw_mq, 64, IPL_SOFTNET);
 
+       arpinit();
 #ifdef IPSEC
        ipsec_init();
 #endif