Module Name:    src
Committed By:   ozaki-r
Date:           Tue Feb 21 03:58:24 UTC 2017

Modified Files:
        src/sys/netinet: if_arp.c if_inarp.h
        src/sys/netinet6: nd6_nbr.c

Log Message:
Replace malloc for DAD with kmem and move them out of the lock for DAD


To generate a diff of this commit:
cvs rdiff -u -r1.242 -r1.243 src/sys/netinet/if_arp.c
cvs rdiff -u -r1.50 -r1.51 src/sys/netinet/if_inarp.h
cvs rdiff -u -r1.136 -r1.137 src/sys/netinet6/nd6_nbr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netinet/if_arp.c
diff -u src/sys/netinet/if_arp.c:1.242 src/sys/netinet/if_arp.c:1.243
--- src/sys/netinet/if_arp.c:1.242	Sat Feb 11 15:37:30 2017
+++ src/sys/netinet/if_arp.c	Tue Feb 21 03:58:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_arp.c,v 1.242 2017/02/11 15:37:30 roy Exp $	*/
+/*	$NetBSD: if_arp.c,v 1.243 2017/02/21 03:58:23 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.242 2017/02/11 15:37:30 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.243 2017/02/21 03:58:23 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -84,7 +84,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/callout.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
 #include <sys/mbuf.h>
 #include <sys/socket.h>
 #include <sys/time.h>
@@ -1515,7 +1515,6 @@ struct dadq {
 	int dad_arp_acount;	/* # of announcements */
 	struct callout dad_timer_ch;
 };
-MALLOC_JUSTDEFINE(M_IPARP, "ARP DAD", "ARP DAD Structure");
 
 static struct dadq_head dadq;
 static int dad_init = 0;
@@ -1613,14 +1612,17 @@ arp_dad_start(struct ifaddr *ifa)
 	if (!(ifa->ifa_ifp->if_flags & IFF_UP))
 		return;
 
+	dp = kmem_intr_alloc(sizeof(*dp), KM_NOSLEEP);
+
 	mutex_enter(&arp_dad_lock);
 	if (arp_dad_find(ifa) != NULL) {
 		mutex_exit(&arp_dad_lock);
 		/* DAD already in progress */
+		if (dp != NULL)
+			kmem_intr_free(dp, sizeof(*dp));
 		return;
 	}
 
-	dp = malloc(sizeof(*dp), M_IPARP, M_NOWAIT);
 	if (dp == NULL) {
 		mutex_exit(&arp_dad_lock);
 		log(LOG_ERR, "%s: memory allocation failed for %s(%s)\n",
@@ -1628,13 +1630,12 @@ arp_dad_start(struct ifaddr *ifa)
 		    ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???");
 		return;
 	}
-	memset(dp, 0, sizeof(*dp));
-	callout_init(&dp->dad_timer_ch, CALLOUT_MPSAFE);
 
 	/*
 	 * Send ARP packet for DAD, ip_dad_count times.
 	 * Note that we must delay the first transmission.
 	 */
+	callout_init(&dp->dad_timer_ch, CALLOUT_MPSAFE);
 	dp->dad_ifa = ifa;
 	ifaref(ifa);	/* just for safety */
 	dp->dad_count = ip_dad_count;
@@ -1675,8 +1676,7 @@ arp_dad_stop(struct ifaddr *ifa)
 
 	arp_dad_stoptimer(dp);
 
-	free(dp, M_IPARP);
-	dp = NULL;
+	kmem_intr_free(dp, sizeof(*dp));
 	ifafree(ifa);
 }
 
@@ -1686,6 +1686,7 @@ arp_dad_timer(struct ifaddr *ifa)
 	struct in_ifaddr *ia = (struct in_ifaddr *)ifa;
 	struct dadq *dp;
 	char ipbuf[INET_ADDRSTRLEN];
+	bool need_free = false;
 
 #ifndef NET_MPSAFE
 	mutex_enter(softnet_lock);
@@ -1723,9 +1724,7 @@ arp_dad_timer(struct ifaddr *ifa)
 		    if_name(ifa->ifa_ifp));
 
 		TAILQ_REMOVE(&dadq, dp, dad_list);
-		free(dp, M_IPARP);
-		dp = NULL;
-		ifafree(ifa);
+		need_free = true;
 		goto done;
 	}
 
@@ -1774,12 +1773,15 @@ announce:
 	}
 
 	TAILQ_REMOVE(&dadq, dp, dad_list);
-	free(dp, M_IPARP);
-	dp = NULL;
-	ifafree(ifa);
-
+	need_free = true;
 done:
 	mutex_exit(&arp_dad_lock);
+
+	if (need_free) {
+		kmem_intr_free(dp, sizeof(*dp));
+		ifafree(ifa);
+	}
+
 #ifndef NET_MPSAFE
 	KERNEL_UNLOCK_ONE(NULL);
 	mutex_exit(softnet_lock);

