summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormelifaro <melifaro@FreeBSD.org>2015-01-16 10:49:27 +0000
committermelifaro <melifaro@FreeBSD.org>2015-01-16 10:49:27 +0000
commit9a4e5966c8cfe4251ab0c112f175b5669ef5a67a (patch)
treee341941ff897bdea36e91e23c5aa7fed6cc76f60
parent1a0bd2e577afc4194acb8b070ec864dc313ca367 (diff)
downloadFreeBSD-src-9a4e5966c8cfe4251ab0c112f175b5669ef5a67a.zip
FreeBSD-src-9a4e5966c8cfe4251ab0c112f175b5669ef5a67a.tar.gz
Use ipfw runtime lock only when real modification is required.
-rw-r--r--sys/netpfil/ipfw/ip_fw_nat.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/netpfil/ipfw/ip_fw_nat.c b/sys/netpfil/ipfw/ip_fw_nat.c
index 0b377c5..8b97f65 100644
--- a/sys/netpfil/ipfw/ip_fw_nat.c
+++ b/sys/netpfil/ipfw/ip_fw_nat.c
@@ -105,7 +105,7 @@ ifaddr_change(void *arg __unused, struct ifnet *ifp)
KASSERT(curvnet == ifp->if_vnet,
("curvnet(%p) differs from iface vnet(%p)", curvnet, ifp->if_vnet));
chain = &V_layer3_chain;
- IPFW_WLOCK(chain);
+ IPFW_UH_WLOCK(chain);
/* Check every nat entry... */
LIST_FOREACH(ptr, &chain->nat, _next) {
/* ...using nic 'ifp->if_xname' as dynamic alias address. */
@@ -117,13 +117,15 @@ ifaddr_change(void *arg __unused, struct ifnet *ifp)
continue;
if (ifa->ifa_addr->sa_family != AF_INET)
continue;
+ IPFW_WLOCK(chain);
ptr->ip = ((struct sockaddr_in *)
(ifa->ifa_addr))->sin_addr;
LibAliasSetAddress(ptr->lib, ptr->ip);
+ IPFW_WUNLOCK(chain);
}
if_addr_runlock(ifp);
}
- IPFW_WUNLOCK(chain);
+ IPFW_UH_WUNLOCK(chain);
}
/*
OpenPOWER on IntegriCloud