PERFORCE change 54985 for review
Robert Watson
rwatson at FreeBSD.org
Tue Jun 15 03:59:53 GMT 2004
http://perforce.freebsd.org/chv.cgi?CH=54985
Change 54985 by rwatson at rwatson_tislabs on 2004/06/15 03:59:11
Integrate netperf_socket; among other things, loop back some
initial locking of sb_state.
Affected files ...
.. //depot/projects/netperf_socket/sys/contrib/altq/altq/altq_subr.c#3 integrate
.. //depot/projects/netperf_socket/sys/contrib/altq/altq/if_altq.h#3 integrate
.. //depot/projects/netperf_socket/sys/fs/fifofs/fifo_vnops.c#7 integrate
.. //depot/projects/netperf_socket/sys/i386/acpica/acpi_toshiba.c#7 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/bios.c#5 integrate
.. //depot/projects/netperf_socket/sys/kern/link_elf_obj.c#3 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_socket2.c#15 integrate
.. //depot/projects/netperf_socket/sys/net/if.c#10 integrate
.. //depot/projects/netperf_socket/sys/net/if_var.h#13 integrate
.. //depot/projects/netperf_socket/sys/netinet/tcp_input.c#9 integrate
.. //depot/projects/netperf_socket/sys/netipx/spx_usrreq.c#5 integrate
.. //depot/projects/netperf_socket/sys/sparc64/sbus/lsi64854.c#1 branch
.. //depot/projects/netperf_socket/sys/sparc64/sbus/lsi64854reg.h#1 branch
.. //depot/projects/netperf_socket/sys/sparc64/sbus/lsi64854var.h#1 branch
.. //depot/projects/netperf_socket/sys/sys/socketvar.h#15 integrate
.. //depot/projects/netperf_socket/sys/vm/vm_contig.c#7 integrate
Differences ...
==== //depot/projects/netperf_socket/sys/contrib/altq/altq/altq_subr.c#3 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/contrib/altq/altq/altq_subr.c,v 1.3 2004/06/13 22:52:38 mlaier Exp $ */
+/* $FreeBSD: src/sys/contrib/altq/altq/altq_subr.c,v 1.4 2004/06/15 01:45:19 mlaier Exp $ */
/* $KAME: altq_subr.c,v 1.21 2003/11/06 06:32:53 kjc Exp $ */
/*
@@ -91,6 +91,7 @@
*/
static void tbr_timeout(void *);
int (*altq_input)(struct mbuf *, int) = NULL;
+static struct mbuf *tbr_dequeue(struct ifaltq *, int);
static int tbr_timer = 0; /* token bucket regulator timer */
static struct callout tbr_callout = CALLOUT_INITIALIZER;
@@ -312,7 +313,7 @@
#define TBR_SCALE(x) ((int64_t)(x) << TBR_SHIFT)
#define TBR_UNSCALE(x) ((x) >> TBR_SHIFT)
-struct mbuf *
+static struct mbuf *
tbr_dequeue(ifq, op)
struct ifaltq *ifq;
int op;
@@ -370,6 +371,9 @@
struct tb_profile *profile;
{
struct tb_regulator *tbr, *otbr;
+
+ if (tbr_dequeue_ptr == NULL)
+ tbr_dequeue_ptr = tbr_dequeue;
if (machclk_freq == 0)
init_machclk();
==== //depot/projects/netperf_socket/sys/contrib/altq/altq/if_altq.h#3 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/contrib/altq/altq/if_altq.h,v 1.2 2004/06/12 18:47:24 mlaier Exp $ */
+/* $FreeBSD: src/sys/contrib/altq/altq/if_altq.h,v 1.3 2004/06/15 01:45:19 mlaier Exp $ */
/* $KAME: if_altq.h,v 1.11 2003/07/10 12:07:50 kjc Exp $ */
/*
@@ -181,9 +181,9 @@
extern int altq_detach(struct ifaltq *);
extern int altq_enable(struct ifaltq *);
extern int altq_disable(struct ifaltq *);
-extern struct mbuf *tbr_dequeue(struct ifaltq *, int);
+extern struct mbuf *(*tbr_dequeue_ptr)(struct ifaltq *, int);
extern int (*altq_input)(struct mbuf *, int);
-#if 1 /* ALTQ3_CLFIER_COMPAT */
+#if 0 /* ALTQ3_CLFIER_COMPAT */
void altq_etherclassify(struct ifaltq *, struct mbuf *, struct altq_pktattr *);
#endif
#endif /* _KERNEL */
==== //depot/projects/netperf_socket/sys/fs/fifofs/fifo_vnops.c#7 (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.96 2004/06/14 18:16:20 rwatson Exp $
+ * $FreeBSD: src/sys/fs/fifofs/fifo_vnops.c,v 1.97 2004/06/15 03:51:43 rwatson Exp $
*/
#include <sys/param.h>
@@ -211,7 +211,9 @@
}
fip->fi_readers = fip->fi_writers = 0;
wso->so_snd.sb_lowat = PIPE_BUF;
+ SOCKBUF_LOCK(&rso->so_rcv);
rso->so_rcv.sb_state |= SBS_CANTRCVMORE;
+ SOCKBUF_UNLOCK(&rso->so_rcv);
vp->v_fifoinfo = fip;
}
@@ -229,7 +231,9 @@
if (ap->a_mode & FREAD) {
fip->fi_readers++;
if (fip->fi_readers == 1) {
+ SOCKBUF_LOCK(&fip->fi_writesock->so_snd);
fip->fi_writesock->so_snd.sb_state &= ~SBS_CANTSENDMORE;
+ SOCKBUF_UNLOCK(&fip->fi_writesock->so_snd);
if (fip->fi_writers > 0) {
wakeup(&fip->fi_writers);
sowwakeup(fip->fi_writesock);
@@ -243,7 +247,9 @@
}
fip->fi_writers++;
if (fip->fi_writers == 1) {
+ SOCKBUF_LOCK(&fip->fi_writesock->so_rcv);
fip->fi_readsock->so_rcv.sb_state &= ~SBS_CANTRCVMORE;
+ SOCKBUF_UNLOCK(&fip->fi_writesock->so_rcv);
if (fip->fi_readers > 0) {
wakeup(&fip->fi_readers);
sorwakeup(fip->fi_writesock);
==== //depot/projects/netperf_socket/sys/i386/acpica/acpi_toshiba.c#7 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/acpica/acpi_toshiba.c,v 1.9 2004/06/14 03:40:56 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/acpica/acpi_toshiba.c,v 1.10 2004/06/15 02:17:23 njl Exp $");
#include "opt_acpi.h"
#include <sys/param.h>
@@ -529,7 +529,7 @@
if (!acpi_disabled("toshiba") &&
acpi_get_type(dev) == ACPI_TYPE_DEVICE &&
device_get_unit(dev) == 0 &&
- acpi_MatchHid(dev, "TOS6201")) {
+ acpi_MatchHid(device_get_handle(dev), "TOS6201")) {
device_quiet(dev);
device_set_desc(dev, "Toshiba Video");
ret = 0;
==== //depot/projects/netperf_socket/sys/i386/i386/bios.c#5 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/bios.c,v 1.67 2004/06/10 20:43:03 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/bios.c,v 1.68 2004/06/15 02:12:12 njl Exp $");
/*
* Code for dealing with the BIOS in x86 PC systems.
@@ -556,7 +556,7 @@
return;
/* ACPI already active */
- if (devclass_get_softc(devclass_find("acpi"), 0) != NULL)
+ if (devclass_find("acpi") != NULL)
return;
/* get count of PnP devices */
==== //depot/projects/netperf_socket/sys/kern/link_elf_obj.c#3 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/link_elf_obj.c,v 1.81 2004/05/18 05:15:43 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/link_elf_obj.c,v 1.83 2004/06/15 01:35:57 peter Exp $");
#include "opt_ddb.h"
#include "opt_mac.h"
@@ -747,12 +747,16 @@
link_elf_symbol_values(linker_file_t lf, c_linker_sym_t sym,
linker_symval_t *symval)
{
+ Elf_Addr base;
elf_file_t ef = (elf_file_t) lf;
const Elf_Sym *es = (const Elf_Sym*) sym;
if (es >= ef->ddbsymtab && es < (ef->ddbsymtab + ef->ddbsymcnt)) {
+ base = findbase(ef, es->st_shndx);
+ if (base == 0)
+ base = (Elf_Addr)ef->address;
symval->name = ef->ddbstrtab + es->st_name;
- symval->value = (caddr_t) ef->address + es->st_value;
+ symval->value = (caddr_t)base + es->st_value;
symval->size = es->st_size;
return 0;
}
@@ -878,6 +882,8 @@
break;
}
}
+ if (ret == 0)
+ return (0);
return ret + sym->st_value;
}
==== //depot/projects/netperf_socket/sys/kern/uipc_socket2.c#15 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_socket2.c,v 1.130 2004/06/14 18:16:19 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_socket2.c,v 1.131 2004/06/15 03:51:44 rwatson Exp $");
#include "opt_mac.h"
#include "opt_param.h"
@@ -167,8 +167,12 @@
SOCK_LOCK(so);
so->so_state &= ~SS_ISCONNECTING;
so->so_state |= SS_ISDISCONNECTING;
+ SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state |= SBS_CANTRCVMORE;
+ SOCKBUF_UNLOCK(&so->so_rcv);
+ SOCKBUF_LOCK(&so->so_snd);
so->so_snd.sb_state |= SBS_CANTSENDMORE;
+ SOCKBUF_UNLOCK(&so->so_snd);
wakeup(&so->so_timeo);
SOCK_UNLOCK(so);
sowwakeup(so);
@@ -187,8 +191,12 @@
SOCK_LOCK(so);
so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
so->so_state |= SS_ISDISCONNECTED;
+ SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state |= SBS_CANTRCVMORE;
+ SOCKBUF_UNLOCK(&so->so_rcv);
+ SOCKBUF_LOCK(&so->so_snd);
so->so_snd.sb_state |= SBS_CANTSENDMORE;
+ SOCKBUF_UNLOCK(&so->so_snd);
wakeup(&so->so_timeo);
SOCK_UNLOCK(so);
sbdrop(&so->so_snd, so->so_snd.sb_cc);
==== //depot/projects/netperf_socket/sys/net/if.c#10 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)if.c 8.5 (Berkeley) 1/9/95
- * $FreeBSD: src/sys/net/if.c,v 1.192 2004/06/13 17:29:08 mlaier Exp $
+ * $FreeBSD: src/sys/net/if.c,v 1.193 2004/06/15 01:45:18 mlaier Exp $
*/
#include "opt_compat.h"
@@ -75,6 +75,8 @@
#include <netinet/if_ether.h>
#endif
+struct mbuf *(*tbr_dequeue_ptr)(struct ifaltq *, int) = NULL;
+
static void if_attachdomain(void *);
static void if_attachdomain1(struct ifnet *);
static int ifconf(u_long, caddr_t);
@@ -441,13 +443,11 @@
ifa->ifa_refcnt = 1;
TAILQ_INSERT_HEAD(&ifp->if_addrhead, ifa, ifa_link);
ifp->if_broadcastaddr = 0; /* reliably crash if used uninitialized */
-#ifdef ALTQ
ifp->if_snd.altq_type = 0;
ifp->if_snd.altq_disc = NULL;
ifp->if_snd.altq_flags &= ALTQF_CANTCHANGE;
ifp->if_snd.altq_tbr = NULL;
ifp->if_snd.altq_ifp = ifp;
-#endif
if (domains)
if_attachdomain1(ifp);
==== //depot/projects/netperf_socket/sys/net/if_var.h#13 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* From: @(#)if.h 8.1 (Berkeley) 6/10/93
- * $FreeBSD: src/sys/net/if_var.h,v 1.76 2004/06/14 03:55:09 mlaier Exp $
+ * $FreeBSD: src/sys/net/if_var.h,v 1.78 2004/06/15 03:40:39 mlaier Exp $
*/
#ifndef _NET_IF_VAR_H_
@@ -356,7 +356,7 @@
(*ifp->if_start)(ifp);
return (1);
}
-#ifdef ALTQ
+#if 1 /* ALTQ */
#define IFQ_ENQUEUE(ifq, m, err) \
do { \
IF_LOCK(ifq); \
@@ -379,7 +379,7 @@
#define IFQ_DEQUEUE_NOLOCK(ifq, m) \
do { \
if (TBR_IS_ENABLED(ifq)) \
- (m) = tbr_dequeue(ifq, ALTDQ_REMOVE); \
+ (m) = tbr_dequeue_ptr(ifq, ALTDQ_REMOVE); \
else if (ALTQ_IS_ENABLED(ifq)) \
ALTQ_DEQUEUE(ifq, m); \
else \
@@ -396,7 +396,7 @@
#define IFQ_POLL_NOLOCK(ifq, m) \
do { \
if (TBR_IS_ENABLED(ifq)) \
- (m) = tbr_dequeue(ifq, ALTDQ_POLL); \
+ (m) = tbr_dequeue_ptr(ifq, ALTDQ_POLL); \
else if (ALTQ_IS_ENABLED(ifq)) \
ALTQ_POLL(ifq, m); \
else \
@@ -482,7 +482,7 @@
} while (0)
#define IFQ_HANDOFF(ifp, m, err) \
- IFQ_HANDOFF_ADJ(ifq, m, 0, err)
+ IFQ_HANDOFF_ADJ(ifp, m, 0, err)
#define IFQ_DRV_DEQUEUE(ifq, m) \
do { \
==== //depot/projects/netperf_socket/sys/netinet/tcp_input.c#9 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_input.c 8.12 (Berkeley) 5/24/95
- * $FreeBSD: src/sys/netinet/tcp_input.c,v 1.239 2004/06/14 18:16:21 rwatson Exp $
+ * $FreeBSD: src/sys/netinet/tcp_input.c,v 1.240 2004/06/15 03:51:44 rwatson Exp $
*/
#include "opt_ipfw.h" /* for ipfw_fwd */
@@ -2253,8 +2253,11 @@
tp->rcv_up = th->th_seq + th->th_urp;
so->so_oobmark = so->so_rcv.sb_cc +
(tp->rcv_up - tp->rcv_nxt) - 1;
- if (so->so_oobmark == 0)
+ if (so->so_oobmark == 0) {
+ SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state |= SBS_RCVATMARK;
+ SOCKBUF_UNLOCK(&so->so_rcv);
+ }
sohasoutofband(so);
tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA);
}
==== //depot/projects/netperf_socket/sys/netipx/spx_usrreq.c#5 (text+ko) ====
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netipx/spx_usrreq.c,v 1.42 2004/06/14 18:16:22 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netipx/spx_usrreq.c,v 1.43 2004/06/15 03:51:44 rwatson Exp $");
#include <sys/param.h>
#include <sys/lock.h>
@@ -566,8 +566,11 @@
cb->s_oobflags &= ~SF_IOOB;
if (so->so_rcv.sb_cc)
so->so_oobmark = so->so_rcv.sb_cc;
- else
+ else {
+ SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state |= SBS_RCVATMARK;
+ SOCKBUF_UNLOCK(&so->so_rcv);
+ }
}
q = q->si_prev;
remque(q->si_next);
@@ -597,7 +600,9 @@
MCHTYPE(m, MT_OOBDATA);
spx_newchecks[1]++;
so->so_oobmark = 0;
+ SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state &= ~SBS_RCVATMARK;
+ SOCKBUF_UNLOCK(&so->so_rcv);
}
if (packetp == 0) {
m->m_data += SPINC;
==== //depot/projects/netperf_socket/sys/sys/socketvar.h#15 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)socketvar.h 8.3 (Berkeley) 2/19/95
- * $FreeBSD: src/sys/sys/socketvar.h,v 1.122 2004/06/14 18:16:18 rwatson Exp $
+ * $FreeBSD: src/sys/sys/socketvar.h,v 1.123 2004/06/14 22:03:14 rwatson Exp $
*/
#ifndef _SYS_SOCKETVAR_H_
@@ -194,7 +194,7 @@
#define SOCK_UNLOCK(_so) SOCKBUF_UNLOCK(&(_so)->so_rcv)
#define SOCK_LOCK_ASSERT(_so) SOCKBUF_LOCK_ASSERT(&(_so)->so_rcv)
-/*-
+/*
* Socket state bits.
*
* Historically, this bits were all kept in the so_state field. For
==== //depot/projects/netperf_socket/sys/vm/vm_contig.c#7 (text+ko) ====
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/vm/vm_contig.c,v 1.34 2004/04/06 20:15:36 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/vm/vm_contig.c,v 1.35 2004/06/15 01:02:00 green Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -119,7 +119,7 @@
} else if (object->type == OBJT_SWAP ||
object->type == OBJT_DEFAULT) {
m_tmp = m;
- vm_pageout_flush(&m_tmp, 1, 0);
+ vm_pageout_flush(&m_tmp, 1, VM_PAGER_PUT_SYNC);
VM_OBJECT_UNLOCK(object);
return (TRUE);
}
@@ -152,6 +152,7 @@
vm_object_t object;
vm_offset_t addr, tmp_addr;
int pass, pqtype;
+ int inactl, actl, inactmax, actmax;
vm_page_t pga = vm_page_array;
size = round_page(size);
@@ -163,7 +164,7 @@
panic("contigmalloc1: boundary must be a power of 2");
start = 0;
- for (pass = 0; pass <= 1; pass++) {
+ for (pass = 2; pass >= 0; pass--) {
vm_page_lock_queues();
again0:
mtx_lock_spin(&vm_page_queue_free_mtx);
@@ -188,11 +189,29 @@
if ((i == cnt.v_page_count) ||
((VM_PAGE_TO_PHYS(&pga[i]) + size) > high)) {
mtx_unlock_spin(&vm_page_queue_free_mtx);
+ /*
+ * Instead of racing to empty the inactive/active
+ * queues, give up, even with more left to free,
+ * if we try more than the initial amount of pages.
+ *
+ * There's no point attempting this on the last pass.
+ */
+ if (pass > 0) {
+ inactl = actl = 0;
+ inactmax = vm_page_queues[PQ_INACTIVE].lcnt;
+ actmax = vm_page_queues[PQ_ACTIVE].lcnt;
again1:
- if (vm_contig_launder(PQ_INACTIVE))
- goto again1;
- if (vm_contig_launder(PQ_ACTIVE))
- goto again1;
+ if (inactl < inactmax &&
+ vm_contig_launder(PQ_INACTIVE)) {
+ inactl++;
+ goto again1;
+ }
+ if (actl < actmax &&
+ vm_contig_launder(PQ_ACTIVE)) {
+ actl++;
+ goto again1;
+ }
+ }
vm_page_unlock_queues();
continue;
}
More information about the p4-projects
mailing list