cvs commit: src/sys/netinet ip_output.c ip_var.h tcp_usrreq.c

Robert Watson rwatson at FreeBSD.org
Tue Nov 28 15:19:19 PST 2006


rwatson     2006-11-28 23:19:18 UTC

  FreeBSD src repository

  Modified files:        (Branch: RELENG_6_2)
    sys/netinet          ip_output.c ip_var.h tcp_usrreq.c 
  Log:
  Merge ip_output.c:1.242.2.17, ip_var.h:1.95.2.1, tcp_usrreq.c:1.124.2.4
  from RELENG_6 to RELENG_6_2:
  
    Reformulate ip_ctloutput() and tcp_ctloutput() to work around the fact
    that so_pcb can be invalidated at any time due to an untimely reset.
    Move the body of ip_ctloutput() to ip_ctloutput_pcbinfo(), which
    accepts a pcbinfo argument, and wrap it with ip_ctloutput(), which
    passes a NULL.  Modify tcp_ctloutput() to directly invoke
    ip_ctloutput_pcbinfo() and pass tcbinfo.  Hold the pcbinfo lock when
    dereferencing so_pcb and acquiring the inpcb lock in order to prevent
    the inpcb from being freed; the pcbinfo lock is then immediately
    dropped.  This is required as TCP may free the inppcb and invalidate
    so_pcb due to a reset at any time in the RELENG_6 network stack, which
    otherwise leads to a panic.
  
    This panic might be frequently seen on highly loaded IRC and Samba
    servers, which have long-lasting TCP connections, query socket options
    frequently, and see a significant number of reset connections.
  
    This change has been merged directly to RELENG_6 as the problem does
    not exist in HEAD, where the invariants for so_pcb are much stronger;
    the architectural changes in HEAD avoid the need to acquire a global
    lock in the socket option path.  This change will be merged to
    RELENG_6_2.
  
    PR:             102412, 104765
    Reviewed by:    Diane Bruce <db at db.net>
    Tested by:      Daniel Austin <daniel at kewlio dot net>,
                    Kai Gallasch <gallasch at free dot de>
  
  Approved by:    re (kensmith)
  
  Revision        Changes    Path
  1.242.2.16.2.1  +34 -1     src/sys/netinet/ip_output.c
  1.95.8.1        +3 -0      src/sys/netinet/ip_var.h
  1.124.2.3.2.1   +1 -1      src/sys/netinet/tcp_usrreq.c


More information about the cvs-src mailing list