Apply pserialize to some iterations of IP address lists

This commit is contained in:
ozaki-r 2016-07-20 07:37:51 +00:00
parent eef1e5e6e7
commit 4f21a42704
9 changed files with 68 additions and 23 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: svr4_sockio.c,v 1.38 2016/07/07 09:32:02 ozaki-r Exp $ */
/* $NetBSD: svr4_sockio.c,v 1.39 2016/07/20 07:37:51 ozaki-r Exp $ */
/*-
* Copyright (c) 1995, 2008 The NetBSD Foundation, Inc.
@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: svr4_sockio.c,v 1.38 2016/07/07 09:32:02 ozaki-r Exp $");
__KERNEL_RCSID(0, "$NetBSD: svr4_sockio.c,v 1.39 2016/07/20 07:37:51 ozaki-r Exp $");
#include <sys/param.h>
#include <sys/proc.h>
@ -87,10 +87,12 @@ svr4_count_ifnum(struct ifnet *ifp)
{
struct ifaddr *ifa;
int ifnum = 0;
int s = pserialize_read_enter();
IFADDR_READER_FOREACH(ifa, ifp)
ifnum++;
pserialize_read_exit(s);
return MAX(1, ifnum);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_dmc.c,v 1.25 2016/07/07 09:32:02 ozaki-r Exp $ */
/* $NetBSD: if_dmc.c,v 1.26 2016/07/20 07:37:51 ozaki-r Exp $ */
/*
* Copyright (c) 1982, 1986 Regents of the University of California.
* All rights reserved.
@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: if_dmc.c,v 1.25 2016/07/07 09:32:02 ozaki-r Exp $");
__KERNEL_RCSID(0, "$NetBSD: if_dmc.c,v 1.26 2016/07/20 07:37:51 ozaki-r Exp $");
#undef DMCDEBUG /* for base table dump on fatal error */
@ -313,9 +313,12 @@ dmcinit(struct ifnet *ifp)
* Check to see that an address has been set
* (both local and destination for an address family).
*/
IFADDR_READER_FOREACH(ifa, ifp)
s = pserialize_read_enter();
IFADDR_READER_FOREACH(ifa, ifp) {
if (ifa->ifa_addr->sa_family && ifa->ifa_dstaddr->sa_family)
break;
}
pserialize_read_exit(s);
if (ifa == NULL)
return 0;

View File

