PERFORCE change 33879 for review

Marcel Moolenaar marcel at FreeBSD.org
Sun Jun 29 22:31:52 PDT 2003


http://perforce.freebsd.org/chv.cgi?CH=33879

Change 33879 by marcel at marcel_nfs on 2003/06/29 22:31:43

	IFC @33872

Affected files ...

.. //depot/projects/uart/alpha/alpha/pmap.c#2 integrate
.. //depot/projects/uart/amd64/amd64/pmap.c#2 integrate
.. //depot/projects/uart/boot/common/loader.8#2 integrate
.. //depot/projects/uart/boot/i386/kgzldr/Makefile#2 integrate
.. //depot/projects/uart/boot/pc98/kgzldr/Makefile#2 integrate
.. //depot/projects/uart/dev/wi/if_wi.c#2 integrate
.. //depot/projects/uart/i386/i386/pmap.c#2 integrate
.. //depot/projects/uart/ia64/ia64/pmap.c#3 integrate
.. //depot/projects/uart/net80211/ieee80211.c#2 integrate
.. //depot/projects/uart/net80211/ieee80211_ioctl.c#2 integrate
.. //depot/projects/uart/net80211/ieee80211_node.c#2 integrate
.. //depot/projects/uart/netipsec/ipsec.c#2 integrate
.. //depot/projects/uart/netipsec/key.c#2 integrate
.. //depot/projects/uart/powerpc/powerpc/pmap.c#2 integrate
.. //depot/projects/uart/sparc64/sparc64/pmap.c#2 integrate
.. //depot/projects/uart/vm/pmap.h#2 integrate
.. //depot/projects/uart/vm/vm_map.c#2 integrate
.. //depot/projects/uart/vm/vm_map.h#2 integrate
.. //depot/projects/uart/vm/vm_pageout.c#2 integrate

Differences ...

==== //depot/projects/uart/alpha/alpha/pmap.c#2 (text+ko) ====

@@ -148,7 +148,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.127 2003/06/28 21:21:04 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/alpha/pmap.c,v 1.128 2003/06/29 21:20:02 alc Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -330,8 +330,6 @@
 static void	alpha_protection_init(void);
 static void	pmap_changebit(vm_page_t m, int bit, boolean_t setem);
 
-static vm_page_t pmap_enter_quick(pmap_t pmap, vm_offset_t va,
-				      vm_page_t m, vm_page_t mpte);
 static int pmap_remove_pte(pmap_t pmap, pt_entry_t* ptq, vm_offset_t sva);
 static void pmap_remove_page(struct pmap *pmap, vm_offset_t va);
 static int pmap_remove_entry(struct pmap *pmap, vm_page_t m, vm_offset_t va);
@@ -1973,7 +1971,7 @@
  * but is *MUCH* faster than pmap_enter...
  */
 
