git: tcp: Implement asynchronized pru_rcvd

Sepherosa Ziehau sephe at crater.dragonflybsd.org
Tue Sep 4 04:30:38 PDT 2012


commit 96c6eb294d6698d9a56882102cb936d326b2a3c7
Author: Sepherosa Ziehau <sephe at dragonflybsd.org>
Date:   Mon Sep 3 17:46:58 2012 +0800

    tcp: Implement asynchronized pru_rcvd
    
    This mainly avoids extra scheduling cost on the reception path due to
    lwkt_domsg().  lwkt_sendmsg() is now used to carry out TCP pru_rcvd.
    
    Since TCP's pru_rcvd could be batched, one pru_rcvd netmsg is embedded
    into struct socket to avoid pru_rcvd netmsg allocation for each pru_rcvd,
    and this netmsg will be used by lwkt_sendmsg().  Whether this embedded
    pcu_rcvd netmsg should be sent or not is determined by its MSG_DONE bit.
    Since user thread and netisr thread could be on different CPUs, the
    embedded pru_rcvd netmsg's MSG_DONE bit is protected by a spinlock.
    
    To cope with the following race that could drop window updates,
    tcp_usr_rcvd() replies asynchronized rcvd netmsg before tcp_output():
    
          netisr thread                     user thread
    
    tcp_usr_rcvd()                   sorcvtcp()
    {                                {
        tcp_output()                          :
              :                               :
              :                          sbunlinkmbuf()
              :                          if (rcvd & MSG_DONE) (2)
              :                              lwkt_sendmsg(rvcd)
              :                               :
        lwkt_replymsg(rcvd) (1)
    }
    
    At (2) window update is dropped, since rcvd netmsg is not replied yet at (1)
    
    The result:
    On i7-2600 (4C/8T, 3.4GHz):
    32 parallel netperf -H 127.0.0.1 -t TCP_STREAM -P0 -l 30 (4 runs, unit: Mbps)
    
    old   30253.88 30242.58 30162.55 30101.51
    new   33962.74 33798.70 33499.92 33482.35
    
    This gives ~12% performance improvement.

Summary of changes:
 sys/kern/uipc_msg.c      |   35 +++++++++++++++++++++++++++++++++++
 sys/kern/uipc_socket.c   |   15 ++++++++++-----
 sys/kern/uipc_socket2.c  |    3 +--
 sys/net/netmsg.h         |    3 +++
 sys/netinet/in_proto.c   |    3 ++-
 sys/netinet/tcp_subr.c   |    3 +++
 sys/netinet/tcp_usrreq.c |   11 +++++++++--
 sys/netinet6/in6_proto.c |    2 +-
 sys/sys/protosw.h        |    1 +
 sys/sys/socketops.h      |    3 +++
 sys/sys/socketvar.h      |    9 ++++++++-
 11 files changed, 76 insertions(+), 12 deletions(-)

http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/96c6eb294d6698d9a56882102cb936d326b2a3c7


-- 
DragonFly BSD source repository





More information about the Commits mailing list