cvs commit: src/sys/netinet in_pcb.h udp_usrreq.c
rwatson at FreeBSD.org
Tue Jul 15 15:38:59 UTC 2008
rwatson 2008-07-15 15:38:47 UTC
FreeBSD src repository
sys/netinet in_pcb.h udp_usrreq.c
SVN rev 180536 on 2008-07-15 15:38:47Z by rwatson
Merge last of a series of rwlock conversion changes to UDP, which
completes the move to a fully parallel UDP transmit path by using
global read, rather than write, locking of inpcbinfo in further
- Add macros to allow try-locking of inpcb and inpcbinfo.
- Always acquire an incpcb read lock in udp_output(), which stablizes the
local inpcb address and port bindings in order to determine what further
locking is required:
- If the inpcb is currently not bound (at all) and are implicitly
connecting, we require inpcbinfo and inpcb write locks, so drop the
read lock and re-acquire.
- If the inpcb is bound for at least one of the port or address, but an
explicit source or destination is requested, trylock the inpcbinfo
lock, and if that fails, drop the inpcb lock, lock the global lock,
and relock the inpcb lock.
- Otherwise, no further locking is required (common case).
- Update comments.
In practice, this means that the vast majority of consumers of UDP sockets
will not acquire any exclusive locks at the socket or UDP levels of the
network stack. This leads to a marked performance improvement in several
important workloads, including BIND, nsd, and memcached over UDP, as well
as significant improvements in pps microbenchmarks.
The plan is to MFC all of the rwlock changes to RELENG_7 once they have
settled for a weeks in the tree.
Tested by: ps, kris (older revision), bde
MFC after: 3 weeks
Revision Changes Path
1.110 +4 -0 src/sys/netinet/in_pcb.h
1.231 +85 -34 src/sys/netinet/udp_usrreq.c
More information about the cvs-src