-static vm_page_t
+vm_page_t
 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
 {
 	register pt_entry_t *pte;

==== //depot/projects/uart/amd64/amd64/pmap.c#2 (text+ko) ====

@@ -39,7 +39,7 @@
  * SUCH DAMAGE.
  *
  *	from:	@(#)pmap.c	7.7 (Berkeley)	5/12/91
- * $FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.417 2003/06/26 01:04:31 peter Exp $
+ * $FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.418 2003/06/29 21:20:03 alc Exp $
  */
 /*-
  * Copyright (c) 2003 Networks Associates Technology, Inc.
@@ -208,8 +208,6 @@
 static void	amd64_protection_init(void);
 static __inline void	pmap_changebit(vm_page_t m, int bit, boolean_t setem);
 
-static vm_page_t pmap_enter_quick(pmap_t pmap, vm_offset_t va,
-				      vm_page_t m, vm_page_t mpte);
 static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva);
 static void pmap_remove_page(struct pmap *pmap, vm_offset_t va);
 static int pmap_remove_entry(struct pmap *pmap, vm_page_t m,
@@ -1951,7 +1949,7 @@
  * but is *MUCH* faster than pmap_enter...
  */
 
-static vm_page_t
+vm_page_t
 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
 {
 	pt_entry_t *pte;

==== //depot/projects/uart/boot/common/loader.8#2 (text+ko) ====

@@ -22,7 +22,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.\" $FreeBSD: src/sys/boot/common/loader.8,v 1.56 2003/05/17 22:17:23 ru Exp $
+.\" $FreeBSD: src/sys/boot/common/loader.8,v 1.57 2003/06/29 20:57:55 brueffer Exp $
 .\"
 .\" Note: The date here should be updated whenever a non-trivial
 .\" change is made to the manual page.
@@ -57,7 +57,7 @@
 The main drive behind these commands is user-friendliness.
 The bigger component is an
 .Tn ANS
-Forth compatible Forth interpreter based on ficl, by
+Forth compatible Forth interpreter based on FICL, by
 .An John Sadler .
 .Pp
 During initialization,

==== //depot/projects/uart/boot/i386/kgzldr/Makefile#2 (text+ko) ====

@@ -1,25 +1,19 @@
-# $FreeBSD: src/sys/boot/i386/kgzldr/Makefile,v 1.15 2003/06/07 17:42:26 obrien Exp $
+# $FreeBSD: src/sys/boot/i386/kgzldr/Makefile,v 1.16 2003/06/30 00:15:38 ru Exp $
 
-SRCS=	boot.c inflate.c lib.c
+SRCS=	start.s boot.c inflate.c lib.c crt.s sio.s
 OBJS=	${SRCS:N*.h:R:S/$/.o/g}
 CFLAGS=	-ffreestanding
 CFLAGS+=-Os
 CFLAGS+=-DKZIP
-LDFLAGS=-nostdlib -static -r
+LDFLAGS=-nostdlib -static -Wl,-r
 .PATH:	${.CURDIR}/../../../kern
 
-.for asm in start crt sio
-OBJS+=	${asm}.o
-${asm}.o: ${asm}.s
-	${AS} ${AFLAGS} -o ${.TARGET} ${.ALLSRC:M*${asm}*}
-.endfor
-
 CLEANFILES=kgzldr.o
 
 BOOT_COMCONSOLE_PORT?=	0x3f8
 AFLAGS+=--defsym SIO_PRT=${BOOT_COMCONSOLE_PORT}
 
-all: ${OBJS} kgzldr.o
+all: kgzldr.o
 
 kgzldr.o: ${OBJS}
 	${CC} ${LDFLAGS} -o ${.TARGET} ${OBJS}
@@ -28,4 +22,4 @@
 	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
 	    kgzldr.o ${DESTDIR}${LIBDIR}
 
-.include <bsd.lib.mk>
+.include <bsd.prog.mk>

==== //depot/projects/uart/boot/pc98/kgzldr/Makefile#2 (text+ko) ====

@@ -1,28 +1,22 @@
-# $FreeBSD: src/sys/boot/pc98/kgzldr/Makefile,v 1.9 2003/06/07 17:42:26 obrien Exp $
+# $FreeBSD: src/sys/boot/pc98/kgzldr/Makefile,v 1.10 2003/06/30 00:20:28 ru Exp $
 
-SRCS=	boot.c inflate.c lib.c
+SRCS=	start.s boot.c inflate.c lib.c crt.s sio.s
 OBJS=	${SRCS:N*.h:R:S/$/.o/g}
 CFLAGS=	-ffreestanding
 CFLAGS+=-Os
 CFLAGS+=-DKZIP
-LDFLAGS=-nostdlib -static -r
+LDFLAGS=-nostdlib -static -Wl,-r
 .PATH:	${.CURDIR}/../../../kern
 
 .PATH:	${.CURDIR}/../../i386/kgzldr
 AFLAGS+=--defsym PC98=1
 
-.for asm in start crt sio
-OBJS+=	${asm}.o
-${asm}.o: ${asm}.s
-	${AS} ${AFLAGS} -o ${.TARGET} ${.ALLSRC:M*${asm}*}
-.endfor
-
 CLEANFILES=kgzldr.o
 
 BOOT_COMCONSOLE_PORT?=	0x238
 AFLAGS+=--defsym SIO_PRT=${BOOT_COMCONSOLE_PORT}
 
-all: ${OBJS} kgzldr.o
+all: kgzldr.o
 
 kgzldr.o: ${OBJS}
 	${CC} ${LDFLAGS} -o ${.TARGET} ${OBJS}
@@ -31,4 +25,4 @@
 	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
 	    kgzldr.o ${DESTDIR}${LIBDIR}
 
-.include <bsd.lib.mk>
+.include <bsd.prog.mk>

==== //depot/projects/uart/dev/wi/if_wi.c#2 (text+ko) ====

@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/wi/if_wi.c,v 1.144 2003/06/28 06:17:26 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/wi/if_wi.c,v 1.145 2003/06/29 20:14:35 sam Exp $");
 
 #define WI_HERMES_AUTOINC_WAR	/* Work around data write autoinc bug. */
 #define WI_HERMES_STATS_WAR	/* Work around stats counter bug. */
@@ -347,6 +347,10 @@
 			ic->ic_channels[val].ic_flags != 0,
 			("wi_attach: invalid own channel %u!", val));
 		ic->ic_ibss_chan = &ic->ic_channels[val];
+	} else {
+		device_printf(dev,
+			"WI_RID_OWN_CHNL failed, using first channel!\n");
+		ic->ic_ibss_chan = &ic->ic_channels[0];
 	}
 
 	/*

==== //depot/projects/uart/i386/i386/pmap.c#2 (text+ko) ====

@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.413 2003/06/27 22:39:13 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/i386/pmap.c,v 1.414 2003/06/29 21:20:03 alc Exp $");
 /*-
  * Copyright (c) 2003 Networks Associates Technology, Inc.
  * All rights reserved.
@@ -243,8 +243,6 @@
 static void	i386_protection_init(void);
 static __inline void	pmap_changebit(vm_page_t m, int bit, boolean_t setem);
 
-static vm_page_t pmap_enter_quick(pmap_t pmap, vm_offset_t va,
-				      vm_page_t m, vm_page_t mpte);
 static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva);
 static void pmap_remove_page(struct pmap *pmap, vm_offset_t va);
 static int pmap_remove_entry(struct pmap *pmap, vm_page_t m,
@@ -2090,7 +2088,7 @@
  * but is *MUCH* faster than pmap_enter...
  */
 
-static vm_page_t
+vm_page_t
 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
 {
 	pt_entry_t *pte;

==== //depot/projects/uart/ia64/ia64/pmap.c#3 (text+ko) ====

@@ -43,7 +43,7 @@
  *	from:	@(#)pmap.c	7.7 (Berkeley)	5/12/91
  *	from:	i386 Id: pmap.c,v 1.193 1998/04/19 15:22:48 bde Exp
  *		with some ideas from NetBSD's alpha pmap
- * $FreeBSD: src/sys/ia64/ia64/pmap.c,v 1.112 2003/06/29 06:10:32 alc Exp $
+ * $FreeBSD: src/sys/ia64/ia64/pmap.c,v 1.113 2003/06/29 21:20:03 alc Exp $
  */
 
 /*
@@ -267,7 +267,6 @@
 
 static pmap_t	pmap_install(pmap_t);
 static void	pmap_invalidate_all(pmap_t pmap);
-static void	pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m);
 
 vm_offset_t
 pmap_steal_memory(vm_size_t size)
@@ -1709,8 +1708,8 @@
  * but is *MUCH* faster than pmap_enter...
  */
 
-static void
-pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
+vm_page_t
+pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
 {
 	struct ia64_lpte *pte;
 	pmap_t oldpmap;
@@ -1719,7 +1718,7 @@
 
 	pte = pmap_find_pte(va);
 	if (pte->pte_p)
-		return;
+		goto reinstall;
 
 	/*
 	 * Enter on the PV list since its part of our managed memory.
@@ -1737,8 +1736,9 @@
 	pmap_set_pte(pte, va, VM_PAGE_TO_PHYS(m),
 		     PTE_IG_MANAGED,
 		     PTE_PL_USER, PTE_AR_R);
-
+reinstall:
 	pmap_install(oldpmap);
+	return (NULL);
 }
 
 /*
@@ -1821,7 +1821,8 @@
 				vm_page_unlock_queues();
 				VM_OBJECT_UNLOCK(object);
 				pmap_enter_quick(pmap,
-						 addr + ia64_ptob(tmpidx), p);
+						 addr + ia64_ptob(tmpidx), p,
+						 NULL);
 				VM_OBJECT_LOCK(object);
 				vm_page_lock_queues();
 				vm_page_wakeup(p);
@@ -1855,7 +1856,8 @@
 				vm_page_unlock_queues();
 				VM_OBJECT_UNLOCK(object);
 				pmap_enter_quick(pmap,
-						 addr + ia64_ptob(tmpidx), p);
+						 addr + ia64_ptob(tmpidx), p,
+						 NULL);
 				VM_OBJECT_LOCK(object);
 				vm_page_lock_queues();
 				vm_page_wakeup(p);
@@ -1951,7 +1953,7 @@
 			}
 			vm_page_busy(m);
 			vm_page_unlock_queues();
-			pmap_enter_quick(pmap, addr, m);
+			pmap_enter_quick(pmap, addr, m, NULL);
 			vm_page_lock_queues();
 			vm_page_wakeup(m);
 		}

==== //depot/projects/uart/net80211/ieee80211.c#2 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/net80211/ieee80211.c,v 1.3 2003/06/27 05:13:52 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/net80211/ieee80211.c,v 1.4 2003/06/29 20:10:54 sam Exp $");
 
 /*
  * IEEE 802.11 generic handler
@@ -197,10 +197,13 @@
 		return c - ic->ic_channels;
 	else if (c == IEEE80211_CHAN_ANYC)
 		return IEEE80211_CHAN_ANY;
-	else {
+	else if (c != NULL) {
 		if_printf(&ic->ic_if, "invalid channel freq %u flags %x\n",
 			c->ic_freq, c->ic_flags);
 		return 0;		/* XXX */
+	} else {
+		if_printf(&ic->ic_if, "invalid channel (NULL)\n");
+		return 0;		/* XXX */
 	}
 }
 

==== //depot/projects/uart/net80211/ieee80211_ioctl.c#2 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_ioctl.c,v 1.2 2003/06/27 05:13:52 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_ioctl.c,v 1.3 2003/06/29 20:12:17 sam Exp $");
 
 /*
  * IEEE 802.11 ioctl support (FreeBSD-specific)
@@ -404,7 +404,7 @@
 		}
 		memset(ic->ic_des_essid, 0, sizeof(ic->ic_des_essid));
 		ic->ic_des_esslen = le16toh(wreq.wi_val[0]) * 2;
-		memcpy(ic->ic_des_essid, &wreq.wi_val[1], len);
+		memcpy(ic->ic_des_essid, &wreq.wi_val[1], ic->ic_des_esslen);
 		error = ENETRESET;
 		break;
 	case WI_RID_CURRENT_BSSID:

==== //depot/projects/uart/net80211/ieee80211_node.c#2 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_node.c,v 1.2 2003/06/27 05:13:52 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_node.c,v 1.3 2003/06/29 20:13:38 sam Exp $");
 
 #include "opt_inet.h"
 
@@ -87,7 +87,8 @@
 	ic->ic_node_free = ieee80211_node_free;
 	ic->ic_node_copy = ieee80211_node_copy;
 	ic->ic_bss = (*ic->ic_node_alloc)(ic);
-	/* XXX KASSERT != NULL? */
+	KASSERT(ic->ic_bss != NULL, ("unable to setup inital BSS node"));
+	ic->ic_bss->ni_chan = IEEE80211_CHAN_ANYC;
 }
 
 void

==== //depot/projects/uart/netipsec/ipsec.c#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netipsec/ipsec.c,v 1.4 2003/02/28 20:06:29 sam Exp $	*/
+/*	$FreeBSD: src/sys/netipsec/ipsec.c,v 1.5 2003/06/29 23:58:38 sam Exp $	*/
 /*	$KAME: ipsec.c,v 1.103 2001/05/24 07:14:18 sakane Exp $	*/
 
 /*
@@ -1922,6 +1922,8 @@
 {
 	struct xformsw *xsp;
 
+	if (sav->tdb_xform != NULL)	/* previously initialized */
+		return 0;
 	for (xsp = xforms; xsp; xsp = xsp->xf_next)
 		if (xsp->xf_type == xftype)
 			return (*xsp->xf_init)(sav, xsp);

==== //depot/projects/uart/netipsec/key.c#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netipsec/key.c,v 1.5 2003/02/19 05:47:36 imp Exp $	*/
+/*	$FreeBSD: src/sys/netipsec/key.c,v 1.6 2003/06/29 23:58:38 sam Exp $	*/
 /*	$KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $	*/
 
 /*
@@ -2751,13 +2751,24 @@
 	if (__LIST_CHAINED(sav))
 		LIST_REMOVE(sav, chain);
 
+	/*
+	 * Cleanup xform state.  Note that zeroize'ing causes the
+	 * keys to be cleared; otherwise we must do it ourself.
+	 */
+	if (sav->tdb_xform != NULL) {
+		sav->tdb_xform->xf_zeroize(sav);
+		sav->tdb_xform = NULL;
+	} else {
+		if (sav->key_auth != NULL)
+			bzero(_KEYBUF(sav->key_auth), _KEYLEN(sav->key_auth));
+		if (sav->key_enc != NULL)
+			bzero(_KEYBUF(sav->key_enc), _KEYLEN(sav->key_enc));
+	}
 	if (sav->key_auth != NULL) {
-		bzero(_KEYBUF(sav->key_auth), _KEYLEN(sav->key_auth));
 		KFREE(sav->key_auth);
 		sav->key_auth = NULL;
 	}
 	if (sav->key_enc != NULL) {
-		bzero(_KEYBUF(sav->key_enc), _KEYLEN(sav->key_enc));
 		KFREE(sav->key_enc);
 		sav->key_enc = NULL;
 	}

==== //depot/projects/uart/powerpc/powerpc/pmap.c#2 (text+ko) ====

@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/powerpc/powerpc/pmap.c,v 1.57 2003/06/14 23:23:54 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/powerpc/powerpc/pmap.c,v 1.58 2003/06/29 21:20:04 alc Exp $");
 
 /*
  * Manages physical address maps.
@@ -1032,6 +1032,14 @@
 	pmap_syncicache(VM_PAGE_TO_PHYS(m), PAGE_SIZE);
 }
 
+vm_page_t
+pmap_enter_quick(pmap_t pm, vm_offset_t va, vm_page_t m, vm_page_t mpte)
+{
+
+	pmap_enter(pm, va, m, VM_PROT_READ | VM_PROT_EXECUTE, FALSE);
+	return (NULL);
+}
+
 vm_offset_t
 pmap_extract(pmap_t pm, vm_offset_t va)
 {

==== //depot/projects/uart/sparc64/sparc64/pmap.c#2 (text+ko) ====

@@ -39,7 +39,7 @@
  * SUCH DAMAGE.
  *
  *      from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
- * $FreeBSD: src/sys/sparc64/sparc64/pmap.c,v 1.115 2003/06/18 17:03:04 jake Exp $
+ * $FreeBSD: src/sys/sparc64/sparc64/pmap.c,v 1.116 2003/06/29 21:20:04 alc Exp $
  */
 
 /*
@@ -1331,6 +1331,14 @@
 	}
 }
 
+vm_page_t
+pmap_enter_quick(pmap_t pm, vm_offset_t va, vm_page_t m, vm_page_t mpte)
+{
+
+	pmap_enter(pm, va, m, VM_PROT_READ | VM_PROT_EXECUTE, FALSE);
+	return (NULL);
+}
+
 void
 pmap_object_init_pt(pmap_t pm, vm_offset_t addr, vm_object_t object,
 		    vm_pindex_t pindex, vm_size_t size, int limit)

==== //depot/projects/uart/vm/pmap.h#2 (text+ko) ====

@@ -61,7 +61,7 @@
  * any improvements or extensions that they make and grant Carnegie the
  * rights to redistribute these changes.
  *
- * $FreeBSD: src/sys/vm/pmap.h,v 1.59 2003/06/14 23:23:55 alc Exp $
+ * $FreeBSD: src/sys/vm/pmap.h,v 1.60 2003/06/29 21:20:04 alc Exp $
  */
 
 /*
@@ -103,6 +103,8 @@
 void		 pmap_copy_page(vm_page_t, vm_page_t);
 void		 pmap_enter(pmap_t, vm_offset_t, vm_page_t, vm_prot_t,
 		    boolean_t);
+vm_page_t	 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m,
+		    vm_page_t mpte);
 vm_paddr_t	 pmap_extract(pmap_t pmap, vm_offset_t va);
 void		 pmap_growkernel(vm_offset_t);
 void		 pmap_init(vm_paddr_t, vm_paddr_t);
@@ -110,7 +112,7 @@
 boolean_t	 pmap_ts_referenced(vm_page_t m);
 vm_offset_t	 pmap_map(vm_offset_t *, vm_paddr_t, vm_paddr_t, int);
 void		 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
-		    vm_object_t object, vm_pindex_t pindex, vm_offset_t size,
+		    vm_object_t object, vm_pindex_t pindex, vm_size_t size,
 		    int pagelimit);
 boolean_t	 pmap_page_exists_quick(pmap_t pmap, vm_page_t m);
 void		 pmap_page_protect(vm_page_t m, vm_prot_t prot);

==== //depot/projects/uart/vm/vm_map.c#2 (text+ko) ====

@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.300 2003/06/27 18:52:49 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.301 2003/06/29 23:32:55 alc Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -911,11 +911,9 @@
 #endif
 
 	if (cow & (MAP_PREFAULT|MAP_PREFAULT_PARTIAL)) {
-		mtx_lock(&Giant);
-		pmap_object_init_pt(map->pmap, start,
+		vm_map_pmap_enter(map, start,
 				    object, OFF_TO_IDX(offset), end - start,
 				    cow & MAP_PREFAULT_PARTIAL);
-		mtx_unlock(&Giant);
 	}
 
 	return (KERN_SUCCESS);
@@ -1272,6 +1270,23 @@
 }
 
 /*
+ *	vm_map_pmap_enter:
+ *
+ *	Preload the mappings for the given object into the specified
+ *	map.  This eliminates the soft faults on process startup and
+ *	immediately after an mmap(2).
+ */
+void
+vm_map_pmap_enter(vm_map_t map, vm_offset_t addr,
+    vm_object_t object, vm_pindex_t pindex, vm_size_t size, int flags)
+{
+
+	mtx_lock(&Giant);
+	pmap_object_init_pt(map->pmap, addr, object, pindex, size, flags);
+	mtx_unlock(&Giant);
+}
+
+/*
  *	vm_map_protect:
  *
  *	Sets the protection of the specified address
@@ -1491,16 +1506,13 @@
 			vm_object_madvise(current->object.vm_object,
 					  pindex, count, behav);
 			if (behav == MADV_WILLNEED) {
-				mtx_lock(&Giant);
-				pmap_object_init_pt(
-				    map->pmap, 
+				vm_map_pmap_enter(map, 
 				    useStart,
 				    current->object.vm_object,
 				    pindex, 
 				    (count << PAGE_SHIFT),
 				    MAP_PREFAULT_MADVISE
 				);
-				mtx_unlock(&Giant);
 			}
 		}
 		vm_map_unlock_read(map);

==== //depot/projects/uart/vm/vm_map.h#2 (text+ko) ====

@@ -61,7 +61,7 @@
  * any improvements or extensions that they make and grant Carnegie the
  * rights to redistribute these changes.
  *
- * $FreeBSD: src/sys/vm/vm_map.h,v 1.98 2003/06/15 07:28:33 alc Exp $
+ * $FreeBSD: src/sys/vm/vm_map.h,v 1.99 2003/06/29 23:32:55 alc Exp $
  */
 
 /*
@@ -310,6 +310,8 @@
 void vm_map_lookup_done (vm_map_t, vm_map_entry_t);
 boolean_t vm_map_lookup_entry (vm_map_t, vm_offset_t, vm_map_entry_t *);
 int vm_map_clean (vm_map_t, vm_offset_t, vm_offset_t, boolean_t, boolean_t);
+void vm_map_pmap_enter(vm_map_t map, vm_offset_t addr,
+    vm_object_t object, vm_pindex_t pindex, vm_size_t size, int flags);
 int vm_map_protect (vm_map_t, vm_offset_t, vm_offset_t, vm_prot_t, boolean_t);
 int vm_map_remove (vm_map_t, vm_offset_t, vm_offset_t);
 void vm_map_startup (void);

==== //depot/projects/uart/vm/vm_pageout.c#2 (text+ko) ====

@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/vm/vm_pageout.c,v 1.237 2003/06/28 20:07:54 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/vm/vm_pageout.c,v 1.238 2003/06/29 19:51:24 alc Exp $");
 
 #include "opt_vm.h"
 #include <sys/param.h>
@@ -472,7 +472,7 @@
 	vm_page_t p, next;
 	int actcount, rcount, remove_mode;
 
-	GIANT_REQUIRED;
+	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
 	if (object->type == OBJT_DEVICE || object->type == OBJT_PHYS)
 		return;
 
@@ -556,7 +556,6 @@
 	vm_object_t obj, bigobj;
 	int nothingwired;
 
-	GIANT_REQUIRED;
 	if (!vm_map_trylock(map))
 		return;
 
@@ -571,10 +570,15 @@
 	while (tmpe != &map->header) {
 		if ((tmpe->eflags & MAP_ENTRY_IS_SUB_MAP) == 0) {
 			obj = tmpe->object.vm_object;
-			if ((obj != NULL) && (obj->shadow_count <= 1) &&
-				((bigobj == NULL) ||
-				 (bigobj->resident_page_count < obj->resident_page_count))) {
-				bigobj = obj;
+			if (obj != NULL && VM_OBJECT_TRYLOCK(obj)) {
+				if (obj->shadow_count <= 1 &&
+				    (bigobj == NULL ||
+				     bigobj->resident_page_count < obj->resident_page_count)) {
+					if (bigobj != NULL)
+						VM_OBJECT_UNLOCK(bigobj);
+					bigobj = obj;
+				} else
+					VM_OBJECT_UNLOCK(obj);
 			}
 		}
 		if (tmpe->wired_count > 0)
@@ -582,9 +586,10 @@
 		tmpe = tmpe->next;
 	}
 
-	if (bigobj)
+	if (bigobj != NULL) {
 		vm_pageout_object_deactivate_pages(map, bigobj, desired);
-
+		VM_OBJECT_UNLOCK(bigobj);
+	}
 	/*
 	 * Next, hunt around for other pages to deactivate.  We actually
 	 * do this search sort of wrong -- .text first is not the best idea.
@@ -595,8 +600,11 @@
 			break;
 		if ((tmpe->eflags & MAP_ENTRY_IS_SUB_MAP) == 0) {
 			obj = tmpe->object.vm_object;
-			if (obj)
+			if (obj != NULL) {
+				VM_OBJECT_LOCK(obj);
 				vm_pageout_object_deactivate_pages(map, obj, desired);
+				VM_OBJECT_UNLOCK(obj);
+			}
 		}
 		tmpe = tmpe->next;
 	}
@@ -606,6 +614,7 @@
 	 * table pages.
 	 */
 	if (desired == 0 && nothingwired) {
+		GIANT_REQUIRED;
 		vm_page_lock_queues();
 		pmap_remove(vm_map_pmap(map), vm_map_min(map),
 		    vm_map_max(map));


More information about the p4-projects mailing list