svn commit: r235985 - head/sys/netinet
Bjoern A. Zeeb
bz at FreeBSD.org
Fri May 25 09:24:45 UTC 2012
Author: bz
Date: Fri May 25 09:24:45 2012
New Revision: 235985
URL: http://svn.freebsd.org/changeset/base/235985
Log:
MFp4 bz_ipv6_fast:
Properly protect the inp read access when handling the control code.
In the past this was expensive but given the rlock it's not so much
anymore.
Spotted while: optimizing udp6
Discussed with: rwatson (a few months ago)
Sponsored by: The FreeBSD Foundation
Sponsored by: iXsystems
Reviewed by: gnn (as part of the whole)
MFC After: 3 days
Modified:
head/sys/netinet/udp_usrreq.c
Modified: head/sys/netinet/udp_usrreq.c
==============================================================================
--- head/sys/netinet/udp_usrreq.c Fri May 25 09:16:59 2012 (r235984)
+++ head/sys/netinet/udp_usrreq.c Fri May 25 09:24:45 2012 (r235985)
@@ -971,12 +971,14 @@ udp_output(struct inpcb *inp, struct mbu
}
src.sin_family = 0;
+ INP_RLOCK(inp);
if (control != NULL) {
/*
* XXX: Currently, we assume all the optional information is
* stored in a single mbuf.
*/
if (control->m_next) {
+ INP_RUNLOCK(inp);
m_freem(control);
m_freem(m);
return (EINVAL);
@@ -1018,6 +1020,7 @@ udp_output(struct inpcb *inp, struct mbu
m_freem(control);
}
if (error) {
+ INP_RUNLOCK(inp);
m_freem(m);
return (error);
}
@@ -1039,7 +1042,6 @@ udp_output(struct inpcb *inp, struct mbu
* XXXRW: Check that hash locking update here is correct.
*/
sin = (struct sockaddr_in *)addr;
- INP_RLOCK(inp);
if (sin != NULL &&
(inp->inp_laddr.s_addr == INADDR_ANY && inp->inp_lport == 0)) {
INP_RUNLOCK(inp);
More information about the svn-src-all
mailing list