aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet6
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2021-02-14 10:11:06 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2021-03-10 21:44:31 +0000
commit3cff9b2ccfd0b0a2d2309f80bfb98dbd3b025c01 (patch)
tree839b7f6214a43570bd1d15931f62a2386b5e6c37 /sys/netinet6
parentf21c0366f532888bec164717a93964610ab6baf6 (diff)
downloadsrc-3cff9b2ccfd0b0a2d2309f80bfb98dbd3b025c01.tar.gz
src-3cff9b2ccfd0b0a2d2309f80bfb98dbd3b025c01.zip
Do not reference returned ifa in in6_ifawithifp().
The only place where in6_ifawithifp() is used is ip6_output(), which uses the returned ifa to bump traffic counters. Given ifa stability guarantees is provided by epoch, do not refcount ifa. This eliminates 2 atomic ops from IPv6 fast path. Reviewed By: rstone Differential Revision: https://reviews.freebsd.org/D28649 (cherry picked from commit 1bd44b11e59f1e9ee7245f8de1f823bc5287b9ef)
Diffstat (limited to 'sys/netinet6')
-rw-r--r--sys/netinet6/in6.c14
-rw-r--r--sys/netinet6/ip6_output.c1
2 files changed, 3 insertions, 12 deletions
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index 48fa8dd2efc6..057c0ee91e02 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -1921,10 +1921,8 @@ in6_ifawithifp(struct ifnet *ifp, struct in6_addr *dst)
besta = (struct in6_ifaddr *)ifa;
}
}
- if (besta) {
- ifa_ref(&besta->ia_ifa);
+ if (besta)
return (besta);
- }
CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
if (ifa->ifa_addr->sa_family != AF_INET6)
@@ -1941,20 +1939,14 @@ in6_ifawithifp(struct ifnet *ifp, struct in6_addr *dst)
continue;
}
- if (ifa != NULL)
- ifa_ref(ifa);
return (struct in6_ifaddr *)ifa;
}
/* use the last-resort values, that are, deprecated addresses */
- if (dep[0]) {
- ifa_ref((struct ifaddr *)dep[0]);
+ if (dep[0])
return dep[0];
- }
- if (dep[1]) {
- ifa_ref((struct ifaddr *)dep[1]);
+ if (dep[1])
return dep[1];
- }
return NULL;
}
diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c
index df1e9e6f2dcd..58334788b05b 100644
--- a/sys/netinet6/ip6_output.c
+++ b/sys/netinet6/ip6_output.c
@@ -1177,7 +1177,6 @@ passout:
counter_u64_add(ia6->ia_ifa.ifa_opackets, 1);
counter_u64_add(ia6->ia_ifa.ifa_obytes,
m->m_pkthdr.len);
- ifa_free(&ia6->ia_ifa);
}
error = ip6_output_send(inp, ifp, origifp, m, dst, ro,
(flags & IP_NO_SND_TAG_RL) ? false : true);