Module Name:    src
Committed By:   ozaki-r
Date:           Thu Sep  1 04:27:00 UTC 2016

Modified Files:
        src/sys/netinet: in.c

Log Message:
Apply psz/psref to remaining IFADDR_READER_FOREACH

Pointed out by ryo@


To generate a diff of this commit:
cvs rdiff -u -r1.178 -r1.179 src/sys/netinet/in.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/in.c
diff -u src/sys/netinet/in.c:1.178 src/sys/netinet/in.c:1.179
--- src/sys/netinet/in.c:1.178	Mon Aug  1 03:15:30 2016
+++ src/sys/netinet/in.c	Thu Sep  1 04:27:00 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: in.c,v 1.178 2016/08/01 03:15:30 ozaki-r Exp $	*/
+/*	$NetBSD: in.c,v 1.179 2016/09/01 04:27:00 ozaki-r Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.178 2016/08/01 03:15:30 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.179 2016/09/01 04:27:00 ozaki-r Exp $");
 
 #include "arp.h"
 
@@ -944,7 +944,7 @@ in_lifaddr_ioctl(struct socket *so, u_lo
 		struct in_ifaddr *ia;
 		struct in_addr mask, candidate, match;
 		struct sockaddr_in *sin;
-		int cmp;
+		int cmp, s;
 
 		memset(&mask, 0, sizeof(mask));
 		memset(&match, 0, sizeof(match));	/* XXX gcc */
@@ -975,6 +975,7 @@ in_lifaddr_ioctl(struct socket *so, u_lo
 			}
 		}
 
+		s = pserialize_read_enter();
 		IFADDR_READER_FOREACH(ifa, ifp) {
 			if (ifa->ifa_addr->sa_family != AF_INET)
 				continue;
@@ -985,8 +986,10 @@ in_lifaddr_ioctl(struct socket *so, u_lo
 			if (candidate.s_addr == match.s_addr)
 				break;
 		}
-		if (ifa == NULL)
+		if (ifa == NULL) {
+			pserialize_read_exit(s);
 			return EADDRNOTAVAIL;
+		}
 		ia = (struct in_ifaddr *)ifa;
 
 		if (cmd == SIOCGLIFADDR) {
@@ -1003,6 +1006,7 @@ in_lifaddr_ioctl(struct socket *so, u_lo
 				in_mask2len(&ia->ia_sockmask.sin_addr);
 
 			iflr->flags = 0;	/*XXX*/
+			pserialize_read_exit(s);
 
 			return 0;
 		} else {
@@ -1021,6 +1025,7 @@ in_lifaddr_ioctl(struct socket *so, u_lo
 			}
 			memcpy(&ifra.ifra_dstaddr, &ia->ia_sockmask,
 				ia->ia_sockmask.sin_len);
+			pserialize_read_exit(s);
 
 			return in_control(so, SIOCDIFADDR, &ifra, ifp);
 		}
@@ -1342,6 +1347,7 @@ in_if_link_up(struct ifnet *ifp)
 {
 	struct ifaddr *ifa;
 	struct in_ifaddr *ia;
+	int s, bound;
 
 	/* Ensure it's sane to run DAD */
 	if (ifp->if_link_state == LINK_STATE_DOWN)
@@ -1349,9 +1355,16 @@ in_if_link_up(struct ifnet *ifp)
 	if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING))
 		return;
 
+	bound = curlwp_bind();
+	s = pserialize_read_enter();
 	IFADDR_READER_FOREACH(ifa, ifp) {
+		struct psref psref;
+
 		if (ifa->ifa_addr->sa_family != AF_INET)
 			continue;
+		ifa_acquire(ifa, &psref);
+		pserialize_read_exit(s);
+
 		ia = (struct in_ifaddr *)ifa;
 
 		/* If detached then mark as tentative */
@@ -1368,7 +1381,12 @@ in_if_link_up(struct ifnet *ifp)
 			ia->ia4_flags &= ~IN_IFF_DUPLICATED;
 			ia->ia_dad_start(ifa);
 		}
+
+		s = pserialize_read_enter();
+		ifa_release(ifa, &psref);
 	}
+	pserialize_read_exit(s);
+	curlwp_bindx(bound);
 }
 
 void
@@ -1387,10 +1405,18 @@ in_if_link_down(struct ifnet *ifp)
 {
 	struct ifaddr *ifa;
 	struct in_ifaddr *ia;
+	int s, bound;
 
+	bound = curlwp_bind();
+	s = pserialize_read_enter();
 	IFADDR_READER_FOREACH(ifa, ifp) {
+		struct psref psref;
+
 		if (ifa->ifa_addr->sa_family != AF_INET)
 			continue;
+		ifa_acquire(ifa, &psref);
+		pserialize_read_exit(s);
+
 		ia = (struct in_ifaddr *)ifa;
 
 		/* Stop DAD processing */
@@ -1406,7 +1432,12 @@ in_if_link_down(struct ifnet *ifp)
 			    ~(IN_IFF_TENTATIVE | IN_IFF_DUPLICATED);
 			rt_newaddrmsg(RTM_NEWADDR, ifa, 0, NULL);
 		}
+
+		s = pserialize_read_enter();
+		ifa_release(ifa, &psref);
 	}
+	pserialize_read_exit(s);
+	curlwp_bindx(bound);
 }
 
 void

Reply via email to