From owner-p4-projects@FreeBSD.ORG Sat Jun 12 21:15:06 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4614D16A4D1; Sat, 12 Jun 2004 21:15:06 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 2032216A4CE for ; Sat, 12 Jun 2004 21:15:06 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 184AD43D4C for ; Sat, 12 Jun 2004 21:15:06 +0000 (GMT) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.11/8.12.11) with ESMTP id i5CLDfiJ006440 for ; Sat, 12 Jun 2004 21:13:41 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.11/8.12.11/Submit) id i5CLDeME006437 for perforce@freebsd.org; Sat, 12 Jun 2004 21:13:40 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sat, 12 Jun 2004 21:13:40 GMT Message-Id: <200406122113.i5CLDeME006437@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson To: Perforce Change Reviews Subject: PERFORCE change 54746 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 12 Jun 2004 21:15:06 -0000 http://perforce.freebsd.org/chv.cgi?CH=54746 Change 54746 by rwatson@rwatson_tislabs on 2004/06/12 21:13:35 Integrate netperf_socket from FreeBSD CVS HEAD following merge of socket reference count locking from rwatson_netperf. Affected files ... .. //depot/projects/netperf_socket/sys/kern/kern_descrip.c#8 integrate .. //depot/projects/netperf_socket/sys/kern/uipc_socket.c#16 integrate .. //depot/projects/netperf_socket/sys/kern/uipc_syscalls.c#16 integrate .. //depot/projects/netperf_socket/sys/kern/uipc_usrreq.c#11 integrate .. //depot/projects/netperf_socket/sys/net/raw_cb.c#5 integrate .. //depot/projects/netperf_socket/sys/net/raw_usrreq.c#5 integrate .. //depot/projects/netperf_socket/sys/netatalk/ddp_pcb.c#6 integrate .. //depot/projects/netperf_socket/sys/netatm/atm_socket.c#3 integrate .. //depot/projects/netperf_socket/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c#6 integrate .. //depot/projects/netperf_socket/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c#5 integrate .. //depot/projects/netperf_socket/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c#5 integrate .. //depot/projects/netperf_socket/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c#6 integrate .. //depot/projects/netperf_socket/sys/netgraph/ng_ksocket.c#6 integrate .. //depot/projects/netperf_socket/sys/netinet/in_pcb.c#10 integrate .. //depot/projects/netperf_socket/sys/netinet/tcp_subr.c#8 integrate .. //depot/projects/netperf_socket/sys/netinet6/in6_pcb.c#6 integrate .. //depot/projects/netperf_socket/sys/netipx/ipx_pcb.c#4 integrate .. //depot/projects/netperf_socket/sys/netipx/ipx_usrreq.c#3 integrate .. //depot/projects/netperf_socket/sys/netnatm/natm.c#4 integrate .. //depot/projects/netperf_socket/sys/sys/socketvar.h#11 integrate Differences ... ==== //depot/projects/netperf_socket/sys/kern/kern_descrip.c#8 (text+ko) ==== @@ -35,7 +35,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/kern_descrip.c,v 1.232 2004/06/11 11:16:23 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/kern_descrip.c,v 1.233 2004/06/12 20:47:28 rwatson Exp $"); #include "opt_compat.h" @@ -2024,7 +2024,9 @@ *spp = fp->f_data; if (fflagp) *fflagp = fp->f_flag; + SOCK_LOCK(*spp); soref(*spp); + SOCK_UNLOCK(*spp); } FILEDESC_UNLOCK(td->td_proc->p_fd); return (error); ==== //depot/projects/netperf_socket/sys/kern/uipc_socket.c#16 (text+ko) ==== @@ -30,7 +30,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.176 2004/06/12 16:08:41 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.177 2004/06/12 20:47:28 rwatson Exp $"); #include "opt_inet.h" #include "opt_mac.h" @@ -201,7 +201,9 @@ #ifdef MAC mac_create_socket(cred, so); #endif + SOCK_LOCK(so); soref(so); + SOCK_UNLOCK(so); error = (*prp->pr_usrreqs->pru_attach)(so, proto, td); if (error) { SOCK_LOCK(so); @@ -297,6 +299,7 @@ if (so->so_pcb != NULL || (so->so_state & SS_NOFDREF) == 0) { SOCK_UNLOCK(so); return; + } SOCK_UNLOCK(so); ACCEPT_LOCK(); @@ -418,6 +421,7 @@ error = error2; } discard: + SOCK_LOCK(so); if (so->so_state & SS_NOFDREF) panic("soclose: NOFDREF"); so->so_state |= SS_NOFDREF; ==== //depot/projects/netperf_socket/sys/kern/uipc_syscalls.c#16 (text+ko) ==== @@ -33,7 +33,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.189 2004/06/11 11:16:24 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.190 2004/06/12 20:47:28 rwatson Exp $"); #include "opt_compat.h" #include "opt_ktrace.h" @@ -311,7 +311,14 @@ KASSERT(!(so->so_qstate & SQ_INCOMP), ("accept1: so SQ_INCOMP")); KASSERT(so->so_qstate & SQ_COMP, ("accept1: so not SQ_COMP")); + /* + * Before changing the flags on the socket, we have to bump the + * reference count. Otherwise, if the protocol calls sofree(), + * the socket will be released due to a zero refcount. + */ + SOCK_LOCK(so); soref(so); /* file descriptor reference */ + SOCK_UNLOCK(so); TAILQ_REMOVE(&head->so_comp, so, so_list); head->so_qlen--; ==== //depot/projects/netperf_socket/sys/kern/uipc_usrreq.c#11 (text+ko) ==== @@ -30,7 +30,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/uipc_usrreq.c,v 1.122 2004/06/10 21:34:38 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/uipc_usrreq.c,v 1.123 2004/06/12 20:47:28 rwatson Exp $"); #include "opt_mac.h" ==== //depot/projects/netperf_socket/sys/net/raw_cb.c#5 (text+ko) ==== @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * @(#)raw_cb.c 8.1 (Berkeley) 6/10/93 - * $FreeBSD: src/sys/net/raw_cb.c,v 1.27 2004/06/11 03:52:56 rwatson Exp $ + * $FreeBSD: src/sys/net/raw_cb.c,v 1.28 2004/06/12 20:47:29 rwatson Exp $ */ #include ==== //depot/projects/netperf_socket/sys/net/raw_usrreq.c#5 (text+ko) ==== @@ -27,14 +27,13 @@ * SUCH DAMAGE. * * @(#)raw_usrreq.c 8.1 (Berkeley) 6/10/93 - * $FreeBSD: src/sys/net/raw_usrreq.c,v 1.32 2004/04/07 20:46:12 imp Exp $ + * $FreeBSD: src/sys/net/raw_usrreq.c,v 1.33 2004/06/12 20:47:29 rwatson Exp $ */ #include #include #include #include -#include #include #include #include @@ -141,12 +140,9 @@ if (rp == 0) return EINVAL; raw_disconnect(rp); + soisdisconnected(so); SOCK_LOCK(so); - if (so->so_count != 0) { - soisdisconnected(so); - SOCK_UNLOCK(so); - } else - sofree(so); + sotryfree(so); return 0; } ==== //depot/projects/netperf_socket/sys/netatalk/ddp_pcb.c#6 (text+ko) ==== @@ -2,7 +2,7 @@ * Copyright (c) 1990,1994 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. * - * $FreeBSD: src/sys/netatalk/ddp_pcb.c,v 1.42 2004/03/22 04:54:36 rwatson Exp $ + * $FreeBSD: src/sys/netatalk/ddp_pcb.c,v 1.43 2004/06/12 20:47:29 rwatson Exp $ */ #include @@ -253,6 +253,7 @@ at_pcbdetach(struct socket *so, struct ddpcb *ddp) { soisdisconnected(so); + SOCK_LOCK(so); so->so_pcb = NULL; sotryfree(so); ==== //depot/projects/netperf_socket/sys/netatm/atm_socket.c#3 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/netatm/atm_socket.c,v 1.19 2003/10/31 18:32:10 brooks Exp $"); +__FBSDID("$FreeBSD: src/sys/netatm/atm_socket.c,v 1.20 2004/06/12 20:47:29 rwatson Exp $"); #include #include ==== //depot/projects/netperf_socket/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c#6 (text+ko) ==== @@ -26,7 +26,7 @@ * SUCH DAMAGE. * * $Id: ng_btsocket_hci_raw.c,v 1.14 2003/09/14 23:29:06 max Exp $ - * $FreeBSD: src/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c,v 1.14 2004/05/29 00:51:18 julian Exp $ + * $FreeBSD: src/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c,v 1.15 2004/06/12 20:47:30 rwatson Exp $ */ #include @@ -1417,6 +1417,7 @@ bzero(pcb, sizeof(*pcb)); FREE(pcb, M_NETGRAPH_BTSOCKET_HCI_RAW); + SOCK_LOCK(so); so->so_pcb = NULL; sotryfree(so); ==== //depot/projects/netperf_socket/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c#5 (text+ko) ==== @@ -26,7 +26,7 @@ * SUCH DAMAGE. * * $Id: ng_btsocket_l2cap.c,v 1.16 2003/09/14 23:29:06 max Exp $ - * $FreeBSD: src/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c,v 1.12 2004/05/29 00:51:18 julian Exp $ + * $FreeBSD: src/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c,v 1.13 2004/06/12 20:47:30 rwatson Exp $ */ #include @@ -1804,6 +1804,7 @@ FREE(pcb, M_NETGRAPH_BTSOCKET_L2CAP); soisdisconnected(so); + SOCK_LOCK(so); so->so_pcb = NULL; sotryfree(so); @@ -2346,6 +2347,7 @@ FREE(pcb, M_NETGRAPH_BTSOCKET_L2CAP); soisdisconnected(so); + SOCK_LOCK(so); so->so_pcb = NULL; sotryfree(so); ==== //depot/projects/netperf_socket/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c#5 (text+ko) ==== @@ -26,7 +26,7 @@ * SUCH DAMAGE. * * $Id: ng_btsocket_l2cap_raw.c,v 1.12 2003/09/14 23:29:06 max Exp $ - * $FreeBSD: src/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c,v 1.11 2004/05/29 00:51:18 julian Exp $ + * $FreeBSD: src/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c,v 1.12 2004/06/12 20:47:30 rwatson Exp $ */ #include @@ -1129,6 +1129,7 @@ bzero(pcb, sizeof(*pcb)); FREE(pcb, M_NETGRAPH_BTSOCKET_L2CAP_RAW); + SOCK_LOCK(so); so->so_pcb = NULL; sotryfree(so); ==== //depot/projects/netperf_socket/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c#6 (text+ko) ==== @@ -26,7 +26,7 @@ * SUCH DAMAGE. * * $Id: ng_btsocket_rfcomm.c,v 1.28 2003/09/14 23:29:06 max Exp $ - * $FreeBSD: src/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c,v 1.8 2004/06/02 04:15:38 rwatson Exp $ + * $FreeBSD: src/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c,v 1.9 2004/06/12 20:47:30 rwatson Exp $ */ #include @@ -724,6 +724,7 @@ FREE(pcb, M_NETGRAPH_BTSOCKET_RFCOMM); soisdisconnected(so); + SOCK_LOCK(so); so->so_pcb = NULL; sotryfree(so); @@ -1370,8 +1371,10 @@ s0->l2so->so_qlen --; l2so->so_qstate &= ~SQ_COMP; l2so->so_head = NULL; + SOCK_LOCK(l2so); soref(l2so); l2so->so_state |= SS_NBIO; + SOCK_UNLOCK(l2so); ACCEPT_UNLOCK(); error = soaccept(l2so, (struct sockaddr **) &l2sa); ==== //depot/projects/netperf_socket/sys/netgraph/ng_ksocket.c#6 (text+ko) ==== @@ -36,7 +36,7 @@ * * Author: Archie Cobbs * - * $FreeBSD: src/sys/netgraph/ng_ksocket.c,v 1.42 2004/06/02 04:15:38 rwatson Exp $ + * $FreeBSD: src/sys/netgraph/ng_ksocket.c,v 1.43 2004/06/12 20:47:30 rwatson Exp $ * $Whistle: ng_ksocket.c,v 1.1 1999/11/16 20:04:40 archie Exp $ */ @@ -1205,8 +1205,10 @@ head->so_qlen--; so->so_qstate &= ~SQ_COMP; so->so_head = NULL; + SOCK_LOCK(so); soref(so); so->so_state |= SS_NBIO; + SOCK_UNLOCK(so); ACCEPT_UNLOCK(); /* XXX KNOTE(&head->so_rcv.sb_sel.si_note, 0); */ ==== //depot/projects/netperf_socket/sys/netinet/in_pcb.c#10 (text+ko) ==== @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * @(#)in_pcb.c 8.4 (Berkeley) 5/24/95 - * $FreeBSD: src/sys/netinet/in_pcb.c,v 1.147 2004/05/20 06:35:02 yar Exp $ + * $FreeBSD: src/sys/netinet/in_pcb.c,v 1.148 2004/06/12 20:47:31 rwatson Exp $ */ #include "opt_ipsec.h" ==== //depot/projects/netperf_socket/sys/netinet/tcp_subr.c#8 (text+ko) ==== @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * @(#)tcp_subr.c 8.2 (Berkeley) 5/24/95 - * $FreeBSD: src/sys/netinet/tcp_subr.c,v 1.189 2004/05/04 02:11:47 rwatson Exp $ + * $FreeBSD: src/sys/netinet/tcp_subr.c,v 1.190 2004/06/12 20:47:31 rwatson Exp $ */ #include "opt_compat.h" @@ -1666,15 +1666,10 @@ so->so_pcb = NULL; tw->tw_cred = crhold(so->so_cred); tw->tw_so_options = so->so_options; - sotryfree(so); /* NB: drops lock */ + sotryfree(so); inp->inp_socket = NULL; if (acknow) tcp_twrespond(tw, TH_ACK); -#if 0 - /* XXXRW: Sam removed this, need to check why. */ - sotryfree(so); - inp->inp_socket = NULL; -#endif inp->inp_ppcb = (caddr_t)tw; inp->inp_vflag |= INP_TIMEWAIT; tcp_timer_2msl_reset(tw, tw_time); ==== //depot/projects/netperf_socket/sys/netinet6/in6_pcb.c#6 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/netinet6/in6_pcb.c,v 1.51 2004/04/07 20:46:15 imp Exp $ */ +/* $FreeBSD: src/sys/netinet6/in6_pcb.c,v 1.52 2004/06/12 20:59:48 rwatson Exp $ */ /* $KAME: in6_pcb.c,v 1.31 2001/05/21 05:45:10 jinmei Exp $ */ /* ==== //depot/projects/netperf_socket/sys/netipx/ipx_pcb.c#4 (text+ko) ==== @@ -35,7 +35,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/netipx/ipx_pcb.c,v 1.27 2004/03/01 03:14:22 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/netipx/ipx_pcb.c,v 1.28 2004/06/12 20:47:31 rwatson Exp $"); #include #include ==== //depot/projects/netperf_socket/sys/netipx/ipx_usrreq.c#3 (text+ko) ==== @@ -35,7 +35,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/netipx/ipx_usrreq.c,v 1.39 2003/11/18 00:39:05 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/netipx/ipx_usrreq.c,v 1.40 2004/06/12 20:47:31 rwatson Exp $"); #include "opt_ipx.h" @@ -423,12 +423,9 @@ s = splnet(); ipx_pcbdetach(ipxp); splx(s); + soisdisconnected(so); SOCK_LOCK(so); - if (so->so_count != 0) { - soisdisconnected(so); - SOCK_UNLOCK(so); - } else - sofree(so); + sotryfree(so); return (0); } ==== //depot/projects/netperf_socket/sys/netnatm/natm.c#4 (text+ko) ==== @@ -36,7 +36,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/netnatm/natm.c,v 1.32 2004/03/01 03:14:22 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/netnatm/natm.c,v 1.33 2004/06/12 20:47:31 rwatson Exp $"); #include #include ==== //depot/projects/netperf_socket/sys/sys/socketvar.h#11 (text+ko) ==== @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * @(#)socketvar.h 8.3 (Berkeley) 2/19/95 - * $FreeBSD: src/sys/sys/socketvar.h,v 1.118 2004/06/12 18:37:29 rwatson Exp $ + * $FreeBSD: src/sys/sys/socketvar.h,v 1.119 2004/06/12 20:47:32 rwatson Exp $ */ #ifndef _SYS_SOCKETVAR_H_ @@ -57,7 +57,7 @@ * (g) used only as a sleep/wakeup address, no value. */ struct socket { - int so_count; /* reference count */ + int so_count; /* (b) reference count */ short so_type; /* (a) generic type, see socket.h */ short so_options; /* from socket call, see socket.h */ short so_linger; /* time to linger while closing */ @@ -333,6 +333,7 @@ * the structure. */ #define soref(so) do { \ + SOCK_LOCK_ASSERT(so); \ ++(so)->so_count; \ } while (0)