Index: src/sys/netinet/if_inarp.h
diff -u src/sys/netinet/if_inarp.h:1.50 src/sys/netinet/if_inarp.h:1.51
--- src/sys/netinet/if_inarp.h:1.50	Tue Oct 11 12:32:30 2016
+++ src/sys/netinet/if_inarp.h	Tue Feb 21 03:58:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_inarp.h,v 1.50 2016/10/11 12:32:30 roy Exp $	*/
+/*	$NetBSD: if_inarp.h,v 1.51 2017/02/21 03:58:24 ozaki-r Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -69,9 +69,6 @@ struct sockaddr_inarp {
 #define RATE_LIMIT_INTERVAL     60
 #define DEFEND_INTERVAL         10
 
-#include <sys/malloc.h>
-MALLOC_DECLARE(M_IPARP);
-
 extern struct ifqueue arpintrq;
 void arp_ifinit(struct ifnet *, struct ifaddr *);
 void arp_rtrequest(int, struct rtentry *, const struct rt_addrinfo *);

Index: src/sys/netinet6/nd6_nbr.c
diff -u src/sys/netinet6/nd6_nbr.c:1.136 src/sys/netinet6/nd6_nbr.c:1.137
--- src/sys/netinet6/nd6_nbr.c:1.136	Mon Jan 16 15:44:47 2017
+++ src/sys/netinet6/nd6_nbr.c	Tue Feb 21 03:58:24 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6_nbr.c,v 1.136 2017/01/16 15:44:47 christos Exp $	*/
+/*	$NetBSD: nd6_nbr.c,v 1.137 2017/02/21 03:58:24 ozaki-r Exp $	*/
 /*	$KAME: nd6_nbr.c,v 1.61 2001/02/10 16:06:14 jinmei Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6_nbr.c,v 1.136 2017/01/16 15:44:47 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6_nbr.c,v 1.137 2017/02/21 03:58:24 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -40,7 +40,7 @@ __KERNEL_RCSID(0, "$NetBSD: nd6_nbr.c,v 
 
 #include <sys/param.h>
 #include <sys/systm.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
 #include <sys/mbuf.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
@@ -1154,14 +1154,17 @@ nd6_dad_start(struct ifaddr *ifa, int xt
 	if (!(ifa->ifa_ifp->if_flags & IFF_UP))
 		return;
 
+	dp = kmem_intr_alloc(sizeof(*dp), KM_NOSLEEP);
+
 	mutex_enter(&nd6_dad_lock);
 	if (nd6_dad_find(ifa) != NULL) {
 		mutex_exit(&nd6_dad_lock);
 		/* DAD already in progress */
+		if (dp != NULL)
+			kmem_intr_free(dp, sizeof(*dp));
 		return;
 	}
 
-	dp = malloc(sizeof(*dp), M_IP6NDP, M_NOWAIT);
 	if (dp == NULL) {
 		mutex_exit(&nd6_dad_lock);
 		log(LOG_ERR, "nd6_dad_start: memory allocation failed for "
@@ -1170,8 +1173,6 @@ nd6_dad_start(struct ifaddr *ifa, int xt
 			ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???");
 		return;
 	}
-	memset(dp, 0, sizeof(*dp));
-	callout_init(&dp->dad_timer_ch, CALLOUT_MPSAFE);
 
 	/*
 	 * Send NS packet for DAD, ip6_dad_count times.
@@ -1179,6 +1180,7 @@ nd6_dad_start(struct ifaddr *ifa, int xt
 	 * first packet to be sent from the interface after interface
 	 * (re)initialization.
 	 */
+	callout_init(&dp->dad_timer_ch, CALLOUT_MPSAFE);
 	dp->dad_ifa = ifa;
 	ifaref(ifa);	/* just for safety */
 	dp->dad_count = ip6_dad_count;
@@ -1223,8 +1225,7 @@ nd6_dad_stop(struct ifaddr *ifa)
 
 	nd6_dad_stoptimer(dp);
 
-	free(dp, M_IP6NDP);
-	dp = NULL;
+	kmem_intr_free(dp, sizeof(*dp));
 	ifafree(ifa);
 }
 
@@ -1235,6 +1236,7 @@ nd6_dad_timer(struct ifaddr *ifa)
 	struct dadq *dp;
 	int duplicate = 0;
 	char ip6buf[INET6_ADDRSTRLEN];
+	bool need_free = false;
 
 #ifndef NET_MPSAFE
 	mutex_enter(softnet_lock);
@@ -1273,9 +1275,7 @@ nd6_dad_timer(struct ifaddr *ifa)
 			if_name(ifa->ifa_ifp));
 
 		TAILQ_REMOVE(&dadq, dp, dad_list);
-		free(dp, M_IP6NDP);
-		dp = NULL;
-		ifafree(ifa);
+		need_free = true;
 		goto done;
 	}
 
@@ -1322,15 +1322,18 @@ nd6_dad_timer(struct ifaddr *ifa)
 			    IN6_PRINT(ip6buf, &ia->ia_addr.sin6_addr));
 
 			TAILQ_REMOVE(&dadq, dp, dad_list);
-			free(dp, M_IP6NDP);
-			dp = NULL;
-			ifafree(ifa);
+			need_free = true;
 		}
 	}
-
 done:
 	mutex_exit(&nd6_dad_lock);
 
+	if (need_free) {
+		kmem_intr_free(dp, sizeof(*dp));
+		ifafree(ifa);
+		ifa = NULL;
+	}
+
 	if (duplicate)
 		nd6_dad_duplicated(ifa);
 
@@ -1413,8 +1416,7 @@ nd6_dad_duplicated(struct ifaddr *ifa)
 	TAILQ_REMOVE(&dadq, dp, dad_list);
 	mutex_exit(&nd6_dad_lock);
 
-	free(dp, M_IP6NDP);
-	dp = NULL;
+	kmem_intr_free(dp, sizeof(*dp));
 	ifafree(ifa);
 }
 

Reply via email to