Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 12 Jun 2004 21:13:40 GMT
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 54746 for review
Message-ID:  <200406122113.i5CLDeME006437@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/param.h>

==== //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 <sys/param.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
-#include <sys/malloc.h>
 #include <sys/mutex.h>
 #include <sys/protosw.h>
 #include <sys/signalvar.h>
@@ -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 <sys/param.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/param.h>
 #include <sys/systm.h>

==== //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 <sys/param.h>
@@ -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 <sys/param.h>
@@ -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 <sys/param.h>
@@ -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 <sys/param.h>
@@ -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 <archie@freebsd.org>
  *
- * $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 <sys/cdefs.h>
-__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 <sys/param.h>
 #include <sys/systm.h>

==== //depot/projects/netperf_socket/sys/netipx/ipx_usrreq.c#3 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/param.h>
 #include <sys/conf.h>

==== //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)
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200406122113.i5CLDeME006437>