aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet6/icmp6.c
diff options
context:
space:
mode:
authorRobert Watson <rwatson@FreeBSD.org>2006-07-23 12:24:22 +0000
committerRobert Watson <rwatson@FreeBSD.org>2006-07-23 12:24:22 +0000
commitc9db0fad090fac6358555660a4c0bcffaecd3495 (patch)
treee735fdfb823999f7cd8fe4918a9080d79d63b3dc /sys/netinet6/icmp6.c
parent4f1f0ef52332b4ce86d34972ba18e46160daa138 (diff)
downloadsrc-c9db0fad090fac6358555660a4c0bcffaecd3495.tar.gz
src-c9db0fad090fac6358555660a4c0bcffaecd3495.zip
Align IPv6 socket locking with IPv4 locking: lock socket buffer explicitly
and use _locked variants to avoid extra lock and unlock operations. Reviewed by: gnn MFC after: 1 week
Notes
Notes: svn path=/head/; revision=160591
Diffstat (limited to 'sys/netinet6/icmp6.c')
-rw-r--r--sys/netinet6/icmp6.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c
index 43c2237badc3..1af482337dd5 100644
--- a/sys/netinet6/icmp6.c
+++ b/sys/netinet6/icmp6.c
@@ -1954,7 +1954,9 @@ icmp6_rip6_input(mp, off)
ip6_savecontrol(last, n, &opts);
/* strip intermediate headers */
m_adj(n, off);
- if (sbappendaddr(&last->in6p_socket->so_rcv,
+ SOCKBUF_LOCK(&last->in6p_socket->so_rcv);
+ if (sbappendaddr_locked(
+ &last->in6p_socket->so_rcv,
(struct sockaddr *)&fromsa, n, opts)
== 0) {
/* should notify about lost packet */
@@ -1962,8 +1964,10 @@ icmp6_rip6_input(mp, off)
if (opts) {
m_freem(opts);
}
+ SOCKBUF_UNLOCK(
+ &last->in6p_socket->so_rcv);
} else
- sorwakeup(last->in6p_socket);
+ sorwakeup_locked(last->in6p_socket);
opts = NULL;
}
INP_UNLOCK(last);
@@ -1995,13 +1999,15 @@ icmp6_rip6_input(mp, off)
}
}
}
- if (sbappendaddr(&last->in6p_socket->so_rcv,
+ SOCKBUF_LOCK(&last->in6p_socket->so_rcv);
+ if (sbappendaddr_locked(&last->in6p_socket->so_rcv,
(struct sockaddr *)&fromsa, m, opts) == 0) {
m_freem(m);
if (opts)
m_freem(opts);
+ SOCKBUF_UNLOCK(&last->in6p_socket->so_rcv);
} else
- sorwakeup(last->in6p_socket);
+ sorwakeup_locked(last->in6p_socket);
INP_UNLOCK(last);
} else {
m_freem(m);