diff options
author | rwatson <rwatson@FreeBSD.org> | 2006-07-23 12:24:22 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2006-07-23 12:24:22 +0000 |
commit | fe855a5667abc09ede59fae965de56b1c90ed0af (patch) | |
tree | e735fdfb823999f7cd8fe4918a9080d79d63b3dc /sys/netinet6 | |
parent | c6cb3a55828b25caf156e4335b7848b73a3d119b (diff) | |
download | FreeBSD-src-fe855a5667abc09ede59fae965de56b1c90ed0af.zip FreeBSD-src-fe855a5667abc09ede59fae965de56b1c90ed0af.tar.gz |
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
Diffstat (limited to 'sys/netinet6')
-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 43c2237..1af4823 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); |