diff options
author | melifaro <melifaro@FreeBSD.org> | 2015-01-16 10:49:27 +0000 |
---|---|---|
committer | melifaro <melifaro@FreeBSD.org> | 2015-01-16 10:49:27 +0000 |
commit | 9a4e5966c8cfe4251ab0c112f175b5669ef5a67a (patch) | |
tree | e341941ff897bdea36e91e23c5aa7fed6cc76f60 | |
parent | 1a0bd2e577afc4194acb8b070ec864dc313ca367 (diff) | |
download | FreeBSD-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.c | 6 |
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); } /* |