PERFORCE change 55215 for review
Robert Watson
rwatson at FreeBSD.org
Fri Jun 18 03:25:47 GMT 2004
http://perforce.freebsd.org/chv.cgi?CH=55215
Change 55215 by rwatson at rwatson_tislabs on 2004/06/18 03:25:03
Integrate netperf_socket to loop back kqueue-related locking
in socket and fifo kqueue filters.
Affected files ...
.. //depot/projects/netperf_socket/sys/dev/ed/if_ed_pci.c#2 integrate
.. //depot/projects/netperf_socket/sys/fs/fifofs/fifo_vnops.c#9 integrate
.. //depot/projects/netperf_socket/sys/i386/isa/npx.c#7 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_socket.c#19 integrate
.. //depot/projects/netperf_socket/sys/netinet/in_gif.c#3 integrate
.. //depot/projects/netperf_socket/sys/netinet/tcp_output.c#5 integrate
Differences ...
==== //depot/projects/netperf_socket/sys/dev/ed/if_ed_pci.c#2 (text+ko) ====
@@ -18,7 +18,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ed/if_ed_pci.c,v 1.34 2003/10/31 18:31:58 brooks Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ed/if_ed_pci.c,v 1.36 2004/06/18 01:28:54 imp Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -58,11 +58,11 @@
{ 0x00000000, NULL }
};
-static int ed_pci_probe (device_t);
-static int ed_pci_attach (device_t);
+static int ed_pci_probe(device_t);
+static int ed_pci_attach(device_t);
static int
-ed_pci_probe (device_t dev)
+ed_pci_probe(device_t dev)
{
u_int32_t type = pci_get_devid(dev);
struct _pcsid *ep =pci_ids;
@@ -71,10 +71,9 @@
++ep;
if (ep->desc) {
device_set_desc(dev, ep->desc);
- return 0;
- } else {
- return ENXIO;
+ return (0);
}
+ return (ENXIO);
}
static int
==== //depot/projects/netperf_socket/sys/fs/fifofs/fifo_vnops.c#9 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)fifo_vnops.c 8.10 (Berkeley) 5/27/95
- * $FreeBSD: src/sys/fs/fifofs/fifo_vnops.c,v 1.98 2004/06/17 22:48:09 rwatson Exp $
+ * $FreeBSD: src/sys/fs/fifofs/fifo_vnops.c,v 1.99 2004/06/18 02:57:54 rwatson Exp $
*/
#include <sys/param.h>
@@ -444,23 +444,33 @@
{
struct socket *so = (struct socket *)kn->kn_hook;
+ SOCKBUF_LOCK(&so->so_rcv);
SLIST_REMOVE(&so->so_rcv.sb_sel.si_note, kn, knote, kn_selnext);
if (SLIST_EMPTY(&so->so_rcv.sb_sel.si_note))
so->so_rcv.sb_flags &= ~SB_KNOTE;
+ SOCKBUF_UNLOCK(&so->so_rcv);
}
static int
filt_fiforead(struct knote *kn, long hint)
{
struct socket *so = (struct socket *)kn->kn_hook;
+ int need_lock, result;
+ need_lock = !SOCKBUF_OWNED(&so->so_rcv);
+ if (need_lock)
+ SOCKBUF_LOCK(&so->so_rcv);
kn->kn_data = so->so_rcv.sb_cc;
if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
kn->kn_flags |= EV_EOF;
- return (1);
+ result = 1;
+ } else {
+ kn->kn_flags &= ~EV_EOF;
+ result = (kn->kn_data > 0);
}
- kn->kn_flags &= ~EV_EOF;
- return (kn->kn_data > 0);
+ if (need_lock)
+ SOCKBUF_UNLOCK(&so->so_rcv);
+ return (result);
}
static void
@@ -468,23 +478,34 @@
{
struct socket *so = (struct socket *)kn->kn_hook;
+ SOCKBUF_LOCK(&so->so_snd);
SLIST_REMOVE(&so->so_snd.sb_sel.si_note, kn, knote, kn_selnext);
if (SLIST_EMPTY(&so->so_snd.sb_sel.si_note))
so->so_snd.sb_flags &= ~SB_KNOTE;
+ SOCKBUF_UNLOCK(&so->so_snd);
}
static int
filt_fifowrite(struct knote *kn, long hint)
{
struct socket *so = (struct socket *)kn->kn_hook;
+ int need_lock, result;
+ need_lock = !SOCKBUF_OWNED(&so->so_snd);
+ if (need_lock)
+ SOCKBUF_LOCK(&so->so_snd);
kn->kn_data = sbspace(&so->so_snd);
+ /* Unlocked read. */
if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
kn->kn_flags |= EV_EOF;
- return (1);
+ result = 1;
+ } else {
+ kn->kn_flags &= ~EV_EOF;
+ result = (kn->kn_data >= so->so_snd.sb_lowat);
}
- kn->kn_flags &= ~EV_EOF;
- return (kn->kn_data >= so->so_snd.sb_lowat);
+ if (need_lock)
+ SOCKBUF_UNLOCK(&so->so_snd);
+ return (result);
}
/* ARGSUSED */
==== //depot/projects/netperf_socket/sys/i386/isa/npx.c#7 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/isa/npx.c,v 1.149 2004/06/06 15:17:44 bde Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/isa/npx.c,v 1.151 2004/06/18 02:10:55 bde Exp $");
#include "opt_cpu.h"
#include "opt_debug_npx.h"
@@ -872,6 +872,15 @@
{
struct thread *td;
+ /*
+ * Discard pending exceptions in the !cpu_fxsr case so that unmasked
+ * ones don't cause a panic on the next frstor.
+ */
+#ifdef CPU_ENABLE_SSE
+ if (!cpu_fxsr)
+#endif
+ fnclex();
+
td = PCPU_GET(fpcurthread);
PCPU_SET(fpcurthread, NULL);
td->td_pcb->pcb_flags &= ~PCB_NPXINITDONE;
==== //depot/projects/netperf_socket/sys/kern/uipc_socket.c#19 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.179 2004/06/17 22:48:09 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.180 2004/06/18 02:57:55 rwatson Exp $");
#include "opt_inet.h"
#include "opt_mac.h"
@@ -509,9 +509,9 @@
int error;
if ((so->so_state & SS_ISCONNECTED) == 0)
- return ENOTCONN;
+ return (ENOTCONN);
if (so->so_state & SS_ISDISCONNECTING)
- return EALREADY;
+ return (EALREADY);
error = (*so->so_proto->pr_usrreqs->pru_disconnect)(so);
return (error);
}
@@ -1932,9 +1932,16 @@
filt_soread(struct knote *kn, long hint)
{
struct socket *so = kn->kn_fp->f_data;
- int result;
+ int need_lock, result;
- SOCKBUF_LOCK(&so->so_rcv); /* XXX too conservative? */
+ /*
+ * XXXRW: Conditional locking because filt_soread() can be called
+ * either from KNOTE() in the socket context where the socket buffer
+ * lock is already held, or from kqueue() itself.
+ */
+ need_lock = !SOCKBUF_OWNED(&so->so_rcv);
+ if (need_lock)
+ SOCKBUF_LOCK(&so->so_rcv);
kn->kn_data = so->so_rcv.sb_cc - so->so_rcv.sb_ctl;
if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
kn->kn_flags |= EV_EOF;
@@ -1946,7 +1953,8 @@
result = (kn->kn_data >= kn->kn_sdata);
else
result = (so->so_rcv.sb_cc >= so->so_rcv.sb_lowat);
- SOCKBUF_UNLOCK(&so->so_rcv);
+ if (need_lock)
+ SOCKBUF_UNLOCK(&so->so_rcv);
return (result);
}
@@ -1967,9 +1975,16 @@
filt_sowrite(struct knote *kn, long hint)
{
struct socket *so = kn->kn_fp->f_data;
- int result;
+ int need_lock, result;
- SOCKBUF_LOCK(&so->so_snd); /* XXX too conservative? */
+ /*
+ * XXXRW: Conditional locking because filt_soread() can be called
+ * either from KNOTE() in the socket context where the socket buffer
+ * lock is already held, or from kqueue() itself.
+ */
+ need_lock = !SOCKBUF_OWNED(&so->so_snd);
+ if (need_lock)
+ SOCKBUF_LOCK(&so->so_snd);
kn->kn_data = sbspace(&so->so_snd);
if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
kn->kn_flags |= EV_EOF;
@@ -1984,7 +1999,8 @@
result = (kn->kn_data >= kn->kn_sdata);
else
result = (kn->kn_data >= so->so_snd.sb_lowat);
- SOCKBUF_UNLOCK(&so->so_snd);
+ if (need_lock)
+ SOCKBUF_UNLOCK(&so->so_snd);
return (result);
}
==== //depot/projects/netperf_socket/sys/netinet/in_gif.c#3 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/netinet/in_gif.c,v 1.25 2004/04/14 01:13:14 luigi Exp $ */
+/* $FreeBSD: src/sys/netinet/in_gif.c,v 1.26 2004/06/18 02:04:07 bms Exp $ */
/* $KAME: in_gif.c,v 1.54 2001/05/14 14:02:16 itojun Exp $ */
/*
@@ -177,6 +177,7 @@
if (dst->sin_family != sin_dst->sin_family ||
dst->sin_addr.s_addr != sin_dst->sin_addr.s_addr) {
/* cache route doesn't match */
+ bzero(dst, sizeof(*dst));
dst->sin_family = sin_dst->sin_family;
dst->sin_len = sizeof(struct sockaddr_in);
dst->sin_addr = sin_dst->sin_addr;
==== //depot/projects/netperf_socket/sys/netinet/tcp_output.c#5 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_output.c 8.4 (Berkeley) 5/24/95
- * $FreeBSD: src/sys/netinet/tcp_output.c,v 1.91 2004/05/04 02:11:47 rwatson Exp $
+ * $FreeBSD: src/sys/netinet/tcp_output.c,v 1.92 2004/06/18 02:47:59 bms Exp $
*/
#include "opt_inet.h"
@@ -292,7 +292,7 @@
len = tp->t_maxseg;
sendalot = 1;
}
- if (SEQ_LT(tp->snd_nxt + len, tp->snd_una + so->so_snd.sb_cc))
+ if (off + len < so->so_snd.sb_cc)
flags &= ~TH_FIN;
recwin = sbspace(&so->so_rcv);
More information about the p4-projects
mailing list