network - MP socket free & abort interactions, so_state
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 10 Sep 2010 04:01:20 +0000 (21:01 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 10 Sep 2010 09:23:42 +0000 (02:23 -0700)
commit6cef7136f04e2b24a6db289e78720d6d8c60274e
tree77a11707457b1917861cbe6b699e033b0be26cc9
parentc3c96e4421a1087a390825eac6c01c9ed9182387
network - MP socket free & abort interactions, so_state

* Add so_refs and ref-count the socket structure to deal with
  MP races on sofree().

* Ref the socket structure for all soabort() operations (they are usually
  asynchronous).  The netmsg_pru_abort() handler will sofree() the ref
  after calling the protocol stack's abort function.

* Use atomic ops to set and clear bits in so_state, because it is modified
  by both the fronttend and the backend.

* Remove numerous critical sections that are no longer effective.

* Protect the accept queues with so_rcv.ssb_token.

* Protect after-the-fact calls to soisdisconnected() with a soreference()
  to avoid use-after-free cases.

* Wrap unix domain, mroute, div, raw, and key sockets/protocols with their
  own private tokens.
61 files changed:
sys/ddb/db_output.c
sys/kern/sys_generic.c
sys/kern/sys_socket.c
sys/kern/uipc_mbuf.c
sys/kern/uipc_msg.c
sys/kern/uipc_socket.c
sys/kern/uipc_socket2.c
sys/kern/uipc_syscalls.c
sys/kern/uipc_usrreq.c
sys/net/ip_mroute/ip_mroute.c
sys/net/raw_cb.c
sys/net/raw_usrreq.c
sys/net/rtsock.c
sys/netbt/hci_socket.c
sys/netbt/l2cap_socket.c
sys/netbt/rfcomm_socket.c
sys/netbt/sco_socket.c
sys/netgraph/ksocket/ng_ksocket.c
sys/netgraph/socket/ng_socket.c
sys/netgraph7/bluetooth/socket/ng_btsocket_rfcomm.c
sys/netgraph7/ng_ksocket.c
sys/netgraph7/ng_socket.c
sys/netinet/in_pcb.c
sys/netinet/ip_divert.c
sys/netinet/raw_ip.c
sys/netinet/sctp_indata.c
sys/netinet/sctp_input.c
sys/netinet/sctp_pcb.c
sys/netinet/sctp_peeloff.c
sys/netinet/sctp_usrreq.c
sys/netinet/sctputil.c
sys/netinet/tcp_input.c
sys/netinet/tcp_subr.c
sys/netinet/tcp_usrreq.c
sys/netinet/udp_usrreq.c
sys/netinet6/in6_pcb.c
sys/netinet6/ipsec.c
sys/netinet6/raw_ip6.c
sys/netinet6/sctp6_usrreq.c
sys/netinet6/udp6_usrreq.c
sys/netproto/atalk/ddp_usrreq.c
sys/netproto/atm/atm_aal5.c
sys/netproto/atm/atm_socket.c
sys/netproto/ipsec/keysock.c
sys/netproto/ipx/ipx_pcb.c
sys/netproto/ipx/ipx_usrreq.c
sys/netproto/ipx/spx_usrreq.c
sys/netproto/key/key.c
sys/netproto/key/key.h
sys/netproto/key/keydb.c
sys/netproto/key/keysock.c
sys/netproto/natm/natm.c
sys/netproto/ncp/ncp_sock.c
sys/netproto/ns/idp_usrreq.c
sys/netproto/ns/ns_pcb.c
sys/netproto/ns/spp_usrreq.c
sys/netproto/smb/smb_trantcp.c
sys/sys/socketvar.h
sys/sys/socketvar2.h
sys/vfs/fifofs/fifo_vnops.c
sys/vfs/nfs/nfs_socket.c