Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F148836325
D22197.id64060.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D22197.id64060.diff
View Options
Index: head/sys/netinet/in_pcb.c
===================================================================
--- head/sys/netinet/in_pcb.c
+++ head/sys/netinet/in_pcb.c
@@ -2252,12 +2252,10 @@
struct inpcb *inp, *tmpinp;
u_short fport = fport_arg, lport = lport_arg;
-#ifdef INVARIANTS
KASSERT((lookupflags & ~(INPLOOKUP_WILDCARD)) == 0,
("%s: invalid lookup flags %d", __func__, lookupflags));
- if (!mtx_owned(&pcbinfo->ipi_hash_lock))
- MPASS(in_epoch_verbose(net_epoch_preempt, 1));
-#endif
+ INP_HASH_LOCK_ASSERT(pcbinfo);
+
/*
* First look for an exact match.
*/
@@ -2384,7 +2382,6 @@
{
struct inpcb *inp;
- INP_HASH_RLOCK(pcbinfo);
inp = in_pcblookup_hash_locked(pcbinfo, faddr, fport, laddr, lport,
(lookupflags & ~(INPLOOKUP_RLOCKPCB | INPLOOKUP_WLOCKPCB)), ifp);
if (inp != NULL) {
@@ -2411,7 +2408,7 @@
}
#endif
}
- INP_HASH_RUNLOCK(pcbinfo);
+
return (inp);
}
Index: head/sys/netinet/tcp_subr.c
===================================================================
--- head/sys/netinet/tcp_subr.c
+++ head/sys/netinet/tcp_subr.c
@@ -2257,6 +2257,7 @@
{
struct xucred xuc;
struct sockaddr_in addrs[2];
+ struct epoch_tracker et;
struct inpcb *inp;
int error;
@@ -2266,8 +2267,10 @@
error = SYSCTL_IN(req, addrs, sizeof(addrs));
if (error)
return (error);
+ NET_EPOCH_ENTER(et);
inp = in_pcblookup(&V_tcbinfo, addrs[1].sin_addr, addrs[1].sin_port,
addrs[0].sin_addr, addrs[0].sin_port, INPLOOKUP_RLOCKPCB, NULL);
+ NET_EPOCH_EXIT(et);
if (inp != NULL) {
if (inp->inp_socket == NULL)
error = ENOENT;
@@ -2292,6 +2295,7 @@
static int
tcp6_getcred(SYSCTL_HANDLER_ARGS)
{
+ struct epoch_tracker et;
struct xucred xuc;
struct sockaddr_in6 addrs[2];
struct inpcb *inp;
@@ -2319,6 +2323,7 @@
return (EINVAL);
}
+ NET_EPOCH_ENTER(et);
#ifdef INET
if (mapped == 1)
inp = in_pcblookup(&V_tcbinfo,
@@ -2332,6 +2337,7 @@
&addrs[1].sin6_addr, addrs[1].sin6_port,
&addrs[0].sin6_addr, addrs[0].sin6_port,
INPLOOKUP_RLOCKPCB, NULL);
+ NET_EPOCH_EXIT(et);
if (inp != NULL) {
if (inp->inp_socket == NULL)
error = ENOENT;
@@ -2365,7 +2371,6 @@
struct inpcb *(*notify)(struct inpcb *, int) = tcp_notify;
struct icmp *icp;
struct in_conninfo inc;
- struct epoch_tracker et;
tcp_seq icmp_tcp_seq;
int mtu;
@@ -2397,7 +2402,6 @@
icp = (struct icmp *)((caddr_t)ip - offsetof(struct icmp, icmp_ip));
th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2));
- INP_INFO_RLOCK_ET(&V_tcbinfo, et);
inp = in_pcblookup(&V_tcbinfo, faddr, th->th_dport, ip->ip_src,
th->th_sport, INPLOOKUP_WLOCKPCB, NULL);
if (inp != NULL && PRC_IS_REDIRECT(cmd)) {
@@ -2462,7 +2466,6 @@
out:
if (inp != NULL)
INP_WUNLOCK(inp);
- INP_INFO_RUNLOCK_ET(&V_tcbinfo, et);
}
#endif /* INET */
@@ -2480,7 +2483,6 @@
struct ip6ctlparam *ip6cp = NULL;
const struct sockaddr_in6 *sa6_src = NULL;
struct in_conninfo inc;
- struct epoch_tracker et;
struct tcp_ports {
uint16_t th_sport;
uint16_t th_dport;
@@ -2542,7 +2544,6 @@
}
bzero(&t_ports, sizeof(struct tcp_ports));
m_copydata(m, off, sizeof(struct tcp_ports), (caddr_t)&t_ports);
- INP_INFO_RLOCK_ET(&V_tcbinfo, et);
inp = in6_pcblookup(&V_tcbinfo, &ip6->ip6_dst, t_ports.th_dport,
&ip6->ip6_src, t_ports.th_sport, INPLOOKUP_WLOCKPCB, NULL);
if (inp != NULL && PRC_IS_REDIRECT(cmd)) {
@@ -2614,7 +2615,6 @@
out:
if (inp != NULL)
INP_WUNLOCK(inp);
- INP_INFO_RUNLOCK_ET(&V_tcbinfo, et);
}
#endif /* INET6 */
Index: head/sys/netinet/udp_usrreq.c
===================================================================
--- head/sys/netinet/udp_usrreq.c
+++ head/sys/netinet/udp_usrreq.c
@@ -963,6 +963,7 @@
{
struct xucred xuc;
struct sockaddr_in addrs[2];
+ struct epoch_tracker et;
struct inpcb *inp;
int error;
@@ -972,9 +973,11 @@
error = SYSCTL_IN(req, addrs, sizeof(addrs));
if (error)
return (error);
+ NET_EPOCH_ENTER(et);
inp = in_pcblookup(&V_udbinfo, addrs[1].sin_addr, addrs[1].sin_port,
addrs[0].sin_addr, addrs[0].sin_port,
INPLOOKUP_WILDCARD | INPLOOKUP_RLOCKPCB, NULL);
+ NET_EPOCH_EXIT(et);
if (inp != NULL) {
INP_RLOCK_ASSERT(inp);
if (inp->inp_socket == NULL)
Index: head/sys/netinet6/in6_pcb.c
===================================================================
--- head/sys/netinet6/in6_pcb.c
+++ head/sys/netinet6/in6_pcb.c
@@ -1245,7 +1245,6 @@
{
struct inpcb *inp;
- INP_HASH_RLOCK(pcbinfo);
inp = in6_pcblookup_hash_locked(pcbinfo, faddr, fport, laddr, lport,
(lookupflags & ~(INPLOOKUP_RLOCKPCB | INPLOOKUP_WLOCKPCB)), ifp);
if (inp != NULL) {
@@ -1272,7 +1271,6 @@
}
#endif
}
- INP_HASH_RUNLOCK(pcbinfo);
return (inp);
}
Index: head/sys/netinet6/udp6_usrreq.c
===================================================================
--- head/sys/netinet6/udp6_usrreq.c
+++ head/sys/netinet6/udp6_usrreq.c
@@ -634,6 +634,7 @@
{
struct xucred xuc;
struct sockaddr_in6 addrs[2];
+ struct epoch_tracker et;
struct inpcb *inp;
int error;
@@ -652,9 +653,11 @@
(error = sa6_embedscope(&addrs[1], V_ip6_use_defzone)) != 0) {
return (error);
}
+ NET_EPOCH_ENTER(et);
inp = in6_pcblookup(&V_udbinfo, &addrs[1].sin6_addr,
addrs[1].sin6_port, &addrs[0].sin6_addr, addrs[0].sin6_port,
INPLOOKUP_WILDCARD | INPLOOKUP_RLOCKPCB, NULL);
+ NET_EPOCH_EXIT(et);
if (inp != NULL) {
INP_RLOCK_ASSERT(inp);
if (inp->inp_socket == NULL)
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 21, 11:20 AM (5 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30045394
Default Alt Text
D22197.id64060.diff (5 KB)
Attached To
Mode
D22197: Refactor PCB hash read lock (the epoch)
Attached
Detach File
Event Timeline
Log In to Comment