PERFORCE change 54746 for review
Robert Watson
rwatson at FreeBSD.org
Sat Jun 12 21:15:06 GMT 2004
http://perforce.freebsd.org/chv.cgi?CH=54746
Change 54746 by rwatson at 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 at 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)
More information about the p4-projects
mailing list