diff options
author | Robert Watson <rwatson@FreeBSD.org> | 2006-07-23 12:24:22 +0000 |
---|---|---|
committer | Robert Watson <rwatson@FreeBSD.org> | 2006-07-23 12:24:22 +0000 |
commit | c9db0fad090fac6358555660a4c0bcffaecd3495 (patch) | |
tree | e735fdfb823999f7cd8fe4918a9080d79d63b3dc /sys/netinet6/icmp6.c | |
parent | 4f1f0ef52332b4ce86d34972ba18e46160daa138 (diff) | |
download | src-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.c | 14 |
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); |