PERFORCE change 102956 for review
John Baldwin
jhb at FreeBSD.org
Tue Aug 1 17:32:15 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=102956
Change 102956 by jhb at jhb_mutex on 2006/08/01 17:31:29
IFC @102951.
Affected files ...
.. //depot/projects/smpng/sys/amd64/amd64/identcpu.c#20 integrate
.. //depot/projects/smpng/sys/ddb/db_ps.c#35 integrate
.. //depot/projects/smpng/sys/dev/mxge/if_mxge.c#4 integrate
.. //depot/projects/smpng/sys/i386/i386/identcpu.c#47 integrate
.. //depot/projects/smpng/sys/kern/kern_fork.c#100 integrate
.. //depot/projects/smpng/sys/kern/kern_syscalls.c#6 integrate
.. //depot/projects/smpng/sys/kern/uipc_sockbuf.c#2 integrate
.. //depot/projects/smpng/sys/kern/uipc_socket.c#89 integrate
.. //depot/projects/smpng/sys/kern/uipc_usrreq.c#64 integrate
.. //depot/projects/smpng/sys/net/bridgestp.c#9 integrate
.. //depot/projects/smpng/sys/net/bridgestp.h#2 integrate
.. //depot/projects/smpng/sys/net/if_bridge.c#35 integrate
.. //depot/projects/smpng/sys/net/if_bridgevar.h#12 integrate
.. //depot/projects/smpng/sys/nfsserver/nfs.h#18 integrate
.. //depot/projects/smpng/sys/nfsserver/nfs_srvcache.c#13 integrate
.. //depot/projects/smpng/sys/nfsserver/nfs_srvsubs.c#34 integrate
.. //depot/projects/smpng/sys/nfsserver/nfs_syscalls.c#28 integrate
.. //depot/projects/smpng/sys/sys/kernel.h#34 integrate
.. //depot/projects/smpng/sys/sys/socketvar.h#54 integrate
.. //depot/projects/smpng/sys/sys/sysent.h#20 integrate
Differences ...
==== //depot/projects/smpng/sys/amd64/amd64/identcpu.c#20 (text+ko) ====
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/identcpu.c,v 1.147 2006/07/12 06:04:11 jkim Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/identcpu.c,v 1.148 2006/08/01 01:23:39 obrien Exp $");
#include "opt_cpu.h"
@@ -296,8 +296,8 @@
"\034RDTSCP" /* RDTSCP */
"\035<b28>" /* Undefined */
"\036LM" /* 64 bit long mode */
- "\0373DNow+" /* AMD 3DNow! Extensions */
- "\0403DNow" /* AMD 3DNow! */
+ "\0373DNow!+" /* AMD 3DNow! Extensions */
+ "\0403DNow!" /* AMD 3DNow! */
);
}
==== //depot/projects/smpng/sys/ddb/db_ps.c#35 (text+ko) ====
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ddb/db_ps.c,v 1.61 2006/07/12 21:22:43 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/ddb/db_ps.c,v 1.62 2006/08/01 15:29:46 jhb Exp $");
#include <sys/param.h>
#include <sys/cons.h>
@@ -57,10 +57,10 @@
*
* 1 2 3 4 5 6 7
* 1234567890123456789012345678901234567890123456789012345678901234567890
- * pid uid ppid pgrp state wmesg wchan cmd
- * <pid> <ui> <ppi> <pgi> <stat> < wmesg > < wchan > <name>
- * <pid> <ui> <ppi> <pgi> <stat> (threaded) <command>
- * <tid > <stat> < wmesg > < wchan > <name>
+ * pid ppid pgrp uid state wmesg wchan cmd
+ * <pid> <ppi> <pgi> <uid> <stat> < wmesg > < wchan > <name>
+ * <pid> <ppi> <pgi> <uid> <stat> (threaded) <command>
+ * <tid > <stat> < wmesg > < wchan > <name>
*
* For machines with 64-bit pointers, we expand the wchan field 8 more
* characters.
@@ -83,9 +83,9 @@
p = &proc0;
#ifdef __LP64__
- db_printf(" pid uid ppid pgrp state wmesg wchan cmd\n");
+ db_printf(" pid ppid pgrp uid state wmesg wchan cmd\n");
#else
- db_printf(" pid uid ppid pgrp state wmesg wchan cmd\n");
+ db_printf(" pid ppid pgrp uid state wmesg wchan cmd\n");
#endif
while (--np >= 0 && !db_pager_quit) {
if (p == NULL) {
@@ -98,9 +98,9 @@
cred = p->p_ucred;
pgrp = p->p_pgrp;
- db_printf("%5d %4d %5d %5d ", p->p_pid,
- cred != NULL ? cred->cr_ruid : 0, pp->p_pid,
- pgrp != NULL ? pgrp->pg_id : 0);
+ db_printf("%5d %5d %5d %5d ", p->p_pid, pp->p_pid,
+ pgrp != NULL ? pgrp->pg_id : 0,
+ cred != NULL ? cred->cr_ruid : 0);
/* Determine our primary process state. */
switch (p->p_state) {
@@ -207,7 +207,7 @@
void *wchan;
if (all) {
- db_printf(" %9d ", td->td_tid);
+ db_printf("%6d ", td->td_tid);
switch (td->td_state) {
case TDS_RUNNING:
snprintf(state, sizeof(state), "Run");
==== //depot/projects/smpng/sys/dev/mxge/if_mxge.c#4 (text+ko) ====
@@ -32,7 +32,7 @@
***************************************************************************/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mxge/if_mxge.c,v 1.7 2006/07/17 22:17:05 gallatin Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mxge/if_mxge.c,v 1.8 2006/08/01 14:02:54 gallatin Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -765,7 +765,6 @@
return ENXIO;
}
- mxge_dummy_rdma(sc, 1);
return 0;
}
@@ -843,6 +842,8 @@
return ENXIO;
}
+ mxge_dummy_rdma(sc, 1);
+
/* Now exchange information about interrupts */
bytes = mxge_max_intr_slots * sizeof (*sc->rx_done.entry);\
memset(sc->rx_done.entry, 0, bytes);
@@ -1025,6 +1026,10 @@
CTLFLAG_RD, &sc->tx.boundary,
0, "tx_boundary");
SYSCTL_ADD_INT(ctx, children, OID_AUTO,
+ "write_combine",
+ CTLFLAG_RD, &sc->wc,
+ 0, "write combining PIO?");
+ SYSCTL_ADD_INT(ctx, children, OID_AUTO,
"read_dma_MBs",
CTLFLAG_RD, &sc->read_dma,
0, "DMA Read speed in MB/s");
@@ -2544,6 +2549,7 @@
mxge_close(sc);
sx_xunlock(&sc->driver_lock);
ether_ifdetach(sc->ifp);
+ mxge_dummy_rdma(sc, 0);
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq_res);
sc->rx_done.entry = NULL;
mxge_dma_free(&sc->rx_done.dma);
==== //depot/projects/smpng/sys/i386/i386/identcpu.c#47 (text+ko) ====
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/identcpu.c,v 1.167 2006/07/12 16:52:55 mr Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/identcpu.c,v 1.168 2006/08/01 01:23:39 obrien Exp $");
#include "opt_cpu.h"
@@ -815,8 +815,8 @@
"\034RDTSCP" /* RDTSCP */
"\035<b28>" /* Undefined */
"\036LM" /* 64 bit long mode */
- "\0373DNow+" /* AMD 3DNow! Extensions */
- "\0403DNow" /* AMD 3DNow! */
+ "\0373DNow!+" /* AMD 3DNow! Extensions */
+ "\0403DNow!" /* AMD 3DNow! */
);
}
==== //depot/projects/smpng/sys/kern/kern_fork.c#100 (text+ko) ====
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_fork.c,v 1.259 2006/06/27 11:28:50 pjd Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_fork.c,v 1.260 2006/08/01 15:30:56 jhb Exp $");
#include "opt_ktrace.h"
#include "opt_mac.h"
@@ -377,17 +377,14 @@
p2 = LIST_FIRST(&allproc);
again:
for (; p2 != NULL; p2 = LIST_NEXT(p2, p_list)) {
- PROC_LOCK(p2);
while (p2->p_pid == trypid ||
(p2->p_pgrp != NULL &&
(p2->p_pgrp->pg_id == trypid ||
(p2->p_session != NULL &&
p2->p_session->s_sid == trypid)))) {
trypid++;
- if (trypid >= pidchecked) {
- PROC_UNLOCK(p2);
+ if (trypid >= pidchecked)
goto retry;
- }
}
if (p2->p_pid > trypid && pidchecked > p2->p_pid)
pidchecked = p2->p_pid;
@@ -400,7 +397,6 @@
pidchecked > p2->p_session->s_sid)
pidchecked = p2->p_session->s_sid;
}
- PROC_UNLOCK(p2);
}
if (!doingzomb) {
doingzomb = 1;
==== //depot/projects/smpng/sys/kern/kern_syscalls.c#6 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_syscalls.c,v 1.11 2004/07/15 08:26:05 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_syscalls.c,v 1.12 2006/08/01 16:32:20 jhb Exp $");
#include <sys/param.h>
#include <sys/sysproto.h>
@@ -97,8 +97,11 @@
case MOD_LOAD :
error = syscall_register(data->offset, data->new_sysent,
&data->old_sysent);
- if (error)
+ if (error) {
+ /* Leave a mark so we know to safely unload below. */
+ data->offset = NULL;
return error;
+ }
ms.intval = *data->offset;
MOD_XLOCK;
module_setspecific(mod, &ms);
@@ -108,6 +111,13 @@
return error;
case MOD_UNLOAD :
+ /*
+ * MOD_LOAD failed, so just return without calling the
+ * chained handler since we didn't pass along the MOD_LOAD
+ * event.
+ */
+ if (data->offset == NULL)
+ return (0);
if (data->chainevh) {
error = data->chainevh(mod, what, data->chainarg);
if (error)
==== //depot/projects/smpng/sys/kern/uipc_sockbuf.c#2 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_sockbuf.c,v 1.162 2006/07/24 16:21:31 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_sockbuf.c,v 1.163 2006/08/01 10:30:26 rwatson Exp $");
#include "opt_param.h"
@@ -64,6 +64,10 @@
static u_long sb_efficiency = 8; /* parameter for sbreserve() */
+static void sbdrop_internal(register struct sockbuf *sb, register int len);
+static void sbflush_internal(register struct sockbuf *sb);
+static void sbrelease_internal(struct sockbuf *sb, struct socket *so);
+
/*
* Socantsendmore indicates that no more data will be sent on the
* socket; it would normally be applied to a socket when the user
@@ -331,6 +335,18 @@
/*
* Free mbufs held by a socket, and reserved mbuf space.
*/
+static void
+sbrelease_internal(sb, so)
+ struct sockbuf *sb;
+ struct socket *so;
+{
+
+ sbflush_internal(sb);
+ (void)chgsbsize(so->so_cred->cr_uidinfo, &sb->sb_hiwat, 0,
+ RLIM_INFINITY);
+ sb->sb_mbmax = 0;
+}
+
void
sbrelease_locked(sb, so)
struct sockbuf *sb;
@@ -339,10 +355,7 @@
SOCKBUF_LOCK_ASSERT(sb);
- sbflush_locked(sb);
- (void)chgsbsize(so->so_cred->cr_uidinfo, &sb->sb_hiwat, 0,
- RLIM_INFINITY);
- sb->sb_mbmax = 0;
+ sbrelease_internal(sb, so);
}
void
@@ -355,6 +368,17 @@
sbrelease_locked(sb, so);
SOCKBUF_UNLOCK(sb);
}
+
+void
+sbdestroy(sb, so)
+ struct sockbuf *sb;
+ struct socket *so;
+{
+
+ sbrelease_internal(sb, so);
+}
+
+
/*
* Routines to add and remove
* data from an mbuf queue.
@@ -823,13 +847,11 @@
* Free all mbufs in a sockbuf.
* Check that all resources are reclaimed.
*/
-void
-sbflush_locked(sb)
+static void
+sbflush_internal(sb)
register struct sockbuf *sb;
{
- SOCKBUF_LOCK_ASSERT(sb);
-
if (sb->sb_flags & SB_LOCK)
panic("sbflush_locked: locked");
while (sb->sb_mbcnt) {
@@ -839,13 +861,22 @@
*/
if (!sb->sb_cc && (sb->sb_mb == NULL || sb->sb_mb->m_len))
break;
- sbdrop_locked(sb, (int)sb->sb_cc);
+ sbdrop_internal(sb, (int)sb->sb_cc);
}
if (sb->sb_cc || sb->sb_mb || sb->sb_mbcnt)
panic("sbflush_locked: cc %u || mb %p || mbcnt %u", sb->sb_cc, (void *)sb->sb_mb, sb->sb_mbcnt);
}
void
+sbflush_locked(sb)
+ register struct sockbuf *sb;
+{
+
+ SOCKBUF_LOCK_ASSERT(sb);
+ sbflush_internal(sb);
+}
+
+void
sbflush(sb)
register struct sockbuf *sb;
{
@@ -858,16 +889,14 @@
/*
* Drop data from (the front of) a sockbuf.
*/
-void
-sbdrop_locked(sb, len)
+static void
+sbdrop_internal(sb, len)
register struct sockbuf *sb;
register int len;
{
register struct mbuf *m;
struct mbuf *next;
- SOCKBUF_LOCK_ASSERT(sb);
-
next = (m = sb->sb_mb) ? m->m_nextpkt : 0;
while (len > 0) {
if (m == 0) {
@@ -916,6 +945,17 @@
* Drop data from (the front of) a sockbuf.
*/
void
+sbdrop_locked(sb, len)
+ register struct sockbuf *sb;
+ register int len;
+{
+
+ SOCKBUF_LOCK_ASSERT(sb);
+
+ sbdrop_internal(sb, len);
+}
+
+void
sbdrop(sb, len)
register struct sockbuf *sb;
register int len;
==== //depot/projects/smpng/sys/kern/uipc_socket.c#89 (text+ko) ====
@@ -94,7 +94,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.275 2006/07/24 15:20:07 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.276 2006/08/01 10:30:26 rwatson Exp $");
#include "opt_inet.h"
#include "opt_mac.h"
@@ -555,6 +555,7 @@
sofree(so)
struct socket *so;
{
+ struct protosw *pr = so->so_proto;
struct socket *head;
ACCEPT_LOCK_ASSERT();
@@ -588,24 +589,31 @@
SOCK_UNLOCK(so);
ACCEPT_UNLOCK();
- SOCKBUF_LOCK(&so->so_snd);
- so->so_snd.sb_flags |= SB_NOINTR;
- (void)sblock(&so->so_snd, M_WAITOK);
/*
- * socantsendmore_locked() drops the socket buffer mutex so that it
- * can safely perform wakeups. Re-acquire the mutex before
- * continuing.
+ * From this point on, we assume that no other references to this
+ * socket exist anywhere else in the stack. Therefore, no locks need
+ * to be acquired or held.
+ *
+ * We used to do a lot of socket buffer and socket locking here, as
+ * well as invoke sorflush() and perform wakeups. The direct call to
+ * dom_dispose() and sbrelease_internal() are an inlining of what was
+ * necessary from sorflush().
+ *
+ * Notice that the socket buffer and kqueue state are torn down
+ * before calling pru_detach. This means that protocols shold not
+ * assume they can perform socket wakeups, etc, in their detach
+ * code.
*/
- socantsendmore_locked(so);
- SOCKBUF_LOCK(&so->so_snd);
- sbunlock(&so->so_snd);
- sbrelease_locked(&so->so_snd, so);
- SOCKBUF_UNLOCK(&so->so_snd);
- sorflush(so);
+ KASSERT((so->so_snd.sb_flags & SB_LOCK) == 0, ("sofree: snd sblock"));
+ KASSERT((so->so_rcv.sb_flags & SB_LOCK) == 0, ("sofree: rcv sblock"));
+ sbdestroy(&so->so_snd, so);
+ if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose != NULL)
+ (*pr->pr_domain->dom_dispose)(so->so_rcv.sb_mb);
+ sbdestroy(&so->so_rcv, so);
knlist_destroy(&so->so_rcv.sb_sel.si_note);
knlist_destroy(&so->so_snd.sb_sel.si_note);
- if (so->so_proto->pr_usrreqs->pru_detach != NULL)
- (*so->so_proto->pr_usrreqs->pru_detach)(so);
+ if (pr->pr_usrreqs->pru_detach != NULL)
+ (*pr->pr_usrreqs->pru_detach)(so);
sodealloc(so);
}
==== //depot/projects/smpng/sys/kern/uipc_usrreq.c#64 (text+ko) ====
@@ -50,7 +50,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_usrreq.c,v 1.182 2006/07/26 19:16:34 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_usrreq.c,v 1.183 2006/07/31 23:00:05 rwatson Exp $");
#include "opt_mac.h"
@@ -605,7 +605,18 @@
break;
}
}
+ /*
+ * Because connect() and send() are non-atomic in a sendto()
+ * with a target address, it's possible that the socket will
+ * have disconnected before the send() can run. In that case
+ * return the slightly counter-intuitive but otherwise
+ * correct error that the socket is not connected.
+ */
unp2 = unp->unp_conn;
+ if (unp2 == NULL) {
+ error = ENOTCONN;
+ break;
+ }
so2 = unp2->unp_socket;
if (unp->unp_addr != NULL)
from = (struct sockaddr *)unp->unp_addr;
@@ -650,9 +661,18 @@
error = EPIPE;
break;
}
+ /*
+ * Because connect() and send() are non-atomic in a sendto()
+ * with a target address, it's possible that the socket will
+ * have disconnected before the send() can run. In that case
+ * return the slightly counter-intuitive but otherwise
+ * correct error that the socket is not connected.
+ */
unp2 = unp->unp_conn;
- if (unp2 == NULL)
- panic("uipc_send connected but no connection?");
+ if (unp2 == NULL) {
+ error = ENOTCONN;
+ break;
+ }
so2 = unp2->unp_socket;
SOCKBUF_LOCK(&so2->so_rcv);
if (unp2->unp_flags & UNP_WANTCRED) {
==== //depot/projects/smpng/sys/net/bridgestp.c#9 (text+ko) ====
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/net/bridgestp.c,v 1.14 2006/07/26 10:45:38 thompsa Exp $");
+__FBSDID("$FreeBSD: src/sys/net/bridgestp.c,v 1.15 2006/07/31 20:24:46 thompsa Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -112,6 +112,7 @@
static void bstp_make_blocking(struct bstp_state *,
struct bstp_port *);
static void bstp_set_port_state(struct bstp_port *, uint8_t);
+static void bstp_update_forward_transitions(struct bstp_port *);
#ifdef notused
static void bstp_set_bridge_priority(struct bstp_state *, uint64_t);
static void bstp_set_port_priority(struct bstp_state *,
@@ -531,6 +532,12 @@
}
static void
+bstp_update_forward_transitions(struct bstp_port *bp)
+{
+ bp->bp_forward_transitions++;
+}
+
+static void
bstp_topology_change_detection(struct bstp_state *bs)
{
BSTP_LOCK_ASSERT(bs);
@@ -543,6 +550,7 @@
bstp_timer_start(&bs->bs_tcn_timer, 0);
}
bs->bs_topology_change_detected = 1;
+ getmicrotime(&bs->bs_last_tc_time);
}
static void
@@ -749,6 +757,7 @@
bstp_timer_start(&bp->bp_forward_delay_timer, 0);
} else if (bp->bp_state == BSTP_IFSTATE_LEARNING) {
bstp_set_port_state(bp, BSTP_IFSTATE_FORWARDING);
+ bstp_update_forward_transitions(bp);
if (bstp_designated_for_some_port(bs) &&
bp->bp_change_detection_enabled)
bstp_topology_change_detection(bs);
@@ -865,6 +874,7 @@
LIST_FOREACH(bp, &bs->bs_bplist, bp_next)
bstp_ifupdstatus(bs, bp);
+ getmicrotime(&bs->bs_last_tc_time);
bstp_port_state_selection(bs);
bstp_config_bpdu_generation(bs);
bstp_timer_start(&bs->bs_hello_timer, 0);
==== //depot/projects/smpng/sys/net/bridgestp.h#2 (text+ko) ====
@@ -67,7 +67,7 @@
*
* OpenBSD: if_bridge.h,v 1.14 2001/03/22 03:48:29 jason Exp
*
- * $FreeBSD: src/sys/net/bridgestp.h,v 1.2 2006/07/26 10:45:38 thompsa Exp $
+ * $FreeBSD: src/sys/net/bridgestp.h,v 1.3 2006/07/31 20:24:46 thompsa Exp $
*/
/*
@@ -201,6 +201,7 @@
uint8_t bp_config_pending;
uint8_t bp_change_detection_enabled;
uint8_t bp_priority;
+ uint32_t bp_forward_transitions;
};
/*
@@ -229,6 +230,7 @@
struct bstp_timer bs_tcn_timer;
struct callout bs_bstpcallout; /* STP callout */
struct bstp_timer bs_link_timer;
+ struct timeval bs_last_tc_time;
LIST_HEAD(, bstp_port) bs_bplist;
};
==== //depot/projects/smpng/sys/net/if_bridge.c#35 (text+ko) ====
@@ -80,7 +80,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/net/if_bridge.c,v 1.72 2006/07/27 21:01:47 thompsa Exp $");
+__FBSDID("$FreeBSD: src/sys/net/if_bridge.c,v 1.73 2006/07/31 20:24:46 thompsa Exp $");
#include "opt_inet.h"
#include "opt_inet6.h"
@@ -212,6 +212,7 @@
uint32_t sc_rthash_key; /* key for hash */
LIST_HEAD(, bridge_iflist) sc_spanlist; /* span ports list */
struct bstp_state sc_stp; /* STP state */
+ uint32_t sc_brtexceeded; /* # of cache drops */
};
static struct mtx bridge_list_mtx;
@@ -299,6 +300,9 @@
static int bridge_ioctl_sifcost(struct bridge_softc *, void *);
static int bridge_ioctl_addspan(struct bridge_softc *, void *);
static int bridge_ioctl_delspan(struct bridge_softc *, void *);
+static int bridge_ioctl_gbparam(struct bridge_softc *, void *);
+static int bridge_ioctl_grte(struct bridge_softc *, void *);
+static int bridge_ioctl_gifsstp(struct bridge_softc *, void *);
static int bridge_pfil(struct mbuf **, struct ifnet *, struct ifnet *,
int);
static int bridge_ip_checkbasic(struct mbuf **mp);
@@ -397,6 +401,15 @@
BC_F_COPYIN|BC_F_SUSER },
{ bridge_ioctl_delspan, sizeof(struct ifbreq),
BC_F_COPYIN|BC_F_SUSER },
+
+ { bridge_ioctl_gbparam, sizeof(struct ifbropreq),
+ BC_F_COPYOUT },
+
+ { bridge_ioctl_grte, sizeof(struct ifbrparam),
+ BC_F_COPYOUT },
+
+ { bridge_ioctl_gifsstp, sizeof(struct ifbpstpconf),
+ BC_F_COPYOUT },
};
const int bridge_control_table_size =
sizeof(bridge_control_table) / sizeof(bridge_control_table[0]);
@@ -510,6 +523,7 @@
sc->sc_brtmax = BRIDGE_RTABLE_MAX;
sc->sc_brttimeout = BRIDGE_RTABLE_TIMEOUT;
+ getmicrotime(&(sc->sc_stp.bs_last_tc_time));
/* Initialize our routing table. */
bridge_rtable_init(sc);
@@ -1425,6 +1439,95 @@
return (0);
}
+static int
+bridge_ioctl_gbparam(struct bridge_softc *sc, void *arg)
+{
+ struct ifbropreq *req = arg;
+ struct bstp_port *root_port;
+
+ BRIDGE_LOCK_ASSERT(sc);
+
+ req->ifbop_maxage = sc->sc_stp.bs_max_age;
+ req->ifbop_hellotime = sc->sc_stp.bs_hello_time;
+ req->ifbop_fwddelay = sc->sc_stp.bs_forward_delay;
+
+ root_port = sc->sc_stp.bs_root_port;
+ if (root_port == NULL)
+ req->ifbop_root_port = 0;
+ else
+ req->ifbop_root_port = root_port->bp_ifp->if_index;
+
+ req->ifbop_root_path_cost = sc->sc_stp.bs_root_path_cost;
+ req->ifbop_designated_root = sc->sc_stp.bs_designated_root;
+ req->ifbop_last_tc_time.tv_sec = sc->sc_stp.bs_last_tc_time.tv_sec;
+ req->ifbop_last_tc_time.tv_usec = sc->sc_stp.bs_last_tc_time.tv_usec;
+
+ return (0);
+}
+
+static int
+bridge_ioctl_grte(struct bridge_softc *sc, void *arg)
+{
+ struct ifbrparam *param = arg;
+
+ BRIDGE_LOCK_ASSERT(sc);
+
+ param->ifbrp_cexceeded = sc->sc_brtexceeded;
+
+ return (0);
+}
+
+static int
+bridge_ioctl_gifsstp(struct bridge_softc *sc, void *arg)
+{
+ struct ifbpstpconf *bifstp = arg;
+ struct bridge_iflist *bif;
+ struct ifbpstpreq bpreq;
+ int count, len, error = 0;
+
+ BRIDGE_LOCK_ASSERT(sc);
+
+ count = 0;
+ LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+ if ((bif->bif_flags & IFBIF_STP) != 0)
+ count++;
+ }
+
+ if (bifstp->ifbpstp_len == 0) {
+ bifstp->ifbpstp_len = sizeof(bpreq) * count;
+ return (0);
+ }
+
+ count = 0;
+ len = bifstp->ifbpstp_len;
+ bzero(&bpreq, sizeof(bpreq));
+ LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
+ if (len < sizeof(bpreq))
+ break;
+
+ if ((bif->bif_flags & IFBIF_STP) == 0)
+ continue;
+
+ bpreq.ifbp_portno = bif->bif_ifp->if_index & 0xff;
+ bpreq.ifbp_fwd_trans = bif->bif_stp.bp_forward_transitions;
+ bpreq.ifbp_design_cost = bif->bif_stp.bp_designated_cost;
+ bpreq.ifbp_design_port = bif->bif_stp.bp_designated_port;
+ bpreq.ifbp_design_bridge = bif->bif_stp.bp_designated_bridge;
+ bpreq.ifbp_design_root = bif->bif_stp.bp_designated_root;
+
+ error = copyout(&bpreq, bifstp->ifbpstp_req + count,
+ sizeof(bpreq));
+ if (error != 0)
+ break;
+
+ count++;
+ len -= sizeof(bpreq);
+ }
+
+ bifstp->ifbpstp_len = sizeof(bpreq) * count;
+ return (error);
+}
+
/*
* bridge_ifdetach:
*
@@ -2249,8 +2352,10 @@
* update it, otherwise create a new one.
*/
if ((brt = bridge_rtnode_lookup(sc, dst)) == NULL) {
- if (sc->sc_brtcnt >= sc->sc_brtmax)
+ if (sc->sc_brtcnt >= sc->sc_brtmax) {
+ sc->sc_brtexceeded++;
return (ENOSPC);
+ }
/*
* Allocate a new bridge forwarding node, and
==== //depot/projects/smpng/sys/net/if_bridgevar.h#12 (text+ko) ====
@@ -67,7 +67,7 @@
*
* OpenBSD: if_bridge.h,v 1.14 2001/03/22 03:48:29 jason Exp
*
- * $FreeBSD: src/sys/net/if_bridgevar.h,v 1.14 2006/07/27 21:01:47 thompsa Exp $
+ * $FreeBSD: src/sys/net/if_bridgevar.h,v 1.15 2006/07/31 20:24:46 thompsa Exp $
*/
/*
@@ -108,6 +108,10 @@
#define BRDGSIFCOST 22 /* set if path cost (ifbreq) */
#define BRDGADDS 23 /* add bridge span member (ifbreq) */
#define BRDGDELS 24 /* delete bridge span member (ifbreq) */
+#define BRDGPARAM 25 /* get bridge STP params (ifbropreq) */
+#define BRDGGRTE 26 /* get cache drops (ifbrparam) */
+#define BRDGGIFSSTP 27 /* get member STP params list
+ * (ifbpstpconf) */
/*
* Generic bridge control request.
@@ -191,6 +195,45 @@
#define ifbrp_hellotime ifbrp_ifbrpu.ifbrpu_int8 /* hello time (sec) */
#define ifbrp_fwddelay ifbrp_ifbrpu.ifbrpu_int8 /* fwd time (sec) */
#define ifbrp_maxage ifbrp_ifbrpu.ifbrpu_int8 /* max age (sec) */
+#define ifbrp_cexceeded ifbrp_ifbrpu.ifbrpu_int32 /* # of cache dropped
+ * adresses */
+/*
+ * Bridge current operational parameters structure.
+ */
+struct ifbropreq {
+ uint8_t ifbop_maxage;
+ uint8_t ifbop_hellotime;
+ uint8_t ifbop_fwddelay;
+ uint16_t ifbop_root_port;
+ uint32_t ifbop_root_path_cost;
+ uint64_t ifbop_designated_root;
+ struct timeval ifbop_last_tc_time;
+};
+
+/*
+ * Bridge member operational STP params structure.
+ */
+struct ifbpstpreq {
+ uint8_t ifbp_portno; /* bp STP port number */
+ uint32_t ifbp_fwd_trans; /* bp STP fwd transitions */
+ uint32_t ifbp_design_cost; /* bp STP designated cost */
+ uint32_t ifbp_design_port; /* bp STP designated port */
+ uint64_t ifbp_design_bridge; /* bp STP designated bridge */
+ uint64_t ifbp_design_root; /* bp STP designated root */
+};
+
+/*
+ * Bridge STP ports list structure.
+ */
+struct ifbpstpconf {
+ uint32_t ifbpstp_len; /* buffer size */
+ union {
+ caddr_t ifbpstpu_buf;
+ struct ifbpstpreq *ifbpstpu_req;
+ } ifbpstp_ifbpstpu;
+#define ifbpstp_buf ifbpstp_ifbpstpu.ifbpstpu_buf
+#define ifbpstp_req ifbpstp_ifbpstpu.ifbpstpu_req
+};
#ifdef _KERNEL
==== //depot/projects/smpng/sys/nfsserver/nfs.h#18 (text+ko) ====
@@ -30,7 +30,7 @@
* SUCH DAMAGE.
*
* @(#)nfs.h 8.4 (Berkeley) 5/1/95
- * $FreeBSD: src/sys/nfsserver/nfs.h,v 1.79 2006/01/28 19:24:39 csjp Exp $
+ * $FreeBSD: src/sys/nfsserver/nfs.h,v 1.80 2006/08/01 16:27:14 jhb Exp $
*/
#ifndef _NFSSERVER_NFS_H_
@@ -337,6 +337,7 @@
void nfsm_adj(struct mbuf *, int, int);
int nfsm_mbuftouio(struct mbuf **, struct uio *, int, caddr_t *);
void nfsrv_initcache(void);
+void nfsrv_destroycache(void);
void nfsrv_timer(void *);
int nfsrv_dorec(struct nfssvc_sock *, struct nfsd *,
struct nfsrv_descript **);
==== //depot/projects/smpng/sys/nfsserver/nfs_srvcache.c#13 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsserver/nfs_srvcache.c,v 1.41 2006/06/23 00:42:26 mohans Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsserver/nfs_srvcache.c,v 1.43 2006/08/01 16:27:14 jhb Exp $");
/*
* Reference: Chet Juszczak, "Improving the Performance and Correctness
@@ -65,6 +65,7 @@
static LIST_HEAD(nfsrvhash, nfsrvcache) *nfsrvhashtbl;
static TAILQ_HEAD(nfsrvlru, nfsrvcache) nfsrvlruhead;
static u_long nfsrvhash;
+static eventhandler_tag nfsrv_nmbclusters_tag;
#define TRUE 1
#define FALSE 0
@@ -147,8 +148,19 @@
nfsrvcache_size_change(NULL);
nfsrvhashtbl = hashinit(desirednfsrvcache, M_NFSD, &nfsrvhash);
TAILQ_INIT(&nfsrvlruhead);
- EVENTHANDLER_REGISTER(nmbclusters_change, nfsrvcache_size_change, NULL,
- EVENTHANDLER_PRI_FIRST);
+ nfsrv_nmbclusters_tag = EVENTHANDLER_REGISTER(nmbclusters_change,
+ nfsrvcache_size_change, NULL, EVENTHANDLER_PRI_FIRST);
+}
+
+/*
+ * Teardown the server request cache list
+ */
+void
+nfsrv_destroycache(void)
+{
+ KASSERT(TAILQ_EMPTY(&nfsrvlruhead), ("%s: pending requests", __func__));
+ EVENTHANDLER_DEREGISTER(nmbclusters_change, nfsrv_nmbclusters_tag);
+ hashdestroy(nfsrvhashtbl, M_NFSD, nfsrvhash);
}
/*
@@ -360,8 +372,7 @@
NFSD_LOCK_ASSERT();
- for (rp = TAILQ_FIRST(&nfsrvlruhead); rp != 0; rp = nextrp) {
- nextrp = TAILQ_NEXT(rp, rc_lru);
+ TAILQ_FOREACH_SAFE(rp, &nfsrvlruhead, rc_lru, nextrp) {
LIST_REMOVE(rp, rc_hash);
TAILQ_REMOVE(&nfsrvlruhead, rp, rc_lru);
if (rp->rc_flag & RC_REPMBUF)
==== //depot/projects/smpng/sys/nfsserver/nfs_srvsubs.c#34 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsserver/nfs_srvsubs.c,v 1.142 2006/07/28 19:05:28 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsserver/nfs_srvsubs.c,v 1.143 2006/08/01 16:27:14 jhb Exp $");
/*
* These functions support the macros and help fiddle mbuf chains for
@@ -569,8 +569,9 @@
break;
}
- callout_stop(&nfsrv_callout);
+ callout_drain(&nfsrv_callout);
syscall_deregister(&nfssvc_offset, &nfssvc_prev_sysent);
+ nfsrv_destroycache(); /* Free the server request cache */
mtx_destroy(&nfsd_mtx);
break;
default:
==== //depot/projects/smpng/sys/nfsserver/nfs_syscalls.c#28 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsserver/nfs_syscalls.c,v 1.105 2006/01/28 19:24:40 csjp Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsserver/nfs_syscalls.c,v 1.106 2006/08/01 15:32:25 jhb Exp $");
#include "opt_inet6.h"
#include "opt_mac.h"
@@ -720,9 +720,7 @@
panic("nfsd init");
nfssvc_sockhead_flag |= SLP_INIT;
if (terminating) {
- for (slp = TAILQ_FIRST(&nfssvc_sockhead); slp != NULL;
- slp = nslp) {
- nslp = TAILQ_NEXT(slp, ns_chain);
+ TAILQ_FOREACH_SAFE(slp, &nfssvc_sockhead, ns_chain, nslp) {
if (slp->ns_flag & SLP_VALID)
nfsrv_zapsock(slp);
TAILQ_REMOVE(&nfssvc_sockhead, slp, ns_chain);
==== //depot/projects/smpng/sys/sys/kernel.h#34 (text+ko) ====
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* @(#)kernel.h 8.3 (Berkeley) 1/21/94
- * $FreeBSD: src/sys/sys/kernel.h,v 1.130 2006/05/26 10:23:05 phk Exp $
+ * $FreeBSD: src/sys/sys/kernel.h,v 1.131 2006/08/01 16:32:20 jhb Exp $
*/
#ifndef _SYS_KERNEL_H_
@@ -157,6 +157,7 @@
SI_SUB_MOUNT_ROOT = 0xb400000, /* root mount*/
SI_SUB_SWAP = 0xc000000, /* swap */
SI_SUB_INTRINSIC_POST = 0xd000000, /* proc 0 cleanup*/
+ SI_SUB_SYSCALLS = 0xd800000, /* register system calls */
SI_SUB_KTHREAD_INIT = 0xe000000, /* init process*/
SI_SUB_KTHREAD_PAGE = 0xe400000, /* pageout daemon*/
SI_SUB_KTHREAD_VM = 0xe800000, /* vm daemon*/
==== //depot/projects/smpng/sys/sys/socketvar.h#54 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)socketvar.h 8.3 (Berkeley) 2/19/95
- * $FreeBSD: src/sys/sys/socketvar.h,v 1.153 2006/07/24 15:20:08 rwatson Exp $
+ * $FreeBSD: src/sys/sys/socketvar.h,v 1.154 2006/08/01 10:30:26 rwatson Exp $
*/
#ifndef _SYS_SOCKETVAR_H_
@@ -477,6 +477,7 @@
void sbcompress(struct sockbuf *sb, struct mbuf *m, struct mbuf *n);
struct mbuf *
sbcreatecontrol(caddr_t p, int size, int type, int level);
+void sbdestroy(struct sockbuf *sb, struct socket *so);
void sbdrop(struct sockbuf *sb, int len);
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list