@ -1,4 +1,4 @@
/* $NetBSD: pf_if.c,v 1.30 2016/07/07 09:32:02 ozaki-r Exp $ */
/* $NetBSD: pf_if.c,v 1.31 2016/07/20 07:37:51 ozaki-r Exp $ */
/* $OpenBSD: pf_if.c,v 1.47 2007/07/13 09:17:48 markus Exp $ */
/*
@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: pf_if.c,v 1.30 2016/07/07 09:32:02 ozaki-r Exp $");
__KERNEL_RCSID(0, "$NetBSD: pf_if.c,v 1.31 2016/07/20 07:37:51 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@ -556,9 +556,13 @@ pfi_instance_add(struct ifnet *ifp, int net, int flags)
struct ifaddr *ia;
int got4 = 0, got6 = 0;
int net2, af;
int s;
if (ifp == NULL)
return;
/* Depends on pfi_address_add doesn't sleep */
s = pserialize_read_enter();
IFADDR_READER_FOREACH(ia, ifp) {
af = ia->ifa_addr->sa_family;
if (af != AF_INET && af != AF_INET6)
@ -603,6 +607,7 @@ pfi_instance_add(struct ifnet *ifp, int net, int flags)
else
pfi_address_add(ia->ifa_addr, af, net2);
}
pserialize_read_exit(s);
}
void

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_agr.c,v 1.37 2016/07/07 09:32:02 ozaki-r Exp $ */
/* $NetBSD: if_agr.c,v 1.38 2016/07/20 07:37:51 ozaki-r Exp $ */
/*-
* Copyright (c)2005 YAMAMOTO Takashi,
@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: if_agr.c,v 1.37 2016/07/07 09:32:02 ozaki-r Exp $");
__KERNEL_RCSID(0, "$NetBSD: if_agr.c,v 1.38 2016/07/20 07:37:51 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@ -567,6 +567,7 @@ agr_addport(struct ifnet *ifp, struct ifnet *ifp_port)
struct agr_softc *sc = ifp->if_softc;
struct agr_port *port = NULL;
int error = 0;
int s;
if (ifp_port->if_ioctl == NULL) {
error = EOPNOTSUPP;
@ -591,12 +592,15 @@ agr_addport(struct ifnet *ifp, struct ifnet *ifp_port)
}
port->port_flags = AGRPORT_LARVAL;
s = pserialize_read_enter();
IFADDR_READER_FOREACH(ifa, ifp_port) {
if (ifa->ifa_addr->sa_family != AF_LINK) {
pserialize_read_exit(s);
error = EBUSY;
goto out;
}
}
pserialize_read_exit(s);
if (sc->sc_nports == 0) {
switch (ifp_port->if_type) {

View File

@ -1,4 +1,4 @@
/* $NetBSD: in6.c,v 1.209 2016/07/15 07:40:09 ozaki-r Exp $ */
/* $NetBSD: in6.c,v 1.210 2016/07/20 07:37:51 ozaki-r Exp $ */
/* $KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $ */
/*
@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.209 2016/07/15 07:40:09 ozaki-r Exp $");
__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.210 2016/07/20 07:37:51 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@ -1832,15 +1832,20 @@ int
in6_localaddr(const struct in6_addr *in6)
{
struct in6_ifaddr *ia;
int s;
if (IN6_IS_ADDR_LOOPBACK(in6) || IN6_IS_ADDR_LINKLOCAL(in6))
return 1;
s = pserialize_read_enter();
IN6_ADDRLIST_READER_FOREACH(ia) {
if (IN6_ARE_MASKED_ADDR_EQUAL(in6, &ia->ia_addr.sin6_addr,
&ia->ia_prefixmask.sin6_addr))
&ia->ia_prefixmask.sin6_addr)) {
pserialize_read_exit(s);
return 1;
}
}
pserialize_read_exit(s);
return 0;
}
@ -1849,18 +1854,23 @@ int
in6_is_addr_deprecated(struct sockaddr_in6 *sa6)
{
struct in6_ifaddr *ia;
int s;
s = pserialize_read_enter();
IN6_ADDRLIST_READER_FOREACH(ia) {
if (IN6_ARE_ADDR_EQUAL(&ia->ia_addr.sin6_addr,
&sa6->sin6_addr) &&
#ifdef SCOPEDROUTING
ia->ia_addr.sin6_scope_id == sa6->sin6_scope_id &&
#endif
(ia->ia6_flags & IN6_IFF_DEPRECATED) != 0)
(ia->ia6_flags & IN6_IFF_DEPRECATED) != 0) {
pserialize_read_exit(s);
return 1; /* true */
}
/* XXX: do we still have to go thru the rest of the list? */
}
pserialize_read_exit(s);
return 0; /* false */
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: in6_ifattach.c,v 1.101 2016/07/07 09:32:03 ozaki-r Exp $ */
/* $NetBSD: in6_ifattach.c,v 1.102 2016/07/20 07:37:51 ozaki-r Exp $ */
/* $KAME: in6_ifattach.c,v 1.124 2001/07/18 08:32:51 jinmei Exp $ */
/*
@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: in6_ifattach.c,v 1.101 2016/07/07 09:32:03 ozaki-r Exp $");
__KERNEL_RCSID(0, "$NetBSD: in6_ifattach.c,v 1.102 2016/07/20 07:37:51 ozaki-r Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -244,6 +244,7 @@ generate_tmp_ifid(u_int8_t *seed0, const u_int8_t *seed1, u_int8_t *ret)
badid = 1;
else {
struct in6_ifaddr *ia;
int s = pserialize_read_enter();
IN6_ADDRLIST_READER_FOREACH(ia) {
if (!memcmp(&ia->ia_addr.sin6_addr.s6_addr[8],
@ -252,6 +253,7 @@ generate_tmp_ifid(u_int8_t *seed0, const u_int8_t *seed1, u_int8_t *ret)
break;
}
}
pserialize_read_exit(s);
}
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: mld6.c,v 1.72 2016/07/08 04:33:30 ozaki-r Exp $ */
/* $NetBSD: mld6.c,v 1.73 2016/07/20 07:37:51 ozaki-r Exp $ */
/* $KAME: mld6.c,v 1.25 2001/01/16 14:14:18 itojun Exp $ */
/*
@ -102,7 +102,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.72 2016/07/08 04:33:30 ozaki-r Exp $");
__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.73 2016/07/20 07:37:51 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@ -723,6 +723,8 @@ in6_delmulti(struct in6_multi *in6m)
mld_stoptimer(in6m);
if (--in6m->in6m_refcount == 0) {
int _s;
/*
* No remaining claims to this record; let MLD6 know
* that we are leaving the multicast group.
@ -742,6 +744,7 @@ in6_delmulti(struct in6_multi *in6m)
* Delete all references of this multicasting group from
* the membership arrays
*/
_s = pserialize_read_enter();
IN6_ADDRLIST_READER_FOREACH(ia) {
struct in6_multi_mship *imm;
LIST_FOREACH(imm, &ia->ia6_memberships, i6mm_chain) {
@ -749,6 +752,7 @@ in6_delmulti(struct in6_multi *in6m)
imm->i6mm_maddr = NULL;
}
}
pserialize_read_exit(_s);
/*
* Notify the network driver to update its multicast

View File

@ -1,4 +1,4 @@
/* $NetBSD: nd6_rtr.c,v 1.116 2016/07/15 07:40:09 ozaki-r Exp $ */
/* $NetBSD: nd6_rtr.c,v 1.117 2016/07/20 07:37:51 ozaki-r Exp $ */
/* $KAME: nd6_rtr.c,v 1.95 2001/02/07 08:09:47 itojun Exp $ */
/*
@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.116 2016/07/15 07:40:09 ozaki-r Exp $");
__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.117 2016/07/20 07:37:51 ozaki-r Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -1911,6 +1911,7 @@ in6_tmpifadd(
int updateflags;
u_int32_t randid[2];
u_int32_t vltime0, pltime0;
int s;
memset(&ifra, 0, sizeof(ifra));
strncpy(ifra.ifra_name, if_name(ifp), sizeof(ifra.ifra_name));
@ -1940,9 +1941,11 @@ in6_tmpifadd(
* there may be a time lag between generation of the ID and generation
* of the address. So, we'll do one more sanity check.
*/
s = pserialize_read_enter();
IN6_ADDRLIST_READER_FOREACH(ia) {
if (IN6_ARE_ADDR_EQUAL(&ia->ia_addr.sin6_addr,
&ifra.ifra_addr.sin6_addr)) {
pserialize_read_exit(s);
if (trylimit-- == 0) {
/*
* Give up. Something strange should have
@ -1956,6 +1959,7 @@ in6_tmpifadd(
goto again;
}
}
pserialize_read_exit(s);
/*
* The Valid Lifetime is the lower of the Valid Lifetime of the

View File

@ -1,4 +1,4 @@
/* $NetBSD: key.c,v 1.100 2016/07/07 06:59:30 ozaki-r Exp $ */
/* $NetBSD: key.c,v 1.101 2016/07/20 07:37:51 ozaki-r Exp $ */
/* $FreeBSD: src/sys/netipsec/key.c,v 1.3.2.3 2004/02/14 22:23:23 bms Exp $ */
/* $KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $ */
@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.100 2016/07/07 06:59:30 ozaki-r Exp $");
__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.101 2016/07/20 07:37:51 ozaki-r Exp $");
/*
* This code is referd to RFC 2367
@ -4117,6 +4117,7 @@ key_ismyaddr(const struct sockaddr *sa)
#ifdef INET
const struct sockaddr_in *sin;
const struct in_ifaddr *ia;
int s;
#endif
/* sanity check */
@ -4127,14 +4128,17 @@ key_ismyaddr(const struct sockaddr *sa)
#ifdef INET
case AF_INET:
sin = (const struct sockaddr_in *)sa;
s = pserialize_read_enter();
IN_ADDRLIST_READER_FOREACH(ia) {
if (sin->sin_family == ia->ia_addr.sin_family &&
sin->sin_len == ia->ia_addr.sin_len &&
sin->sin_addr.s_addr == ia->ia_addr.sin_addr.s_addr)
{
pserialize_read_exit(s);
return 1;
}
}
pserialize_read_exit(s);
break;
#endif
#ifdef INET6
@ -4160,11 +4164,15 @@ key_ismyaddr6(const struct sockaddr_in6 *sin6)
{
struct in6_ifaddr *ia;
const struct in6_multi *in6m;
int s;
s = pserialize_read_enter();
IN6_ADDRLIST_READER_FOREACH(ia) {
if (key_sockaddrcmp((const struct sockaddr *)&sin6,
(const struct sockaddr *)&ia->ia_addr, 0) == 0)
(const struct sockaddr *)&ia->ia_addr, 0) == 0) {
pserialize_read_exit(s);
return 1;
}
/*
* XXX Multicast
@ -4182,9 +4190,12 @@ key_ismyaddr6(const struct sockaddr_in6 *sin6)
(in6m) = in6m->in6m_entry.le_next)
continue;
#endif
if (in6m)
if (in6m) {
pserialize_read_exit(s);
return 1;
}
}
pserialize_read_exit(s);
/* loopback, just for safety */
if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr))