From owner-svn-src-user@FreeBSD.ORG  Sun May  9 06:52:32 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id CE9E6106566B;
	Sun,  9 May 2010 06:52:32 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44])
	by mx1.freebsd.org (Postfix) with ESMTP id BAA9A8FC0C;
	Sun,  9 May 2010 06:52:32 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o496qWZ2057770;
	Sun, 9 May 2010 06:52:32 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o496qWYW057748;
	Sun, 9 May 2010 06:52:32 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201005090652.o496qWYW057748@svn.freebsd.org>
From: Warner Losh <imp@FreeBSD.org>
Date: Sun, 9 May 2010 06:52:32 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207810 - in user/imp/masq/sys: amd64/amd64
	amd64/include amd64/include/xen arm/arm arm/at91 arm/include
	arm/xscale/ixp425 boot/forth
	cddl/contrib/opensolaris/uts/common/fs/zfs cddl/con...
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 09 May 2010 06:52:32 -0000

Author: imp
Date: Sun May  9 06:52:32 2010
New Revision: 207810
URL: http://svn.freebsd.org/changeset/base/207810

Log:
  Merging r207550 through r207809

Modified:
  user/imp/masq/sys/amd64/amd64/exception.S
  user/imp/masq/sys/amd64/amd64/identcpu.c
  user/imp/masq/sys/amd64/amd64/pmap.c
  user/imp/masq/sys/amd64/include/specialreg.h
  user/imp/masq/sys/amd64/include/xen/xenfunc.h
  user/imp/masq/sys/amd64/include/xen/xenvar.h
  user/imp/masq/sys/arm/arm/cpufunc.c
  user/imp/masq/sys/arm/arm/cpufunc_asm_fa526.S
  user/imp/masq/sys/arm/arm/elf_trampoline.c
  user/imp/masq/sys/arm/arm/identcpu.c
  user/imp/masq/sys/arm/arm/pmap.c
  user/imp/masq/sys/arm/at91/if_ate.c
  user/imp/masq/sys/arm/include/cpuconf.h
  user/imp/masq/sys/arm/include/cpufunc.h
  user/imp/masq/sys/arm/xscale/ixp425/if_npe.c
  user/imp/masq/sys/boot/forth/loader.conf
  user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
  user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c
  user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c
  user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
  user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_objset.h
  user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h
  user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_byteswap.c
  user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
  user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  user/imp/masq/sys/compat/linux/linux_ioctl.c
  user/imp/masq/sys/conf/options.arm
  user/imp/masq/sys/dev/ae/if_ae.c
  user/imp/masq/sys/dev/agp/agp.c
  user/imp/masq/sys/dev/agp/agp_i810.c
  user/imp/masq/sys/dev/an/if_an.c
  user/imp/masq/sys/dev/ath/if_ath.c
  user/imp/masq/sys/dev/bce/if_bce.c
  user/imp/masq/sys/dev/bwi/if_bwi.c
  user/imp/masq/sys/dev/bwn/if_bwn.c
  user/imp/masq/sys/dev/cas/if_cas.c
  user/imp/masq/sys/dev/cas/if_casreg.h
  user/imp/masq/sys/dev/ce/if_ce.c
  user/imp/masq/sys/dev/cm/smc90cx6.c
  user/imp/masq/sys/dev/cp/if_cp.c
  user/imp/masq/sys/dev/cs/if_cs.c
  user/imp/masq/sys/dev/ctau/if_ct.c
  user/imp/masq/sys/dev/cx/if_cx.c
  user/imp/masq/sys/dev/cxgb/cxgb_adapter.h
  user/imp/masq/sys/dev/cxgb/cxgb_ioctl.h
  user/imp/masq/sys/dev/cxgb/cxgb_main.c
  user/imp/masq/sys/dev/cxgb/cxgb_sge.c
  user/imp/masq/sys/dev/cxgb/sys/mvec.h
  user/imp/masq/sys/dev/cxgb/sys/uipc_mvec.c
  user/imp/masq/sys/dev/drm/via_dmablit.c
  user/imp/masq/sys/dev/ed/if_ed.c
  user/imp/masq/sys/dev/ep/if_ep.c
  user/imp/masq/sys/dev/ex/if_ex.c
  user/imp/masq/sys/dev/fe/if_fe.c
  user/imp/masq/sys/dev/fxp/if_fxp.c
  user/imp/masq/sys/dev/ie/if_ie.c
  user/imp/masq/sys/dev/iicbus/if_ic.c
  user/imp/masq/sys/dev/ipw/if_ipw.c
  user/imp/masq/sys/dev/isp/isp_pci.c
  user/imp/masq/sys/dev/isp/isp_sbus.c
  user/imp/masq/sys/dev/iwi/if_iwi.c
  user/imp/masq/sys/dev/iwn/if_iwn.c
  user/imp/masq/sys/dev/le/lance.c
  user/imp/masq/sys/dev/malo/if_malo.c
  user/imp/masq/sys/dev/md/md.c
  user/imp/masq/sys/dev/msk/if_msk.c
  user/imp/masq/sys/dev/mvs/mvs.c
  user/imp/masq/sys/dev/mwl/if_mwl.c
  user/imp/masq/sys/dev/mxge/if_mxge.c
  user/imp/masq/sys/dev/my/if_my.c
  user/imp/masq/sys/dev/nxge/if_nxge.c
  user/imp/masq/sys/dev/pdq/pdq_ifsubr.c
  user/imp/masq/sys/dev/ppbus/if_plip.c
  user/imp/masq/sys/dev/ral/rt2560.c
  user/imp/masq/sys/dev/ral/rt2661.c
  user/imp/masq/sys/dev/re/if_re.c
  user/imp/masq/sys/dev/sbni/if_sbni.c
  user/imp/masq/sys/dev/sge/if_sge.c
  user/imp/masq/sys/dev/sge/if_sgereg.h
  user/imp/masq/sys/dev/smc/if_smc.c
  user/imp/masq/sys/dev/sn/if_sn.c
  user/imp/masq/sys/dev/snc/dp83932.c
  user/imp/masq/sys/dev/sound/pcm/buffer.c
  user/imp/masq/sys/dev/sound/pcm/buffer.h
  user/imp/masq/sys/dev/ti/if_ti.c
  user/imp/masq/sys/dev/usb/net/uhso.c
  user/imp/masq/sys/dev/usb/net/usb_ethernet.c
  user/imp/masq/sys/dev/usb/wlan/if_rum.c
  user/imp/masq/sys/dev/usb/wlan/if_run.c
  user/imp/masq/sys/dev/usb/wlan/if_uath.c
  user/imp/masq/sys/dev/usb/wlan/if_upgt.c
  user/imp/masq/sys/dev/usb/wlan/if_ural.c
  user/imp/masq/sys/dev/usb/wlan/if_urtw.c
  user/imp/masq/sys/dev/usb/wlan/if_zyd.c
  user/imp/masq/sys/dev/vx/if_vx.c
  user/imp/masq/sys/dev/wi/if_wi.c
  user/imp/masq/sys/dev/wl/if_wl.c
  user/imp/masq/sys/dev/wpi/if_wpi.c
  user/imp/masq/sys/dev/xe/if_xe.c
  user/imp/masq/sys/dev/xen/netfront/netfront.c
  user/imp/masq/sys/fs/devfs/devfs_devs.c
  user/imp/masq/sys/fs/devfs/devfs_int.h
  user/imp/masq/sys/fs/ext2fs/ext2_readwrite.c
  user/imp/masq/sys/fs/ext2fs/ext2_vnops.c
  user/imp/masq/sys/fs/msdosfs/msdosfs_vnops.c
  user/imp/masq/sys/fs/nfs/nfs_commonkrpc.c
  user/imp/masq/sys/fs/nfs/nfskpiport.h
  user/imp/masq/sys/fs/nfs/nfsport.h
  user/imp/masq/sys/fs/nfsclient/nfs_clbio.c
  user/imp/masq/sys/fs/nwfs/nwfs_io.c
  user/imp/masq/sys/fs/smbfs/smbfs_io.c
  user/imp/masq/sys/fs/tmpfs/tmpfs_vnops.c
  user/imp/masq/sys/geom/geom.h
  user/imp/masq/sys/geom/geom_subr.c
  user/imp/masq/sys/geom/vinum/geom_vinum_var.h
  user/imp/masq/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c
  user/imp/masq/sys/i386/i386/identcpu.c
  user/imp/masq/sys/i386/i386/pmap.c
  user/imp/masq/sys/i386/include/specialreg.h
  user/imp/masq/sys/i386/include/xen/xenfunc.h
  user/imp/masq/sys/i386/include/xen/xenvar.h
  user/imp/masq/sys/i386/xen/pmap.c
  user/imp/masq/sys/ia64/ia64/pmap.c
  user/imp/masq/sys/kern/kern_conf.c
  user/imp/masq/sys/kern/kern_exec.c
  user/imp/masq/sys/kern/kern_proc.c
  user/imp/masq/sys/kern/kern_resource.c
  user/imp/masq/sys/kern/kern_thread.c
  user/imp/masq/sys/kern/subr_bufring.c
  user/imp/masq/sys/kern/subr_uio.c
  user/imp/masq/sys/kern/sys_pipe.c
  user/imp/masq/sys/kern/uipc_cow.c
  user/imp/masq/sys/kern/uipc_syscalls.c
  user/imp/masq/sys/kern/vfs_bio.c
  user/imp/masq/sys/kern/vfs_vnops.c
  user/imp/masq/sys/mips/adm5120/if_admsw.c
  user/imp/masq/sys/mips/atheros/if_arge.c
  user/imp/masq/sys/mips/include/pmap.h
  user/imp/masq/sys/mips/mips/db_trace.c
  user/imp/masq/sys/mips/mips/pmap.c
  user/imp/masq/sys/net/bpf_zerocopy.c
  user/imp/masq/sys/net/if.c
  user/imp/masq/sys/net/if_ef.c
  user/imp/masq/sys/net/if_gif.c
  user/imp/masq/sys/net/if_gre.c
  user/imp/masq/sys/net/if_stf.c
  user/imp/masq/sys/net80211/ieee80211.c
  user/imp/masq/sys/netgraph/ng_base.c
  user/imp/masq/sys/netgraph/ng_bridge.c
  user/imp/masq/sys/netgraph/ng_bridge.h
  user/imp/masq/sys/netgraph/ng_eiface.c
  user/imp/masq/sys/netgraph/ng_fec.c
  user/imp/masq/sys/netgraph/ng_hub.c
  user/imp/masq/sys/netgraph/ng_hub.h
  user/imp/masq/sys/netgraph/ng_iface.c
  user/imp/masq/sys/netgraph/ng_ksocket.c
  user/imp/masq/sys/netgraph/ng_tty.c
  user/imp/masq/sys/netipsec/key.c
  user/imp/masq/sys/nfsclient/nfs_bio.c
  user/imp/masq/sys/pci/if_rl.c
  user/imp/masq/sys/powerpc/aim/mmu_oea.c
  user/imp/masq/sys/powerpc/aim/mmu_oea64.c
  user/imp/masq/sys/powerpc/booke/pmap.c
  user/imp/masq/sys/security/audit/audit_bsm.c
  user/imp/masq/sys/sparc64/sparc64/pmap.c
  user/imp/masq/sys/sun4v/sun4v/pmap.c
  user/imp/masq/sys/sys/buf_ring.h
  user/imp/masq/sys/sys/conf.h
  user/imp/masq/sys/sys/mbuf.h
  user/imp/masq/sys/sys/proc.h
  user/imp/masq/sys/sys/resource.h
  user/imp/masq/sys/sys/resourcevar.h
  user/imp/masq/sys/sys/vmmeter.h
  user/imp/masq/sys/sys/vnode.h
  user/imp/masq/sys/ufs/ffs/ffs_snapshot.c
  user/imp/masq/sys/ufs/ffs/ffs_softdep.c
  user/imp/masq/sys/ufs/ffs/ffs_vnops.c
  user/imp/masq/sys/ufs/ufs/quota.h
  user/imp/masq/sys/ufs/ufs/ufs_quota.c
  user/imp/masq/sys/ufs/ufs/ufs_vfsops.c
  user/imp/masq/sys/ufs/ufs/ufsmount.h
  user/imp/masq/sys/vm/device_pager.c
  user/imp/masq/sys/vm/phys_pager.c
  user/imp/masq/sys/vm/sg_pager.c
  user/imp/masq/sys/vm/swap_pager.c
  user/imp/masq/sys/vm/uma_core.c
  user/imp/masq/sys/vm/vm_contig.c
  user/imp/masq/sys/vm/vm_fault.c
  user/imp/masq/sys/vm/vm_glue.c
  user/imp/masq/sys/vm/vm_kern.c
  user/imp/masq/sys/vm/vm_object.c
  user/imp/masq/sys/vm/vm_page.c
  user/imp/masq/sys/vm/vm_page.h
  user/imp/masq/sys/vm/vm_pageout.c
  user/imp/masq/sys/vm/vm_pageout.h
  user/imp/masq/sys/vm/vnode_pager.c
Directory Properties:
  user/imp/masq/sys/   (props changed)
  user/imp/masq/sys/amd64/include/xen/   (props changed)
  user/imp/masq/sys/cddl/contrib/opensolaris/   (props changed)
  user/imp/masq/sys/contrib/dev/acpica/   (props changed)
  user/imp/masq/sys/contrib/pf/   (props changed)
  user/imp/masq/sys/contrib/x86emu/   (props changed)
  user/imp/masq/sys/dev/xen/xenpci/   (props changed)

Modified: user/imp/masq/sys/amd64/amd64/exception.S
==============================================================================
--- user/imp/masq/sys/amd64/amd64/exception.S	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/amd64/amd64/exception.S	Sun May  9 06:52:32 2010	(r207810)
@@ -50,14 +50,14 @@
 	.bss
 	.globl	dtrace_invop_jump_addr
 	.align	8
-	.type	dtrace_invop_jump_addr, @object
-        .size	dtrace_invop_jump_addr, 8
+	.type	dtrace_invop_jump_addr,@object
+	.size	dtrace_invop_jump_addr,8
 dtrace_invop_jump_addr:
 	.zero	8
 	.globl	dtrace_invop_calltrap_addr
 	.align	8
-	.type	dtrace_invop_calltrap_addr, @object
-        .size	dtrace_invop_calltrap_addr, 8
+	.type	dtrace_invop_calltrap_addr,@object
+	.size	dtrace_invop_calltrap_addr,8
 dtrace_invop_calltrap_addr:
 	.zero	8
 #endif
@@ -157,7 +157,6 @@ IDTVEC(align)
 	 * kernel from userland.  Reenable interrupts if they were enabled
 	 * before the trap.  This approximates SDT_SYS386TGT on the i386 port.
 	 */
-
 	SUPERALIGN_TEXT
 	.globl	alltraps
 	.type	alltraps,@function
@@ -211,16 +210,16 @@ alltraps_pushregs_no_rdi:
 	 * Set our jump address for the jump back in the event that
 	 * the breakpoint wasn't caused by DTrace at all.
 	 */
-	movq	$calltrap, dtrace_invop_calltrap_addr(%rip)
+	movq	$calltrap,dtrace_invop_calltrap_addr(%rip)
 
 	/* Jump to the code hooked in by DTrace. */
-	movq	dtrace_invop_jump_addr, %rax
+	movq	dtrace_invop_jump_addr,%rax
 	jmpq	*dtrace_invop_jump_addr
 #endif
 	.globl	calltrap
 	.type	calltrap,@function
 calltrap:
-	movq	%rsp, %rdi
+	movq	%rsp,%rdi
 	call	trap
 	MEXITCOUNT
 	jmp	doreti			/* Handle any pending ASTs */
@@ -274,9 +273,11 @@ IDTVEC(dblfault)
 	testb	$SEL_RPL_MASK,TF_CS(%rsp) /* Did we come from kernel? */
 	jz	1f			/* already running with kernel GS.base */
 	swapgs
-1:	movq	%rsp, %rdi
+1:
+	movq	%rsp,%rdi
 	call	dblfault_handler
-2:	hlt
+2:
+	hlt
 	jmp	2b
 
 IDTVEC(page)
@@ -369,7 +370,7 @@ IDTVEC(fast_syscall)
 	movq	%r15,TF_R15(%rsp)	/* C preserved */
 	movl	$TF_HASSEGS,TF_FLAGS(%rsp)
 	FAKE_MCOUNT(TF_RIP(%rsp))
-	movq	%rsp, %rdi
+	movq	%rsp,%rdi
 	call	syscall
 	movq	PCPU(CURPCB),%rax
 	andq	$~PCB_FULLCTX,PCB_FLAGS(%rax)
@@ -456,7 +457,7 @@ nmi_fromuserspace:
 /* Note: this label is also used by ddb and gdb: */
 nmi_calltrap:
 	FAKE_MCOUNT(TF_RIP(%rsp))
-	movq	%rsp, %rdi
+	movq	%rsp,%rdi
 	call	trap
 	MEXITCOUNT
 #ifdef HWPMC_HOOKS
@@ -555,9 +556,9 @@ nmi_restoreregs:
 	iretq
 
 ENTRY(fork_trampoline)
-	movq	%r12, %rdi		/* function */
-	movq	%rbx, %rsi		/* arg1 */
-	movq	%rsp, %rdx		/* trapframe pointer */
+	movq	%r12,%rdi		/* function */
+	movq	%rbx,%rsi		/* arg1 */
+	movq	%rsp,%rdx		/* trapframe pointer */
 	call	fork_exit
 	MEXITCOUNT
 	jmp	doreti			/* Handle any ASTs */
@@ -628,7 +629,7 @@ doreti_ast:
 	testl	$TDF_ASTPENDING | TDF_NEEDRESCHED,TD_FLAGS(%rax)
 	je	doreti_exit
 	sti
-	movq	%rsp, %rdi			/* pass a pointer to the trapframe */
+	movq	%rsp,%rdi	/* pass a pointer to the trapframe */
 	call	ast
 	jmp	doreti_ast
 
@@ -648,8 +649,8 @@ doreti_exit:
 	 * Do not reload segment registers for kernel.
 	 * Since we do not reload segments registers with sane
 	 * values on kernel entry, descriptors referenced by
-	 * segments registers may be not valid. This is fatal
-	 * for the usermode, but is innocent for the kernel.
+	 * segments registers might be not valid.  This is fatal
+	 * for user mode, but is not a problem for the kernel.
 	 */
 	testb	$SEL_RPL_MASK,TF_CS(%rsp)
 	jz	ld_regs
@@ -662,14 +663,16 @@ do_segs:
 	/* Restore %fs and fsbase */
 	movw	TF_FS(%rsp),%ax
 	.globl	ld_fs
-ld_fs:	movw	%ax,%fs
+ld_fs:
+	movw	%ax,%fs
 	cmpw	$KUF32SEL,%ax
 	jne	1f
 	movl	$MSR_FSBASE,%ecx
 	movl	PCB_FSBASE(%r8),%eax
 	movl	PCB_FSBASE+4(%r8),%edx
 	.globl	ld_fsbase
-ld_fsbase: wrmsr
+ld_fsbase:
+	wrmsr
 1:
 	/* Restore %gs and gsbase */
 	movw	TF_GS(%rsp),%si
@@ -678,7 +681,8 @@ ld_fsbase: wrmsr
 	movl	$MSR_GSBASE,%ecx
 	rdmsr
 	.globl	ld_gs
-ld_gs:	movw	%si,%gs
+ld_gs:
+	movw	%si,%gs
 	wrmsr
 	popfq
 	cmpw	$KUG32SEL,%si
@@ -687,12 +691,17 @@ ld_gs:	movw	%si,%gs
 	movl	PCB_GSBASE(%r8),%eax
 	movl	PCB_GSBASE+4(%r8),%edx
 	.globl	ld_gsbase
-ld_gsbase: wrmsr
-1:	.globl	ld_es
-ld_es:	movw	TF_ES(%rsp),%es
+ld_gsbase:
+	wrmsr
+1:
+	.globl	ld_es
+ld_es:
+	movw	TF_ES(%rsp),%es
 	.globl	ld_ds
-ld_ds:	movw	TF_DS(%rsp),%ds
-ld_regs:movq	TF_RDI(%rsp),%rdi
+ld_ds:
+	movw	TF_DS(%rsp),%ds
+ld_regs:
+	movq	TF_RDI(%rsp),%rdi
 	movq	TF_RSI(%rsp),%rsi
 	movq	TF_RDX(%rsp),%rdx
 	movq	TF_RCX(%rsp),%rcx
@@ -711,7 +720,8 @@ ld_regs:movq	TF_RDI(%rsp),%rdi
 	jz	1f			/* keep running with kernel GS.base */
 	cli
 	swapgs
-1:	addq	$TF_RIP,%rsp		/* skip over tf_err, tf_trapno */
+1:
+	addq	$TF_RIP,%rsp		/* skip over tf_err, tf_trapno */
 	.globl	doreti_iret
 doreti_iret:
 	iretq
@@ -738,7 +748,8 @@ doreti_iret_fault:
 	testl	$PSL_I,TF_RFLAGS(%rsp)
 	jz	1f
 	sti
-1:	movw	%fs,TF_FS(%rsp)
+1:
+	movw	%fs,TF_FS(%rsp)
 	movw	%gs,TF_GS(%rsp)
 	movw	%es,TF_ES(%rsp)
 	movw	%ds,TF_DS(%rsp)
@@ -768,7 +779,7 @@ doreti_iret_fault:
 	.globl	ds_load_fault
 ds_load_fault:
 	movl	$T_PROTFLT,TF_TRAPNO(%rsp)
-	movq	%rsp, %rdi
+	movq	%rsp,%rdi
 	call	trap
 	movw	$KUDSEL,TF_DS(%rsp)
 	jmp	doreti
@@ -777,7 +788,7 @@ ds_load_fault:
 	.globl	es_load_fault
 es_load_fault:
 	movl	$T_PROTFLT,TF_TRAPNO(%rsp)
-	movq	%rsp, %rdi
+	movq	%rsp,%rdi
 	call	trap
 	movw	$KUDSEL,TF_ES(%rsp)
 	jmp	doreti
@@ -786,7 +797,7 @@ es_load_fault:
 	.globl	fs_load_fault
 fs_load_fault:
 	movl	$T_PROTFLT,TF_TRAPNO(%rsp)
-	movq	%rsp, %rdi
+	movq	%rsp,%rdi
 	call	trap
 	movw	$KUF32SEL,TF_FS(%rsp)
 	jmp	doreti
@@ -796,7 +807,7 @@ fs_load_fault:
 gs_load_fault:
 	popfq
 	movl	$T_PROTFLT,TF_TRAPNO(%rsp)
-	movq	%rsp, %rdi
+	movq	%rsp,%rdi
 	call	trap
 	movw	$KUG32SEL,TF_GS(%rsp)
 	jmp	doreti
@@ -805,7 +816,7 @@ gs_load_fault:
 	.globl	fsbase_load_fault
 fsbase_load_fault:
 	movl	$T_PROTFLT,TF_TRAPNO(%rsp)
-	movq	%rsp, %rdi
+	movq	%rsp,%rdi
 	call	trap
 	movq	PCPU(CURTHREAD),%r8
 	movq	TD_PCB(%r8),%r8
@@ -816,7 +827,7 @@ fsbase_load_fault:
 	.globl	gsbase_load_fault
 gsbase_load_fault:
 	movl	$T_PROTFLT,TF_TRAPNO(%rsp)
-	movq	%rsp, %rdi
+	movq	%rsp,%rdi
 	call	trap
 	movq	PCPU(CURTHREAD),%r8
 	movq	TD_PCB(%r8),%r8

Modified: user/imp/masq/sys/amd64/amd64/identcpu.c
==============================================================================
--- user/imp/masq/sys/amd64/amd64/identcpu.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/amd64/amd64/identcpu.c	Sun May  9 06:52:32 2010	(r207810)
@@ -240,7 +240,7 @@ printcpuinfo(void)
 				printf("\n  Features2=0x%b", cpu_feature2,
 				"\020"
 				"\001SSE3"	/* SSE3 */
-				"\002<b1>"
+				"\002PCLMULQDQ"	/* Carry-Less Mul Quadword */
 				"\003DTES64"	/* 64-bit Debug Trace */
 				"\004MON"	/* MONITOR/MWAIT Instructions */
 				"\005DS_CPL"	/* CPL Qualified Debug Store */
@@ -264,7 +264,7 @@ printcpuinfo(void)
 				"\027MOVBE"
 				"\030POPCNT"
 				"\031<b24>"
-				"\032<b25>"
+				"\032AESNI"	/* AES Crypto*/
 				"\033XSAVE"
 				"\034OSXSAVE"
 				"\035<b28>"

Modified: user/imp/masq/sys/amd64/amd64/pmap.c
==============================================================================
--- user/imp/masq/sys/amd64/amd64/pmap.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/amd64/amd64/pmap.c	Sun May  9 06:52:32 2010	(r207810)
@@ -2796,7 +2796,7 @@ pmap_remove_all(vm_page_t m)
 
 	KASSERT((m->flags & PG_FICTITIOUS) == 0,
 	    ("pmap_remove_all: page %p is fictitious", m));
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	vm_page_lock_queues();
 	pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
 	while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) {
 		pmap = PV_PMAP(pv);
@@ -2834,6 +2834,7 @@ pmap_remove_all(vm_page_t m)
 		PMAP_UNLOCK(pmap);
 	}
 	vm_page_flag_clear(m, PG_WRITEABLE);
+	vm_page_unlock_queues();
 }
 
 /*
@@ -3414,8 +3415,10 @@ void
 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
 {
 
+	vm_page_lock_queues();
 	PMAP_LOCK(pmap);
-	(void) pmap_enter_quick_locked(pmap, va, m, prot, NULL);
+	(void)pmap_enter_quick_locked(pmap, va, m, prot, NULL);
+	vm_page_unlock_queues();
 	PMAP_UNLOCK(pmap);
 }
 
@@ -3926,8 +3929,11 @@ pmap_page_wired_mappings(vm_page_t m)
 	count = 0;
 	if ((m->flags & PG_FICTITIOUS) != 0)
 		return (count);
+	vm_page_lock_queues();
 	count = pmap_pvh_wired_mappings(&m->md, count);
-	return (pmap_pvh_wired_mappings(pa_to_pvh(VM_PAGE_TO_PHYS(m)), count));
+	count = pmap_pvh_wired_mappings(pa_to_pvh(VM_PAGE_TO_PHYS(m)), count);
+	vm_page_unlock_queues();
+	return (count);
 }
 
 /*
@@ -3961,16 +3967,15 @@ pmap_pvh_wired_mappings(struct md_page *
 boolean_t
 pmap_page_is_mapped(vm_page_t m)
 {
-	struct md_page *pvh;
+	boolean_t rv;
 
 	if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0)
 		return (FALSE);
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
-	if (TAILQ_EMPTY(&m->md.pv_list)) {
-		pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
-		return (!TAILQ_EMPTY(&pvh->pv_list));
-	} else
-		return (TRUE);
+	vm_page_lock_queues();
+	rv = !TAILQ_EMPTY(&m->md.pv_list) ||
+	    !TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list);
+	vm_page_unlock_queues();
+	return (rv);
 }
 
 /*
@@ -4238,7 +4243,7 @@ pmap_remove_write(vm_page_t m)
 	if ((m->flags & PG_FICTITIOUS) != 0 ||
 	    (m->flags & PG_WRITEABLE) == 0)
 		return;
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	vm_page_lock_queues();
 	pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
 	TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_list, next_pv) {
 		pmap = PV_PMAP(pv);
@@ -4269,6 +4274,7 @@ retry:
 		PMAP_UNLOCK(pmap);
 	}
 	vm_page_flag_clear(m, PG_WRITEABLE);
+	vm_page_unlock_queues();
 }
 
 /*

Modified: user/imp/masq/sys/amd64/include/specialreg.h
==============================================================================
--- user/imp/masq/sys/amd64/include/specialreg.h	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/amd64/include/specialreg.h	Sun May  9 06:52:32 2010	(r207810)
@@ -113,6 +113,7 @@
 #define	CPUID_PBE	0x80000000
 
 #define	CPUID2_SSE3	0x00000001
+#define	CPUID2_PCLMULQDQ 0x00000002
 #define	CPUID2_DTES64	0x00000004
 #define	CPUID2_MON	0x00000008
 #define	CPUID2_DS_CPL	0x00000010
@@ -131,6 +132,7 @@
 #define	CPUID2_X2APIC	0x00200000
 #define	CPUID2_MOVBE	0x00400000
 #define	CPUID2_POPCNT	0x00800000
+#define	CPUID2_AESNI	0x02000000
 
 /*
  * Important bits in the AMD extended cpuid flags

Modified: user/imp/masq/sys/amd64/include/xen/xenfunc.h
==============================================================================
--- user/imp/masq/sys/amd64/include/xen/xenfunc.h	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/amd64/include/xen/xenfunc.h	Sun May  9 06:52:32 2010	(r207810)
@@ -1,6 +1,5 @@
-/*
- *
- * Copyright (c) 2004,2005 Kip Macy
+/*-
+ * Copyright (c) 2004, 2005 Kip Macy
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -11,22 +10,22 @@
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 4. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
  */
 
-
 #ifndef _XEN_XENFUNC_H_
 #define _XEN_XENFUNC_H_
 

Modified: user/imp/masq/sys/amd64/include/xen/xenvar.h
==============================================================================
--- user/imp/masq/sys/amd64/include/xen/xenvar.h	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/amd64/include/xen/xenvar.h	Sun May  9 06:52:32 2010	(r207810)
@@ -1,29 +1,27 @@
-/*
+/*-
  * Copyright (c) 2008 Kip Macy
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- *
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
- *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  *
  * $FreeBSD$
  */

Modified: user/imp/masq/sys/arm/arm/cpufunc.c
==============================================================================
--- user/imp/masq/sys/arm/arm/cpufunc.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/arm/arm/cpufunc.c	Sun May  9 06:52:32 2010	(r207810)
@@ -783,69 +783,66 @@ struct cpu_functions xscalec3_cpufuncs =
 #endif /* CPU_XSCALE_81342 */
 
 
-#if defined(CPU_FA526)
+#if defined(CPU_FA526) || defined(CPU_FA626TE)
 struct cpu_functions fa526_cpufuncs = {
 	/* CPU functions */
 
-	.cf_id			= cpufunc_id,
-	.cf_cpwait		= cpufunc_nullop,
+	cpufunc_id,			/* id			*/
+	cpufunc_nullop,			/* cpwait		*/
 
 	/* MMU functions */
 
-	.cf_control		= cpufunc_control,
-	.cf_domains		= cpufunc_domains,
-	.cf_setttb		= fa526_setttb,
-	.cf_faultstatus		= cpufunc_faultstatus,
-	.cf_faultaddress	= cpufunc_faultaddress,
+	cpufunc_control,		/* control		*/
+	cpufunc_domains,		/* domain		*/
+	fa526_setttb,			/* setttb		*/
+	cpufunc_faultstatus,		/* faultstatus		*/
+	cpufunc_faultaddress,		/* faultaddress		*/
 
 	/* TLB functions */
 
-	.cf_tlb_flushID		= armv4_tlb_flushID,
-	.cf_tlb_flushID_SE	= fa526_tlb_flushID_SE,
-	.cf_tlb_flushI		= armv4_tlb_flushI,
-	.cf_tlb_flushI_SE	= fa526_tlb_flushI_SE,
-	.cf_tlb_flushD		= armv4_tlb_flushD,
-	.cf_tlb_flushD_SE	= armv4_tlb_flushD_SE,
+	armv4_tlb_flushID,		/* tlb_flushID		*/
+	fa526_tlb_flushID_SE,		/* tlb_flushID_SE	*/
+	armv4_tlb_flushI,		/* tlb_flushI		*/
+	fa526_tlb_flushI_SE,		/* tlb_flushI_SE	*/
+	armv4_tlb_flushD,		/* tlb_flushD		*/
+	armv4_tlb_flushD_SE,		/* tlb_flushD_SE	*/
 
 	/* Cache operations */
 
-	.cf_icache_sync_all	= fa526_icache_sync_all,
-	.cf_icache_sync_range	= fa526_icache_sync_range,
-
-	.cf_dcache_wbinv_all	= fa526_dcache_wbinv_all,
-	.cf_dcache_wbinv_range	= fa526_dcache_wbinv_range,
-	.cf_dcache_inv_range	= fa526_dcache_inv_range,
-	.cf_dcache_wb_range	= fa526_dcache_wb_range,
-
-	.cf_idcache_wbinv_all	= fa526_idcache_wbinv_all,
-	.cf_idcache_wbinv_range	= fa526_idcache_wbinv_range,
-
-
-	.cf_l2cache_wbinv_all = cpufunc_nullop,
-	.cf_l2cache_wbinv_range = (void *)cpufunc_nullop,
-	.cf_l2cache_inv_range = (void *)cpufunc_nullop,
-	.cf_l2cache_wb_range = (void *)cpufunc_nullop,
+	fa526_icache_sync_all,		/* icache_sync_all	*/
+	fa526_icache_sync_range,	/* icache_sync_range	*/
 
+	fa526_dcache_wbinv_all,		/* dcache_wbinv_all	*/
+	fa526_dcache_wbinv_range,	/* dcache_wbinv_range	*/
+	fa526_dcache_inv_range,		/* dcache_inv_range	*/
+	fa526_dcache_wb_range,		/* dcache_wb_range	*/
+
+	fa526_idcache_wbinv_all,	/* idcache_wbinv_all	*/
+	fa526_idcache_wbinv_range,	/* idcache_wbinv_range	*/
+	cpufunc_nullop,			/* l2cache_wbinv_all	*/
+	(void *)cpufunc_nullop,		/* l2cache_wbinv_range	*/
+	(void *)cpufunc_nullop,		/* l2cache_inv_range	*/
+	(void *)cpufunc_nullop,		/* l2cache_wb_range	*/
 
 	/* Other functions */
 
-	.cf_flush_prefetchbuf	= fa526_flush_prefetchbuf,
-	.cf_drain_writebuf	= armv4_drain_writebuf,
-	.cf_flush_brnchtgt_C	= cpufunc_nullop,
-	.cf_flush_brnchtgt_E	= fa526_flush_brnchtgt_E,
+	fa526_flush_prefetchbuf,	/* flush_prefetchbuf	*/
+	armv4_drain_writebuf,		/* drain_writebuf	*/
+	cpufunc_nullop,			/* flush_brnchtgt_C	*/
+	fa526_flush_brnchtgt_E,		/* flush_brnchtgt_E	*/
 
-	.cf_sleep		= fa526_cpu_sleep,
+	fa526_cpu_sleep,		/* sleep		*/
 
 	/* Soft functions */
 
-	.cf_dataabt_fixup	= cpufunc_null_fixup,
-	.cf_prefetchabt_fixup	= cpufunc_null_fixup,
+	cpufunc_null_fixup,		/* dataabt_fixup	*/
+	cpufunc_null_fixup,		/* prefetchabt_fixup	*/
 
-	.cf_context_switch	= fa526_context_switch,
+	fa526_context_switch,		/* context_switch	*/
 
-	.cf_setup		= fa526_setup
-};
-#endif	/* CPU_FA526 */
+	fa526_setup			/* cpu setup 		*/
+};          
+#endif	/* CPU_FA526 || CPU_FA626TE */
 
 
 /*
@@ -856,11 +853,11 @@ struct cpu_functions cpufuncs;
 u_int cputype;
 u_int cpu_reset_needs_v4_MMU_disable;	/* flag used in locore.s */
 
-#if defined(CPU_ARM7TDMI) || defined(CPU_ARM8) || defined(CPU_ARM9) || \
-  defined (CPU_ARM9E) || defined (CPU_ARM10) ||			       \
-  defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) ||	       \
-  defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) ||	       \
-  defined(CPU_FA526) ||					       \
+#if defined(CPU_ARM7TDMI) || defined(CPU_ARM8) || defined(CPU_ARM9) ||	\
+  defined (CPU_ARM9E) || defined (CPU_ARM10) ||				\
+  defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) ||		\
+  defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) ||		\
+  defined(CPU_FA526) || defined(CPU_FA626TE) ||				\
   defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342)
 
 static void get_cachetype_cp15(void);
@@ -1141,8 +1138,8 @@ set_cpufuncs()
 		goto out;
 	}
 #endif	/* CPU_SA1110 */
-#ifdef CPU_FA526
-	if (cputype == CPU_ID_FA526) {
+#if defined(CPU_FA526) || defined(CPU_FA626TE)
+	if (cputype == CPU_ID_FA526 || cputype == CPU_ID_FA626TE) {
 		cpufuncs = fa526_cpufuncs;
 		cpu_reset_needs_v4_MMU_disable = 1;	/* SA needs it	*/
 		get_cachetype_cp15();
@@ -1153,7 +1150,7 @@ set_cpufuncs()
 
 		goto out;
 	}
-#endif	/* CPU_FA526 */
+#endif	/* CPU_FA526 || CPU_FA626TE */
 #ifdef CPU_IXP12X0
         if (cputype == CPU_ID_IXP1200) {
                 cpufuncs = ixp12x0_cpufuncs;
@@ -1629,7 +1626,7 @@ late_abort_fixup(arg)
   defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) ||		\
   defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342) || \
   defined(CPU_ARM10) ||  defined(CPU_ARM11) || \
-  defined(CPU_FA526)
+  defined(CPU_FA526) || defined(CPU_FA626TE)
 
 #define IGN	0
 #define OR	1
@@ -2095,7 +2092,7 @@ sa11x0_setup(args)
 }
 #endif	/* CPU_SA1100 || CPU_SA1110 */
 
-#if defined(CPU_FA526)
+#if defined(CPU_FA526) || defined(CPU_FA626TE)
 struct cpu_option fa526_options[] = {
 #ifdef COMPAT_12
 	{ "nocache",		IGN, BIC, (CPU_CONTROL_IC_ENABLE |
@@ -2149,7 +2146,7 @@ fa526_setup(char *args)
 	ctrl = cpuctrl;
 	cpu_control(0xffffffff, cpuctrl);
 }
-#endif	/* CPU_FA526 */
+#endif	/* CPU_FA526 || CPU_FA626TE */
 
 
 #if defined(CPU_IXP12X0)

Modified: user/imp/masq/sys/arm/arm/cpufunc_asm_fa526.S
==============================================================================
--- user/imp/masq/sys/arm/arm/cpufunc_asm_fa526.S	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/arm/arm/cpufunc_asm_fa526.S	Sun May  9 06:52:32 2010	(r207810)
@@ -32,7 +32,11 @@
 #include <machine/asm.h>
 __FBSDID("$FreeBSD$");
 
+#ifdef CPU_FA526
 #define	CACHELINE_SIZE	16
+#else
+#define	CACHELINE_SIZE	32
+#endif
 
 ENTRY(fa526_setttb)
 	mov	r1, #0

Modified: user/imp/masq/sys/arm/arm/elf_trampoline.c
==============================================================================
--- user/imp/masq/sys/arm/arm/elf_trampoline.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/arm/arm/elf_trampoline.c	Sun May  9 06:52:32 2010	(r207810)
@@ -57,7 +57,7 @@ void __startC(void);
 #define cpu_idcache_wbinv_all	arm8_cache_purgeID
 #elif defined(CPU_ARM9)
 #define cpu_idcache_wbinv_all	arm9_idcache_wbinv_all
-#elif defined(CPU_FA526)
+#elif defined(CPU_FA526) || defined(CPU_FA626TE)
 #define cpu_idcache_wbinv_all	fa526_idcache_wbinv_all
 #elif defined(CPU_ARM9E)
 #define cpu_idcache_wbinv_all	armv5_ec_idcache_wbinv_all

Modified: user/imp/masq/sys/arm/arm/identcpu.c
==============================================================================
--- user/imp/masq/sys/arm/arm/identcpu.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/arm/arm/identcpu.c	Sun May  9 06:52:32 2010	(r207810)
@@ -220,7 +220,9 @@ const struct cpuidtab cpuids[] = {
 	  generic_steppings },
 	{ CPU_ID_ARM966ESR1,	CPU_CLASS_ARM9ES,	"ARM966E-S",
 	  generic_steppings },
-	{ CPU_ID_FA526,	CPU_CLASS_ARM9,	"FA526",
+	{ CPU_ID_FA526,		CPU_CLASS_ARM9,		"FA526",
+	  generic_steppings },
+	{ CPU_ID_FA626TE,	CPU_CLASS_ARM9ES,	"FA626TE",
 	  generic_steppings },
 
 	{ CPU_ID_TI925T,	CPU_CLASS_ARM9TDMI,	"TI ARM925T",

Modified: user/imp/masq/sys/arm/arm/pmap.c
==============================================================================
--- user/imp/masq/sys/arm/arm/pmap.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/arm/arm/pmap.c	Sun May  9 06:52:32 2010	(r207810)
@@ -3118,18 +3118,11 @@ pmap_remove_all(vm_page_t m)
 	pmap_t curpm;
 	int flags = 0;
 
-#if defined(PMAP_DEBUG)
-	/*
-	 * XXX This makes pmap_remove_all() illegal for non-managed pages!
-	 */
-	if (m->flags & PG_FICTITIOUS) {
-		panic("pmap_remove_all: illegal for unmanaged page, va: 0x%x", VM_PAGE_TO_PHYS(m));
-	}
-#endif
-
+	KASSERT((m->flags & PG_FICTITIOUS) == 0,
+	    ("pmap_remove_all: page %p is fictitious", m));
 	if (TAILQ_EMPTY(&m->md.pv_list))
 		return;
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	vm_page_lock_queues();
 	pmap_remove_write(m);
 	curpm = vmspace_pmap(curproc->p_vmspace);
 	while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
@@ -3180,6 +3173,7 @@ pmap_remove_all(vm_page_t m)
 			pmap_tlb_flushD(curpm);
 	}
 	vm_page_flag_clear(m, PG_WRITEABLE);
+	vm_page_unlock_queues();
 }
 
 
@@ -3615,9 +3609,11 @@ void
 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
 {
 
+	vm_page_lock_queues();
  	PMAP_LOCK(pmap);
 	pmap_enter_locked(pmap, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE),
 	    FALSE, M_NOWAIT);
+	vm_page_unlock_queues();
  	PMAP_UNLOCK(pmap);
 }
 
@@ -4450,10 +4446,11 @@ pmap_page_wired_mappings(vm_page_t m)
 	count = 0;
 	if ((m->flags & PG_FICTITIOUS) != 0)
 		return (count);
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	vm_page_lock_queues();
 	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list)
 		if ((pv->pv_flags & PVF_WIRED) != 0)
 			count++;
+	vm_page_unlock_queues();
 	return (count);
 }
 
@@ -4530,8 +4527,11 @@ void
 pmap_remove_write(vm_page_t m)
 {
 
-	if (m->flags & PG_WRITEABLE)
+	if (m->flags & PG_WRITEABLE) {
+		vm_page_lock_queues();
 		pmap_clearbit(m, PVF_WRITE);
+		vm_page_unlock_queues();
+	}
 }
 
 

Modified: user/imp/masq/sys/arm/at91/if_ate.c
==============================================================================
--- user/imp/masq/sys/arm/at91/if_ate.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/arm/at91/if_ate.c	Sun May  9 06:52:32 2010	(r207810)
@@ -272,8 +272,8 @@ ate_attach(device_t dev)
 	ifp->if_ioctl = ateioctl;
 	ifp->if_init = ateinit;
 	ifp->if_baudrate = 10000000;
-	IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
-	ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
+	IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
+	ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
 	IFQ_SET_READY(&ifp->if_snd);
 	ifp->if_linkmib = &sc->mibdata;
 	ifp->if_linkmiblen = sizeof(sc->mibdata);

Modified: user/imp/masq/sys/arm/include/cpuconf.h
==============================================================================
--- user/imp/masq/sys/arm/include/cpuconf.h	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/arm/include/cpuconf.h	Sun May  9 06:52:32 2010	(r207810)
@@ -62,6 +62,7 @@
 			 defined(CPU_XSCALE_80321) +			\
 			 defined(CPU_XSCALE_PXA2X0) +			\
 			 defined(CPU_FA526) +				\
+			 defined(CPU_FA626TE) +				\
 			 defined(CPU_XSCALE_IXP425))
 
 /*
@@ -78,7 +79,7 @@
 #if (defined(CPU_ARM9E) || defined(CPU_ARM10) ||			\
      defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) ||		\
      defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342) ||		\
-     defined(CPU_XSCALE_PXA2X0))
+     defined(CPU_XSCALE_PXA2X0) || defined(CPU_FA626TE))
 #define	ARM_ARCH_5	1
 #else
 #define	ARM_ARCH_5	0
@@ -126,7 +127,8 @@
 
 #if (defined(CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_ARM7TDMI) ||	\
      defined(CPU_ARM8) || defined(CPU_ARM9) || defined(CPU_ARM9E) ||	\
-     defined(CPU_ARM10) || defined(CPU_ARM11) || defined(CPU_FA526))
+     defined(CPU_ARM10) || defined(CPU_ARM11) || defined(CPU_FA526) ||	\
+     defined(CPU_FA626TE))
 #define	ARM_MMU_GENERIC		1
 #else
 #define	ARM_MMU_GENERIC		0

Modified: user/imp/masq/sys/arm/include/cpufunc.h
==============================================================================
--- user/imp/masq/sys/arm/include/cpufunc.h	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/arm/include/cpufunc.h	Sun May  9 06:52:32 2010	(r207810)
@@ -284,7 +284,7 @@ u_int	arm8_clock_config	(u_int, u_int);
 #endif
 
 
-#ifdef CPU_FA526
+#if defined(CPU_FA526) || defined(CPU_FA626TE)
 void	fa526_setup		(char *arg);
 void	fa526_setttb		(u_int ttb);
 void	fa526_context_switch	(void);
@@ -464,11 +464,11 @@ extern unsigned armv5_dcache_index_max;
 extern unsigned armv5_dcache_index_inc;
 #endif
 
-#if defined(CPU_ARM9) || defined(CPU_ARM9E) || defined(CPU_ARM10) || \
-  defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) || \
-  defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) ||	     \
-    defined(CPU_FA526) || \
-  defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) ||	     \
+#if defined(CPU_ARM9) || defined(CPU_ARM9E) || defined(CPU_ARM10) ||	\
+  defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) ||	\
+  defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) ||		\
+  defined(CPU_FA526) || defined(CPU_FA626TE) ||				\
+  defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) ||		\
   defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342)
   
 void	armv4_tlb_flushID	(void);

Modified: user/imp/masq/sys/arm/xscale/ixp425/if_npe.c
==============================================================================
--- user/imp/masq/sys/arm/xscale/ixp425/if_npe.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/arm/xscale/ixp425/if_npe.c	Sun May  9 06:52:32 2010	(r207810)
@@ -360,7 +360,7 @@ npe_attach(device_t dev)
 	ifp->if_ioctl = npeioctl;
 	ifp->if_init = npeinit;
 	IFQ_SET_MAXLEN(&ifp->if_snd, sc->txdma.nbuf - 1);
-	ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
+	ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
 	IFQ_SET_READY(&ifp->if_snd);
 	ifp->if_linkmib = &sc->mibdata;
 	ifp->if_linkmiblen = sizeof(sc->mibdata);

Modified: user/imp/masq/sys/boot/forth/loader.conf
==============================================================================
--- user/imp/masq/sys/boot/forth/loader.conf	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/boot/forth/loader.conf	Sun May  9 06:52:32 2010	(r207810)
@@ -197,8 +197,6 @@ if_epair_load="NO"		# Virtual b-t-b Ethe
 if_faith_load="NO"		# IPv6-to-IPv4 TCP relay capturing interface
 if_gif_load="NO"		# generic tunnel interface
 if_gre_load="NO"		# encapsulating network device
-if_ppp_load="NO"		# Kernel ppp
-if_sl_load="NO"			# SLIP
 if_stf_load="NO"		# 6to4 tunnel interface
 if_tap_load="NO"		# Ethernet tunnel software network interface
 if_tun_load="NO"		# Tunnel driver (user process ppp)
@@ -217,7 +215,6 @@ if_age_load="NO"		# Attansic/Atheros L1 
 if_alc_load="NO"		# Atheros AR8131/AR8132 Ethernet
 if_ale_load="NO"		# Atheros AR8121/AR8113/AR8114 Ethernet
 if_an_load="NO"			# Aironet 4500/4800 802.11 wireless NICs
-if_ar_load="NO"			# Digi SYNC/570i
 if_ath_load="NO"		# Atheros IEEE 802.11 wireless NICs
 if_aue_load="NO"		# ADMtek AN986 Pegasus USB Ethernet
 if_awi_load="NO"		# AMD PCnetMobile IEEE 802.11 wireless NICs
@@ -237,6 +234,7 @@ if_ed_load="NO"			# National Semiconduct
 if_em_load="NO"			# Intel(R) PRO/1000 Gigabit Ethernet
 if_en_load="NO"			# Midway-based ATM interfaces
 if_ep_load="NO"			# 3Com Etherlink III (3c5x9)
+if_et_load="NO"			# Agere ET1310 10/100/Gigabit Ethernet
 if_ex_load="NO"			# Intel EtherExpress Pro/10 Ethernet
 if_fe_load="NO"			# Fujitsu MB86960A/MB86965A based Ethernet
 				# adapters
@@ -265,17 +263,15 @@ if_nve_load="NO"		# NVIDIA nForce MCP Ne
 if_nxge_load="NO"		# Neterion Xframe 10Gb Ethernet
 if_pcn_load="NO"		# AMD PCnet PCI
 if_ral_load="NO"		# Ralink Technology wireless
-if_ray_load="NO"		# Raytheon Raylink/Webgear Aviator PCCard
 if_re_load="NO"			# RealTek 8139C+/8169/8169S/8110S
 if_rl_load="NO"			# RealTek 8129/8139
 if_rue_load="NO"		# RealTek RTL8150 USB to Fast Ethernet
 if_sbni_load="NO"		# Granch SBNI12 leased line adapters
 if_sf_load="NO"			# Adaptec Duralink PCI (AIC-6915 "starfire")
-if_sge_load="NO"		# Silicon Integrated Systems SiS190/191
+if_sge_load="NO"		# Silicon Integrated Systems SiS 190/191
 if_sis_load="NO"		# Silicon Integrated Systems SiS 900/7016
 if_sk_load="NO"			# SysKonnect SK-984x series PCI Gigabit Ethernet
 if_sn_load="NO"			# SMC 91Cxx
-if_sr_load="NO"			# synchronous RISCom/N2 / WANic 400/405
 if_ste_load="NO"		# Sundance Technologies ST201 Fast Ethernet
 if_stge_load="NO"		# Sundance/Tamarack TC9021 Gigabit Ethernet
 if_ti_load="NO"			# Alteon Networks Tigon 1 and Tigon 2

Modified: user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
==============================================================================
--- user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c	Sun May  9 06:52:32 2010	(r207810)
@@ -464,15 +464,15 @@ dbuf_read_impl(dmu_buf_impl_t *db, zio_t
 	ASSERT(db->db_buf == NULL);
 
 	if (db->db_blkid == DB_BONUS_BLKID) {
-		int bonuslen = dn->dn_bonuslen;
+		int bonuslen = MIN(dn->dn_bonuslen, dn->dn_phys->dn_bonuslen);
 
 		ASSERT3U(bonuslen, <=, db->db.db_size);
 		db->db.db_data = zio_buf_alloc(DN_MAX_BONUSLEN);
 		arc_space_consume(DN_MAX_BONUSLEN);
 		if (bonuslen < DN_MAX_BONUSLEN)
 			bzero(db->db.db_data, DN_MAX_BONUSLEN);
-		bcopy(DN_BONUS(dn->dn_phys), db->db.db_data,
-		    bonuslen);
+		if (bonuslen)
+			bcopy(DN_BONUS(dn->dn_phys), db->db.db_data, bonuslen);
 		dbuf_update_data(db);
 		db->db_state = DB_CACHED;
 		mutex_exit(&db->db_mtx);

Modified: user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c
==============================================================================
--- user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c	Sun May  9 06:52:32 2010	(r207810)
@@ -128,15 +128,6 @@ dmu_object_reclaim(objset_t *os, uint64_
 		return (0);
 	}
 
-	tx = dmu_tx_create(os);
-	dmu_tx_hold_bonus(tx, object);
-	err = dmu_tx_assign(tx, TXG_WAIT);
-	if (err) {
-		dmu_tx_abort(tx);
-		dnode_rele(dn, FTAG);
-		return (err);
-	}
-
 	nblkptr = 1 + ((DN_MAX_BONUSLEN - bonuslen) >> SPA_BLKPTRSHIFT);
 
 	/*
@@ -144,16 +135,27 @@ dmu_object_reclaim(objset_t *os, uint64_
 	 * be a new file instance.   We must clear out the previous file
 	 * contents before we can change this type of metadata in the dnode.
 	 */
-	if (dn->dn_nblkptr > nblkptr || dn->dn_datablksz != blocksize)
-		dmu_free_long_range(os, object, 0, DMU_OBJECT_END);
+	if (dn->dn_nblkptr > nblkptr || dn->dn_datablksz != blocksize) {
+		err = dmu_free_long_range(os, object, 0, DMU_OBJECT_END);
+		if (err)
+			goto out;
+	}
+
+	tx = dmu_tx_create(os);
+	dmu_tx_hold_bonus(tx, object);
+	err = dmu_tx_assign(tx, TXG_WAIT);
+	if (err) {
+		dmu_tx_abort(tx);
+		goto out;
+	}
 
 	dnode_reallocate(dn, ot, blocksize, bonustype, bonuslen, tx);
 
 	dmu_tx_commit(tx);
-
+out:
 	dnode_rele(dn, FTAG);
 
-	return (0);
+	return (err);
 }
 
 int

Modified: user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c
==============================================================================
--- user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c	Sun May  9 06:52:32 2010	(r207810)
@@ -1213,6 +1213,39 @@ dmu_objset_find_spa(spa_t *spa, const ch
 	return (err);
 }
 
+/* ARGSUSED */
+int
+dmu_objset_prefetch(char *name, void *arg)
+{
+	dsl_dataset_t *ds;
+
+	if (dsl_dataset_hold(name, FTAG, &ds))
+		return (0);
+
+	if (!BP_IS_HOLE(&ds->ds_phys->ds_bp)) {
+		mutex_enter(&ds->ds_opening_lock);
+		if (!dsl_dataset_get_user_ptr(ds)) {
+			uint32_t aflags = ARC_NOWAIT | ARC_PREFETCH;
+			zbookmark_t zb;
+
+			zb.zb_objset = ds->ds_object;
+			zb.zb_object = 0;
+			zb.zb_level = -1;
+			zb.zb_blkid = 0;
+
+			(void) arc_read_nolock(NULL, dsl_dataset_get_spa(ds),
+			    &ds->ds_phys->ds_bp, NULL, NULL,
+			    ZIO_PRIORITY_ASYNC_READ,
+			    ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE,
+			    &aflags, &zb);
+		}
+		mutex_exit(&ds->ds_opening_lock);
+	}
+
+	dsl_dataset_rele(ds, FTAG);
+	return (0);
+}
+
 void
 dmu_objset_set_user(objset_t *os, void *user_ptr)
 {

Modified: user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
==============================================================================
--- user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c	Sun May  9 02:18:01 2010	(r207809)
+++ user/imp/masq/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c	Sun May  9 06:52:32 2010	(r207810)
@@ -2564,11 +2564,12 @@ spa_tryimport(nvlist_t *tryconfig)
  * The act of destroying or exporting a pool is very simple.  We make sure there
  * is no more pending I/O and any references to the pool are gone.  Then, we
  * update the pool state and sync all the labels to disk, removing the
- * configuration from the cache afterwards.
+ * configuration from the cache afterwards. If the 'hardforce' flag is set, then
+ * we don't sync the labels or remove the configuration cache.
  */
 static int
 spa_export_common(char *pool, int new_state, nvlist_t **oldconfig,
-    boolean_t force)
+    boolean_t force, boolean_t hardforce)
 {
 	spa_t *spa;
 
@@ -2636,7 +2637,7 @@ spa_export_common(char *pool, int new_st
 		 * so mark them all dirty.  spa_unload() will do the
 		 * final sync that pushes these changes out.
 		 */
-		if (new_state != POOL_STATE_UNINITIALIZED) {
+		if (new_state != POOL_STATE_UNINITIALIZED && !hardforce) {
 			spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
 			spa->spa_state = new_state;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-user@FreeBSD.ORG  Mon May 10 00:45:10 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id D300B106566B;
	Mon, 10 May 2010 00:45:10 +0000 (UTC)
	(envelope-from dougb@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44])
	by mx1.freebsd.org (Postfix) with ESMTP id C3BCA8FC14;
	Mon, 10 May 2010 00:45:10 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4A0jAO3094227;
	Mon, 10 May 2010 00:45:10 GMT (envelope-from dougb@svn.freebsd.org)
Received: (from dougb@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4A0jAO8094225;
	Mon, 10 May 2010 00:45:10 GMT (envelope-from dougb@svn.freebsd.org)
Message-Id: <201005100045.o4A0jAO8094225@svn.freebsd.org>
From: Doug Barton <dougb@FreeBSD.org>
Date: Mon, 10 May 2010 00:45:10 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207833 - user/dougb/portmaster
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 10 May 2010 00:45:10 -0000

Author: dougb
Date: Mon May 10 00:45:10 2010
New Revision: 207833
URL: http://svn.freebsd.org/changeset/base/207833

Log:
  Add error checking for --packages-local without --local-packagedir

Modified:
  user/dougb/portmaster/portmaster

Modified: user/dougb/portmaster/portmaster
==============================================================================
--- user/dougb/portmaster/portmaster	Sun May  9 22:16:15 2010	(r207832)
+++ user/dougb/portmaster/portmaster	Mon May 10 00:45:10 2010	(r207833)
@@ -486,6 +486,9 @@ unset var
 [ -n "$PM_INDEX" -a -n "$CHECK_PORT_DBDIR" ] &&
 	fail 'The --index* and --check-port-dbdir options are mutually exclusive'
 
+[ -n "$PM_PACKAGES_LOCAL" -a -z "$LOCAL_PACKAGEDIR" ] &&
+	fail 'The --packages-local option requires --local-packagedir to be defined'
+
 # Do this here so it can use the fancy functions above, and default values
 # can be overridden in the rc files
 if [ "$$" -eq "$PM_PARENT_PID" ]; then

From owner-svn-src-user@FreeBSD.ORG  Mon May 10 01:07:59 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 776B21065672;
	Mon, 10 May 2010 01:07:59 +0000 (UTC)
	(envelope-from dougb@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44])
	by mx1.freebsd.org (Postfix) with ESMTP id 6835D8FC19;
	Mon, 10 May 2010 01:07:59 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4A17xCh099291;
	Mon, 10 May 2010 01:07:59 GMT (envelope-from dougb@svn.freebsd.org)
Received: (from dougb@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4A17xAC099289;
	Mon, 10 May 2010 01:07:59 GMT (envelope-from dougb@svn.freebsd.org)
Message-Id: <201005100107.o4A17xAC099289@svn.freebsd.org>
From: Doug Barton <dougb@FreeBSD.org>
Date: Mon, 10 May 2010 01:07:59 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207834 - user/dougb/portmaster
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 10 May 2010 01:07:59 -0000

Author: dougb
Date: Mon May 10 01:07:59 2010
New Revision: 207834
URL: http://svn.freebsd.org/changeset/base/207834

Log:
  Document the --packages-local option
  
  The ENVIRONMENT section is not for make only

Modified:
  user/dougb/portmaster/portmaster.8

Modified: user/dougb/portmaster/portmaster.8
==============================================================================
--- user/dougb/portmaster/portmaster.8	Mon May 10 00:45:10 2010	(r207833)
+++ user/dougb/portmaster/portmaster.8	Mon May 10 01:07:59 2010	(r207834)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd May 3, 2010
+.Dd May 9, 2010
 .Dt PORTMASTER 8
 .Os
 .Sh NAME
@@ -38,6 +38,7 @@ Common Flags:
 .Op Fl -delete-build-only
 .Op Fl -always-fetch
 .Op Fl -local-packagedir=<path>
+.Op Fl -packages-local
 .Op Fl -delete-packages
 .Op Fl -no-confirm
 .Op Fl -no-term-title
@@ -85,18 +86,21 @@ and/or multiple globs from /var/db/pkg
 .Op Fl -packages-if-newer
 .Op Fl -always-fetch
 .Op Fl -local-packagedir=<path>
+.Op Fl -packages-local
 .Op Fl -delete-packages
 .Fl P|--packages
 .Nm
 .Op Fl -packages-if-newer
 .Op Fl -always-fetch
 .Op Fl -local-packagedir=<path>
+.Op Fl -packages-local
 .Op Fl -delete-packages
 .Fl PP|--packages-only
 .Nm
 .Op Fl -packages-if-newer
 .Op Fl -always-fetch
 .Op Fl -local-packagedir=<path>
+.Op Fl -packages-local
 .Op Fl -delete-packages
 .Fl -packages-build
 .Nm
@@ -426,6 +430,10 @@ in the category subdirectories, such as
 .Pa <path>/devel ,
 .Pa <path>/ports-mgmt ,
 etc.
+.It Fl -packages-local
+use packages from
+.Fl -local-packagedir
+only
 .It Fl -delete-packages
 after installing from a package, delete it
 .It Fl -no-confirm
@@ -498,7 +506,7 @@ display help message
 .It Fl -version
 display the version only.
 .El
-.Sh MAKE ENVIRONMENT
+.Sh ENVIRONMENT
 The directory pointed to by the
 .Ev PACKAGES
 variable (by default
@@ -654,6 +662,9 @@ along with their related options.
 # Specify a local package repository (--local-packagedir)
 # LOCAL_PACKAGEDIR=<path>
 #
+# Only use packages from --local-packagedir (--packages-local)
+# PM_PACKAGES_LOCAL=pmp_local
+#
 # Delete packages after they are installed (--delete-packages)
 # PM_DELETE_PACKAGES=pm_delete_packages
 #

From owner-svn-src-user@FreeBSD.ORG  Mon May 10 02:07:43 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 2A535106564A;
	Mon, 10 May 2010 02:07:43 +0000 (UTC)
	(envelope-from dougb@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44])
	by mx1.freebsd.org (Postfix) with ESMTP id 1B0B68FC13;
	Mon, 10 May 2010 02:07:43 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4A27gG2012552;
	Mon, 10 May 2010 02:07:42 GMT (envelope-from dougb@svn.freebsd.org)
Received: (from dougb@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4A27gZM012550;
	Mon, 10 May 2010 02:07:42 GMT (envelope-from dougb@svn.freebsd.org)
Message-Id: <201005100207.o4A27gZM012550@svn.freebsd.org>
From: Doug Barton <dougb@FreeBSD.org>
Date: Mon, 10 May 2010 02:07:42 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207837 - user/dougb/portmaster
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 10 May 2010 02:07:43 -0000

Author: dougb
Date: Mon May 10 02:07:42 2010
New Revision: 207837
URL: http://svn.freebsd.org/changeset/base/207837

Log:
  Improve cross-option error checking for the --packages* options

Modified:
  user/dougb/portmaster/portmaster

Modified: user/dougb/portmaster/portmaster
==============================================================================
--- user/dougb/portmaster/portmaster	Mon May 10 01:23:31 2010	(r207836)
+++ user/dougb/portmaster/portmaster	Mon May 10 02:07:42 2010	(r207837)
@@ -397,21 +397,26 @@ pm_sv             () { [ -n "$PM_SU_VERB
 #=============== End functions we always want to have ===============
 
 packages_init () {
-	local e1 e2
+	local e1 e2 e3
 
 e1="The -P/--packages and -PP/--packages-only options are mutually exclusive"
 e2="The --packages-build option and the -P[P] options are mutually exclusive"
+e3="The --packages-if-newer and -PP/--packages-only options are mutually exclusive"
 
 	case "$1" in
-	first)		[ "$PM_PACKAGES" = only ] && fail $e1
-			[ -n "$PM_PACKAGES_BUILD" ] && fail $e2 ;;
-	only)		[ "$PM_PACKAGES" = first ] && fail $e1
-			[ -n "$PM_PACKAGES_BUILD" ] && fail $e2 ;;
-	build)		case "$PM_PACKAGES" in first|only) fail $e2 ;; esac ;;
-	newer)		[ -z "$PM_PACKAGES" -a -z "$PM_PACKAGES_BUILD" ] && {
-				PM_PACKAGES=newer ; export PM_PACKAGES; } ;;
-	local)		[ -z "$PM_PACKAGES" -a -z "$PM_PACKAGES_BUILD" ] && {
-				PM_PACKAGES=local ; export PM_PACKAGES; } ;;
+	first)	[ "$PM_PACKAGES" = only ] && fail $e1
+		[ -n "$PM_PACKAGES_BUILD" ] && fail $e2
+		[ -z "$PM_PACKAGES" ] && {
+			PM_PACKAGES=first ; export PM_PACKAGES; } ;;
+	only)	[ "$PM_PACKAGES" = first ] && fail $e1
+		[ "$PM_PACKAGES" = newer ] && fail $e3
+		[ -n "$PM_PACKAGES_BUILD" ] && fail $e2 ;;
+	build)	case "$PM_PACKAGES" in first|only) fail $e2 ;; esac ;;
+	newer)	[ "$PM_PACKAGES" = only ] && fail $e3
+		[ -z "$PM_PACKAGES" -a -z "$PM_PACKAGES_BUILD" ] && {
+			PM_PACKAGES=newer ; export PM_PACKAGES; } ;;
+	local)	[ -z "$PM_PACKAGES" -a -z "$PM_PACKAGES_BUILD" ] && {
+			PM_PACKAGES=local ; export PM_PACKAGES; } ;;
 	esac
 }
 
@@ -431,8 +436,7 @@ for var in "$@" ; do
 	case "$var" in
 	-PP[A-Za-z0-9]*|-*[A-Za-z0-9]PP*)
 				fail "The -PP option must stand alone" ;;
-	--packages)		packages_init first
-				PM_PACKAGES=first ; export PM_PACKAGES ;;
+	--packages)		packages_init first ;;
 	-PP|--packages-only)	packages_init only
 				PM_PACKAGES=only ; export PM_PACKAGES ;;
 	--packages-build)	packages_init build

From owner-svn-src-user@FreeBSD.ORG  Mon May 10 03:13:23 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id AF8D01065670;
	Mon, 10 May 2010 03:13:23 +0000 (UTC)
	(envelope-from dougb@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44])
	by mx1.freebsd.org (Postfix) with ESMTP id 9FDC98FC19;
	Mon, 10 May 2010 03:13:23 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4A3DNDX027335;
	Mon, 10 May 2010 03:13:23 GMT (envelope-from dougb@svn.freebsd.org)
Received: (from dougb@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4A3DNcP027333;
	Mon, 10 May 2010 03:13:23 GMT (envelope-from dougb@svn.freebsd.org)
Message-Id: <201005100313.o4A3DNcP027333@svn.freebsd.org>
From: Doug Barton <dougb@FreeBSD.org>
Date: Mon, 10 May 2010 03:13:23 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207840 - user/dougb/portmaster
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 10 May 2010 03:13:23 -0000

Author: dougb
Date: Mon May 10 03:13:23 2010
New Revision: 207840
URL: http://svn.freebsd.org/changeset/base/207840

Log:
  Be smarter about whether or not to use $PM_SU_CMD to fetch the INDEX.bz2

Modified:
  user/dougb/portmaster/portmaster

Modified: user/dougb/portmaster/portmaster
==============================================================================
--- user/dougb/portmaster/portmaster	Mon May 10 02:09:53 2010	(r207839)
+++ user/dougb/portmaster/portmaster	Mon May 10 03:13:23 2010	(r207840)
@@ -518,9 +518,17 @@ if [ "$$" -eq "$PM_PARENT_PID" ]; then
 			: ${FETCHINDEX:='fetch -am -o'}
 			: ${MASTER_SITE_INDEX:='http://www.FreeBSD.org/ports/'}
 
+			index_fetch="$FETCHINDEX ${PM_INDEX}.bz2 ${MASTER_SITE_INDEX}${INDEXFILE}.bz2"
+			do_index_fetch=yes_index_fetch
+
 			index_time=`stat -f '%Um' ${PM_INDEX}.bz2 2>/dev/null`
-			pm_sv Updating INDEX file
-			$PM_SU_CMD $FETCHINDEX ${PM_INDEX}.bz2 ${MASTER_SITE_INDEX}${INDEXFILE}.bz2
+
+			[ -n "$index_time" ] && {
+				$index_fetch 2>/dev/null && do_index_fetch=no_index_fetch; }
+
+			[ "$do_index_fetch" = yes_index_fetch ] && {
+				pm_sv 'Updating INDEX file'; $PM_SU_CMD $index_fetch; }
+
 			if [ ${index_time:-0} -ne `stat -f '%Um' ${PM_INDEX}.bz2 2>/dev/null` ]; then
 				temp_index=`pm_mktemp index`
 				bunzip2 < ${PM_INDEX}.bz2 > $temp_index
@@ -528,7 +536,7 @@ if [ "$$" -eq "$PM_PARENT_PID" ]; then
 				unlink $temp_index
 				unset temp_index
 			fi
-			unset index_time
+			unset index_fetch do_index_fetch index_time
 		else
 			[ -r "$PM_INDEX" ] ||
 				fail "The --no-index-fetch option was used, but $PM_INDEX does not exist"

From owner-svn-src-user@FreeBSD.ORG  Mon May 10 06:59:08 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 3F7B81065676;
	Mon, 10 May 2010 06:59:08 +0000 (UTC)
	(envelope-from dougb@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44])
	by mx1.freebsd.org (Postfix) with ESMTP id 2E9338FC1E;
	Mon, 10 May 2010 06:59:08 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4A6x8EA076538;
	Mon, 10 May 2010 06:59:08 GMT (envelope-from dougb@svn.freebsd.org)
Received: (from dougb@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4A6x7ji076537;
	Mon, 10 May 2010 06:59:07 GMT (envelope-from dougb@svn.freebsd.org)
Message-Id: <201005100659.o4A6x7ji076537@svn.freebsd.org>
From: Doug Barton <dougb@FreeBSD.org>
Date: Mon, 10 May 2010 06:59:07 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207841 - user/dougb/portmaster
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 10 May 2010 06:59:08 -0000

Author: dougb
Date: Mon May 10 06:59:07 2010
New Revision: 207841
URL: http://svn.freebsd.org/changeset/base/207841

Log:
  Allow setting of DISTDIR directly in .portmasterrc like the other widely
  used vars. This entails the following:
     1. Capitalize distdir every place that it's used.
     2. Add to the list of --options to check which mean we don't even
        have to try to set it. This saves us a call to make(1).
     3. Don't set it to / if DISTDIR is empty, which makes error checking
        later on easier.
     4. Mark DISTDIR (and related vars) global in a few more functions
        to make it consistent.
  
  While I'm here, move the test for version > 6.4 first in the list, no
  point in processing a bunch of stuff only to bail out later.
  
  Unset the test_command_line function when we're done using it

Modified:
  user/dougb/portmaster/portmaster

Modified: user/dougb/portmaster/portmaster
==============================================================================
--- user/dougb/portmaster/portmaster	Mon May 10 03:13:23 2010	(r207840)
+++ user/dougb/portmaster/portmaster	Mon May 10 06:59:07 2010	(r207841)
@@ -496,6 +496,11 @@ unset var
 # Do this here so it can use the fancy functions above, and default values
 # can be overridden in the rc files
 if [ "$$" -eq "$PM_PARENT_PID" ]; then
+	if [ -n "$PM_PACKAGES" -o -n "$PM_PACKAGES_BUILD" ]; then
+		[ `/sbin/sysctl -n kern.osreldate 2>/dev/null` -lt 600400 ] &&
+		fail Package installation support requires FreeBSD 6.4 or newer
+	fi
+
 	if [ -z "$pd" ]; then
 		if [ -z "$PORTSDIR" ]; then
 			[ -d /usr/ports ] && pd=/usr/ports
@@ -570,12 +575,13 @@ if [ "$$" -eq "$PM_PARENT_PID" ]; then
 			fi
 		fi
 	fi
-	if [ -z "$distdir" -a "$PM_PACKAGES" != only ]; then
-		distdir=`pm_make_b -f/usr/share/mk/bsd.port.mk -V DISTDIR 2>/dev/null`
-		# In case it is a symlink
-		distdir="${distdir%/}/"
+	export pd pdb
+
+	if [ -z "$DISTDIR" -a "$PM_PACKAGES" != only -a -z "$CHECK_DEPENDS" -a \
+	    -z "$CHECK_PORT_DBDIR" -a -z "$LIST_ORIGINS" ]; then
+		DISTDIR=`pm_make_b -f/usr/share/mk/bsd.port.mk -V DISTDIR 2>/dev/null`
 	fi
-	export pd pdb distdir
+	[ -n "$DISTDIR" ] && { DISTDIR="${DISTDIR%/}/"; export DISTDIR; }
 
 	[ -z "$port_dbdir" -a -d /var/db/ports ] && port_dbdir=/var/db/ports
 	[ -z "$port_dbdir" ] &&
@@ -586,10 +592,6 @@ if [ "$$" -eq "$PM_PARENT_PID" ]; then
 		PM_BUILD_ONLY_LIST=pm_bol
 		export PM_BUILD_ONLY_LIST
 	fi
-	if [ -n "$PM_PACKAGES" -o -n "$PM_PACKAGES_BUILD" ]; then
-		[ `/sbin/sysctl -n kern.osreldate 2>/dev/null` -lt 600400 ] &&
-		fail Package installation support requires FreeBSD 6.4 or newer
-	fi
 fi
 
 set -- $newopts
@@ -901,8 +903,8 @@ ports_by_category () {
 delete_empty_dist_subdirs () {
 	# Get back to somewhere safe so we do not
 	# delete our CWD out from under ourselves
-	pm_cd $distdir || fail "Cannot cd into $distdir"
-	find -d $distdir -type d \( -empty -and ! -path \*\.zfs/\* \) -delete
+	pm_cd $DISTDIR || fail "Cannot cd into $DISTDIR"
+	find -d $DISTDIR -type d \( -empty -and ! -path \*\.zfs/\* \) -delete
 }
 
 # Takes a pattern as input
@@ -933,15 +935,15 @@ find_glob_dirs () {
 #=============== Begin code relevant only to --features ===============
 
 if [ -n "$CLEAN_DISTFILES" ]; then
-	[ "$distdir" != '/' ] || fail 'There is no DISTDIR to clean'
+	[ -n "$DISTDIR" ] || fail 'There is no DISTDIR to clean'
 
 	# Set the file name here since we are usually called in a subshell
 	DI_FILES=`pm_mktemp DI-FILES`
 	read_distinfos
 
 	echo "===>>> Checking for stale distfiles"
-	for df in `find $distdir -type f | sort`; do
-		f=${df#$distdir}
+	for df in `find $DISTDIR -type f | sort`; do
+		f=${df#$DISTDIR}
 		if ! grep -ql $f $DI_FILES; then
 			if [ -n "$ALL" ]; then
 				echo "===>>> Deleting $f"
@@ -1181,6 +1183,7 @@ if [ -n "$LIST" -o -n "$LIST_PLUS" ]; th
 	[ $# -gt 0 ] && fail 'The -[lL] options are not compatible with updates or installs'
 fi
 unset my_environment
+unset -f test_command_line
 
 #=============== Begin functions for getopts features and main ===============
 
@@ -1484,10 +1487,10 @@ delete_dist_list () {
 }
 
 find_and_delete_distfiles () {
-	# Global: distfiles distfiles_checked delete_all
+	# Global: port_subdir DISTDIR distfiles distfiles_checked delete_all
 	local ps pattern file answer
 
-	ps=${port_subdir#$distdir}
+	ps=${port_subdir#$DISTDIR}
 
 	pattern=${1%[_-]*}
 	for file in ${pattern}*; do
@@ -1532,7 +1535,7 @@ find_and_delete_distfiles () {
 }
 
 set_distfiles_and_subdir () {
-	# Global: dist_list_files distfiles port_subdir distdir
+	# Global: dist_list_files distfiles port_subdir DISTDIR
 
 	[ -z "$dist_list_files" ] && find_dl_distfiles $1
 
@@ -1552,9 +1555,9 @@ set_distfiles_and_subdir () {
 	if [ -z "$port_subdir" ]; then
 		port_subdir=`pm_make -V DIST_SUBDIR`
 		if [ -n "$port_subdir" ]; then
-			port_subdir="${distdir}${port_subdir}/"
+			port_subdir="${DISTDIR}${port_subdir}/"
 		else
-			port_subdir=$distdir
+			port_subdir=$DISTDIR
 		fi
 	fi
 	if [ -d "$port_subdir" ]; then
@@ -1621,7 +1624,7 @@ delete_stale_distfiles () {
 }
 
 delete_all_distfiles () {
-	# Global: delete_all distdir
+	# Global: delete_all DISTDIR
 	local origin rc delete_current
 
 	# In case we are called more than once
@@ -1640,9 +1643,9 @@ delete_all_distfiles () {
 			local answer f ; read answer
 			case "$answer" in
 			[yY])	for f in $dist_list_files; do
-					if [ -f "${distdir}${f}" ]; then
-					echo "       Deleting ${distdir}${f}"
-						pm_unlink ${distdir}${f}
+					if [ -f "${DISTDIR}${f}" ]; then
+					echo "       Deleting ${DISTDIR}${f}"
+						pm_unlink ${DISTDIR}${f}
 					fi
 				done ;;
 			esac
@@ -1822,7 +1825,8 @@ fi
 
 #=============== End code relevant only to getopts features ===============
 
-[ "$distdir" = '/' -a "$PM_PACKAGES" != only ] && fail 'The value of DISTDIR cannot be empty'
+[ -z "$DISTDIR" -a "$PM_PACKAGES" != only -a -z "$DONT_SCRUB_DISTFILES" ] &&
+	fail 'The value of DISTDIR cannot be empty'
 
 #=============== Begin functions for main ===============
 
@@ -3371,7 +3375,7 @@ if [ -n "$distfiles" ]; then
 
 	ds=`pm_make -V DIST_SUBDIR`
 	[ -n "$ds" ] && ds="${ds}/"
-	port_subdir="${distdir}${ds}"		# Also for *delete*distfiles()
+	port_subdir="${DISTDIR}${ds}"		# Also for *delete*distfiles()
 
 	if [ -s distinfo ]; then
 		distinfo=distinfo

From owner-svn-src-user@FreeBSD.ORG  Mon May 10 07:01:53 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 4D9A71065673;
	Mon, 10 May 2010 07:01:53 +0000 (UTC)
	(envelope-from dougb@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44])
	by mx1.freebsd.org (Postfix) with ESMTP id 3CE428FC12;
	Mon, 10 May 2010 07:01:53 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4A71rsk077236;
	Mon, 10 May 2010 07:01:53 GMT (envelope-from dougb@svn.freebsd.org)
Received: (from dougb@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4A71rLF077235;
	Mon, 10 May 2010 07:01:53 GMT (envelope-from dougb@svn.freebsd.org)
Message-Id: <201005100701.o4A71rLF077235@svn.freebsd.org>
From: Doug Barton <dougb@FreeBSD.org>
Date: Mon, 10 May 2010 07:01:53 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207843 - user/dougb/portmaster
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 10 May 2010 07:01:53 -0000

Author: dougb
Date: Mon May 10 07:01:52 2010
New Revision: 207843
URL: http://svn.freebsd.org/changeset/base/207843

Log:
  Simplify handling of -P as was done for --packages above
  
  Indicate to the user that -p is deprecated

Modified:
  user/dougb/portmaster/portmaster

Modified: user/dougb/portmaster/portmaster
==============================================================================
--- user/dougb/portmaster/portmaster	Mon May 10 06:59:50 2010	(r207842)
+++ user/dougb/portmaster/portmaster	Mon May 10 07:01:52 2010	(r207843)
@@ -1090,8 +1090,7 @@ while getopts 'BCDFGHKLPRabde:fghilm:nop
 	H)	HIDE_BUILD=Hopt; ARGS="-H $ARGS" ;;
 	K)	DONT_POST_CLEAN=Kopt; ARGS="-K $ARGS" ;;
 	L)	LIST_PLUS=Lopt ;;
-	P)	packages_init first
-		PM_PACKAGES=first ; export PM_PACKAGES ;;
+	P)	packages_init first ;;
 	R)	RESTART=Ropt ; ARGS="-R $ARGS" ;;
 	a)	UPDATE_ALL=aopt ;;
 	b)	BACKUP=bopt; ARGS="-b $ARGS" ;;
@@ -1107,7 +1106,8 @@ while getopts 'BCDFGHKLPRabde:fghilm:nop
 		;;
 	n)	NO_ACTION=nopt; ARGS="-n $ARGS" ;;
 	o)	REPLACE_ORIGIN=oopt ;;
-	p)	portdir="${OPTARG#$pd/}" ; portdir=${portdir%/} ;;
+	p)	echo "===>>> The -p option has been deprecated" ; echo ''
+		portdir="${OPTARG#$pd/}" ; portdir=${portdir%/} ;;
 	r)	UPDATE_REQ_BYS=ropt
 		if [ -d "$pdb/$OPTARG" ]; then
 			glob_dirs=$OPTARG

From owner-svn-src-user@FreeBSD.ORG  Mon May 10 16:35:14 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 4BB9C1065676;
	Mon, 10 May 2010 16:35:14 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44])
	by mx1.freebsd.org (Postfix) with ESMTP id 3B14A8FC2E;
	Mon, 10 May 2010 16:35:14 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4AGZE7O006532;
	Mon, 10 May 2010 16:35:14 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4AGZDXl006531;
	Mon, 10 May 2010 16:35:13 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201005101635.o4AGZDXl006531@svn.freebsd.org>
From: Warner Losh <imp@FreeBSD.org>
Date: Mon, 10 May 2010 16:35:13 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207850 - user/imp/masq/sys/kern
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 10 May 2010 16:35:14 -0000

Author: imp
Date: Mon May 10 16:35:13 2010
New Revision: 207850
URL: http://svn.freebsd.org/changeset/base/207850

Log:
  Write routines to walk through lists of mapping information to allow us
  to map new device IDs to old and a few other things.

Modified:
  user/imp/masq/sys/kern/bus_if.m
  user/imp/masq/sys/kern/subr_bus.c

Modified: user/imp/masq/sys/kern/bus_if.m
==============================================================================
--- user/imp/masq/sys/kern/bus_if.m	Mon May 10 15:28:44 2010	(r207849)
+++ user/imp/masq/sys/kern/bus_if.m	Mon May 10 16:35:13 2010	(r207850)
@@ -141,6 +141,75 @@ METHOD int write_ivar {
 };
 
 /**
+ * @brief Read the value of a bus-specific attribute of a device as a string
+ *
+ * This method will perform a mapping from the specified string to
+ * the bus specific ivar index, fetch the result from the ivar (or other
+ * location) and return the result as the most appropriate string for
+ * that resource.  There's no reason why other attributes of the device
+ * on the bus than are embodied in the ivars, but generally such attributes
+ * don't make sense.
+ * 
+ * @param _dev		the device whose child was being examined
+ * @param _child	the child device whose attribute is being read
+ * @param _attr		the instance variable to read
+ * @param _result	a loction to recieve the instance variable
+ *			value
+ * @param _reslen	Size of the buffer for the result.
+ *
+ * @retval 0		success
+ * @retval ENOATTR	no such attribute is supported by @p _dev 
+ * @retval EOVERFLOW	value of @p _attr is longer than @p _reslen
+ */
+METHOD int read_attr {
+	device_t _dev;
+	device_t _child;
+	const char *_attr;
+	char *_result;
+	size_t _reslen;
+};
+
+/**
+ * @brief Write the value of a bus-specific attribute of a device
+ * 
+ * This method sets the value of an attribute to @p _value.
+ * 
+ * @param _dev		the device whose child was being updated
+ * @param _child	the child device whose attribute is being written
+ * @param _attr		the instance variable to write
+ * @param _newval	the new value to set
+ * 
+ * @retval 0		success
+ * @retval ENOATTR	no such attribute is supported by @p _dev 
+ * @retval EINVAL	cannot interpret @p _newval for @p _attr
+ * @retval EROFS	cannot change @p _attr
+ */
+METHOD int write_attr {
+	device_t _dev;
+	device_t _child;
+	const char *_attr;
+	const char *_newval;
+};
+
+/**
+ * @brief As a bus to reset any modified attributes.
+ *
+ * Called when a new set of mapping tables are loaded into the kernel.  The
+ * bus should re-read the attributes of the device from hardware and reset
+ * values stored in ivars or similar data structures to a base state (or
+ * it should restore the base state from a saved copy for buses that can
+ * only be enumerated once).  Buses should make no assumptions about which
+ * devices have this called on them, nor the order of the calls.
+ *
+ * @param _dev		the bus which the device to reset
+ * @param _child	the child device to reset attributes for
+ */
+METHOD void reset_attr {
+	device_t _dev;
+	device_t _child;
+};
+
+/**
  * @brief Notify a bus that a child was detached
  *
  * Called after the child's DEVICE_DETACH() method to allow the parent

Modified: user/imp/masq/sys/kern/subr_bus.c
==============================================================================
--- user/imp/masq/sys/kern/subr_bus.c	Mon May 10 15:28:44 2010	(r207849)
+++ user/imp/masq/sys/kern/subr_bus.c	Mon May 10 16:35:13 2010	(r207850)
@@ -130,6 +130,7 @@ struct device {
 #define	DF_DONENOMATCH	32		/* don't execute DEVICE_NOMATCH again */
 #define	DF_EXTERNALSOFTC 64		/* softc not allocated by us */
 #define	DF_REBID	128		/* Can rebid after attach */
+#define DF_REMAPPED	256		/* all remapping completed */
 	u_char	order;			/**< order from device_add_child_ordered() */
 	u_char	pad;
 	void	*ivars;			/**< instance variables  */
@@ -142,6 +143,35 @@ struct device {
 static MALLOC_DEFINE(M_BUS, "bus", "Bus data structures");
 static MALLOC_DEFINE(M_BUS_SC, "bus-sc", "Bus data structures, softc");
 
+/**
+ * @brief Generic remapping glue
+ */
+typedef TAILQ_HEAD(bus_map_attr_list, bus_map_attr) bus_map_attr_list_t;
+typedef TAILQ_HEAD(bus_map_entry_list, bus_map_entry) bus_map_entry_list_t;
+typedef TAILQ_HEAD(bus_remap_list, bus_remap) bus_remap_list_t;
+
+struct bus_map_attr
+{
+	TAILQ_ENTRY(bus_map_attr) link; /**< list of buses */
+	const char*	name;
+	const char*	value;
+};
+
+struct bus_map_entry
+{
+	TAILQ_ENTRY(bus_map_entry) link; /**< list of buses */
+	bus_map_attr_list_t match_list;
+	bus_map_attr_list_t map_list;
+};
+
+struct bus_remap
+{
+	TAILQ_ENTRY(bus_remap) link; /**< list of buses */
+	const char*	name;		/**< Name of bus for this table */
+	bus_map_entry_list_t map_list;
+};
+static bus_remap_list_t bus_remaps = TAILQ_HEAD_INITIALIZER(bus_remaps);
+
 #ifdef BUS_DEBUG
 
 static int bus_debug = 1;
@@ -1915,6 +1945,81 @@ next_matching_driver(devclass_t dc, devi
 
 /**
  * @internal
+ *
+ * See if we can find remapping information for this device.  Remapping a
+ * device means that we change, based on user input, the pnp information that
+ * the bus layer reports to the device.  This is primarily intended to allow
+ * for fast updates in supported devices that are largely compatible with
+ * some prior device that's completely supported by the kernel.  This pnp
+ * information is exported via the BUS_READ_ATTR and BUS_WRITE_ATTR functions
+ * and should be documented in each bus' man page.
+ */
+static void
+device_remap_child(device_t bus, device_t child)
+{
+	char buffer[128];
+	int rv;
+	struct bus_remap *busmap;
+	struct bus_map_entry *mapentry;
+	struct bus_map_attr *attr;
+
+	/*
+	 * XXXimp: Locking note
+	 * When getting rid of GIANT, we need a global lock to regulate
+	 * access to the device mapping structures.  We also assume that
+	 * @p child's parent is @p bus and that won't change until after
+	 * we return.
+	 */
+	GIANT_REQUIRED;
+
+	/*
+	 * Only do the mapping once.
+	 */
+	if (child->flags & DF_REMAPPED)
+		return;
+	child->flags |= DF_REMAPPED;
+
+	/*
+	 * Check to see if this bus has a mapping table.  If so, see if
+	 * we can find a mapping entry that matches this device.  If we
+	 * find that, then remap the attributes in the remapping entry.
+	 */
+	TAILQ_FOREACH(busmap, &bus_remaps, link) {
+		if (strcmp(busmap->name, device_get_name(bus)) != 0)
+			continue;
+		break;
+	}
+	if (busmap == NULL)
+		return;
+	TAILQ_FOREACH(mapentry, &busmap->map_list, link) {
+		TAILQ_FOREACH(attr, &mapentry->match_list, link) {
+			if ((rv = BUS_READ_ATTR(bus, child, attr->name,
+			    buffer, sizeof(buffer))) != 0) {
+				device_printf(bus, "Bad read attr %d, aborted rule.\n", rv);
+				break;
+			}
+			if (strcmp(attr->value, buffer) != 0)
+				break;
+		}
+		if (attr != NULL)
+			continue;
+		TAILQ_FOREACH(attr, &mapentry->map_list, link) {
+			rv = BUS_WRITE_ATTR(bus, child, attr->name,
+			    attr->value);
+			if (rv != 0) {
+				device_printf(bus,
+				    "Cannot map attribute %s to %s: error %d",
+				    attr->name, attr->value, rv);
+				/* XXX Reset?  Some other error recovery? */
+				return;
+			}
+		}
+	}
+	return;
+}
+
+/**
+ * @internal
  */
 int
 device_probe_child(device_t dev, device_t child)
@@ -1935,9 +2040,17 @@ device_probe_child(device_t dev, device_
 	 * If the state is already probed, then return.  However, don't
 	 * return if we can rebid this object.
 	 */
-	if (child->state == DS_ALIVE && (child->flags & DF_REBID) == 0)
+	if ((child->state == DS_ALIVE && (child->flags & DF_REBID) == 0) ||
+	    child->state > DS_ALIVE)
 		return (0);
 
+	/*
+	 * Try to remap the pnp info for this device, if we haven't already
+	 * done so.  Remapping is a property of the DEVICE, not the driver
+	 * that has attached to it.
+	 */
+	device_remap_child(dev, child);
+
 	for (; dc; dc = dc->parent) {
 		for (dl = first_matching_driver(dc, child);
 		     dl;

From owner-svn-src-user@FreeBSD.ORG  Mon May 10 21:57:35 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 29160106566C;
	Mon, 10 May 2010 21:57:35 +0000 (UTC)
	(envelope-from dougb@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44])
	by mx1.freebsd.org (Postfix) with ESMTP id 1A66B8FC08;
	Mon, 10 May 2010 21:57:35 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4ALvYpa080262;
	Mon, 10 May 2010 21:57:34 GMT (envelope-from dougb@svn.freebsd.org)
Received: (from dougb@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4ALvYTF080260;
	Mon, 10 May 2010 21:57:34 GMT (envelope-from dougb@svn.freebsd.org)
Message-Id: <201005102157.o4ALvYTF080260@svn.freebsd.org>
From: Doug Barton <dougb@FreeBSD.org>
Date: Mon, 10 May 2010 21:57:34 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207903 - user/dougb/portmaster
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 10 May 2010 21:57:35 -0000

Author: dougb
Date: Mon May 10 21:57:34 2010
New Revision: 207903
URL: http://svn.freebsd.org/changeset/base/207903

Log:
  The text description of the compat library directory was wrong, [1]
  although thankfully the example 'rm -r' command had it right.
  
  Submitted by:	Denny Lin <dennylin93@hs.ntnu.edu.tw> [1]

Modified:
  user/dougb/portmaster/portmaster.8

Modified: user/dougb/portmaster/portmaster.8
==============================================================================
--- user/dougb/portmaster/portmaster.8	Mon May 10 21:31:20 2010	(r207902)
+++ user/dougb/portmaster/portmaster.8	Mon May 10 21:57:34 2010	(r207903)
@@ -268,10 +268,10 @@ After the port is built, if the
 .Fl w
 option is being used, all shared libraries installed
 by the old port (if any) will be saved to
-.Pa /usr/local/compat/pkg .
+.Pa /usr/local/lib/compat/pkg .
 After installation if there are any new files with
 the same names as those in
-.Pa /usr/local/compat/pkg
+.Pa /usr/local/lib/compat/pkg
 the old files will be deleted,
 and
 .Xr ldconfig 8

From owner-svn-src-user@FreeBSD.ORG  Mon May 10 22:21:08 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id B5AD31065673;
	Mon, 10 May 2010 22:21:08 +0000 (UTC)
	(envelope-from dougb@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44])
	by mx1.freebsd.org (Postfix) with ESMTP id A6F898FC0A;
	Mon, 10 May 2010 22:21:08 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4AML8MY085394;
	Mon, 10 May 2010 22:21:08 GMT (envelope-from dougb@svn.freebsd.org)
Received: (from dougb@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4AML8Nx085392;
	Mon, 10 May 2010 22:21:08 GMT (envelope-from dougb@svn.freebsd.org)
Message-Id: <201005102221.o4AML8Nx085392@svn.freebsd.org>
From: Doug Barton <dougb@FreeBSD.org>
Date: Mon, 10 May 2010 22:21:08 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207904 - user/dougb/portmaster
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 10 May 2010 22:21:08 -0000

Author: dougb
Date: Mon May 10 22:21:08 2010
New Revision: 207904
URL: http://svn.freebsd.org/changeset/base/207904

Log:
  LOCALBASE_COMPAT is only ever used in combination with /pkg at the end,
  so fold that into the variable to start with.

Modified:
  user/dougb/portmaster/portmaster

Modified: user/dougb/portmaster/portmaster
==============================================================================
--- user/dougb/portmaster/portmaster	Mon May 10 21:57:34 2010	(r207903)
+++ user/dougb/portmaster/portmaster	Mon May 10 22:21:08 2010	(r207904)
@@ -2441,15 +2441,15 @@ if [ "$$" -eq "$PM_PARENT_PID" -a -z "$S
 	export CUR_DEPS DISPLAY_LIST INSTALLED_LIST PM_DEPTH IPC_SAVE
 
 	if [ -n "$LOCALBASE" ]; then
-		LOCALBASE_COMPAT="$LOCALBASE/lib/compat"
+		LOCALBASE_COMPAT="$LOCALBASE/lib/compat/pkg"
 	else
 		PLB=`pm_make_b -f/usr/share/mk/bsd.port.mk -V LOCALBASE 2>/dev/null`
 		if [ -n "$PLB" ]; then
-			LOCALBASE_COMPAT="$PLB/lib/compat"
+			LOCALBASE_COMPAT="$PLB/lib/compat/pkg"
 		else
-			PLB=`head -1 $PM_INDEX | cut -f 3 -d\|`
+			PLB=`head -1 $PM_INDEX | cut -f 3 -d\| 2>/dev/null`
 			if [ -d "$PLB" ]; then
-				LOCALBASE_COMPAT="${PLB}/lib/compat"
+				LOCALBASE_COMPAT="${PLB}/lib/compat/pkg"
 			else
 				fail 'The value of LOCALBASE cannot be empty'
 			fi
@@ -3254,13 +3254,13 @@ if [ -n "$upg_port" -o -n "$ro_upg_port"
 			temp="${temp}$file "
 		done
 		if [ -n "$temp" ]; then
-			if [ ! -d "$LOCALBASE_COMPAT/pkg" ]; then
-				pm_sv Creating $LOCALBASE_COMPAT/pkg for -w
-				pm_mkdir_s $LOCALBASE_COMPAT/pkg
+			if [ ! -d "$LOCALBASE_COMPAT" ]; then
+				pm_sv Creating $LOCALBASE_COMPAT for -w
+				pm_mkdir_s $LOCALBASE_COMPAT
 			fi
 
 			pm_sv Copying old shared libraries for -w
-			$PM_SU_CMD cp -p $temp $LOCALBASE_COMPAT/pkg/
+			$PM_SU_CMD cp -p $temp ${LOCALBASE_COMPAT}/
 		fi
 
 		pm_unlink $ldconfig_out ; unset ldconfig_out temp file
@@ -3335,12 +3335,12 @@ echo ''
 
 # Remove saved libs that match newly installed files
 
-temp=`find $LOCALBASE_COMPAT/pkg -type d -empty 2>/dev/null`
-if [ -z "$temp" -a -d "$LOCALBASE_COMPAT/pkg" ]; then
+temp=`find $LOCALBASE_COMPAT -type d -empty 2>/dev/null`
+if [ -z "$temp" -a -d "$LOCALBASE_COMPAT" ]; then
 	unset files
 	for file in `pkg_info -q -L $new_port`; do
-		[ -f "$LOCALBASE_COMPAT/pkg/${file##*/}" ] && {
-			files="${files}$LOCALBASE_COMPAT/pkg/${file##*/} "; }
+		[ -f "${LOCALBASE_COMPAT}/${file##*/}" ] && {
+			files="${files}${LOCALBASE_COMPAT}/${file##*/} "; }
 	done
 
 	if [ -n "$files" ]; then
@@ -3351,9 +3351,9 @@ if [ -z "$temp" -a -d "$LOCALBASE_COMPAT
 	unset temp file files
 fi
 
-[ -z "$temp" ] && temp=`find $LOCALBASE_COMPAT/pkg -type d -empty 2>/dev/null`
+[ -z "$temp" ] && temp=`find $LOCALBASE_COMPAT -type d -empty 2>/dev/null`
 if [ -d "$temp" ]; then
-	pm_sv Deleting the empty $LOCALBASE_COMPAT/pkg
+	pm_sv Deleting the empty $LOCALBASE_COMPAT
 	pm_rmdir_s $temp
 fi
 unset temp

From owner-svn-src-user@FreeBSD.ORG  Wed May 12 03:34:55 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 04EAF106566B;
	Wed, 12 May 2010 03:34:55 +0000 (UTC)
	(envelope-from kmacy@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44])
	by mx1.freebsd.org (Postfix) with ESMTP id D00D88FC08;
	Wed, 12 May 2010 03:34:54 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4C3Ysvu082270;
	Wed, 12 May 2010 03:34:54 GMT (envelope-from kmacy@svn.freebsd.org)
Received: (from kmacy@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4C3YsLE082269;
	Wed, 12 May 2010 03:34:54 GMT (envelope-from kmacy@svn.freebsd.org)
Message-Id: <201005120334.o4C3YsLE082269@svn.freebsd.org>
From: Kip Macy <kmacy@FreeBSD.org>
Date: Wed, 12 May 2010 03:34:54 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207950 - user/kmacy/stable_7_page_lock
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 12 May 2010 03:34:55 -0000

Author: kmacy
Date: Wed May 12 03:34:54 2010
New Revision: 207950
URL: http://svn.freebsd.org/changeset/base/207950

Log:
  create branch for backporting page lock to 7

Added:
  user/kmacy/stable_7_page_lock/
     - copied from r207949, stable/7/

From owner-svn-src-user@FreeBSD.ORG  Wed May 12 21:50:04 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 653E01065672;
	Wed, 12 May 2010 21:50:04 +0000 (UTC) (envelope-from imp@FreeBSD.org)
Received: from svn.freebsd.org (unknown [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 3C6D48FC17;
	Wed, 12 May 2010 21:50:04 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4CLo46C033492;
	Wed, 12 May 2010 21:50:04 GMT (envelope-from imp@svn.freebsd.org)
Received: (from imp@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4CLo4Bh033488;
	Wed, 12 May 2010 21:50:04 GMT (envelope-from imp@svn.freebsd.org)
Message-Id: <201005122150.o4CLo4Bh033488@svn.freebsd.org>
From: Warner Losh <imp@FreeBSD.org>
Date: Wed, 12 May 2010 21:50:04 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r208005 - in user/imp/masq/sys: kern sys
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 12 May 2010 21:50:04 -0000

Author: imp
Date: Wed May 12 21:50:03 2010
New Revision: 208005
URL: http://svn.freebsd.org/changeset/base/208005

Log:
  Expand the protocol for reset_attr() so that when it returns EINVAL,
  we won't call the new bus_driver_added() with a NULL parameter for the
  driver.

Modified:
  user/imp/masq/sys/kern/bus_if.m
  user/imp/masq/sys/kern/subr_bus.c
  user/imp/masq/sys/sys/bus.h

Modified: user/imp/masq/sys/kern/bus_if.m
==============================================================================
--- user/imp/masq/sys/kern/bus_if.m	Wed May 12 21:25:05 2010	(r208004)
+++ user/imp/masq/sys/kern/bus_if.m	Wed May 12 21:50:03 2010	(r208005)
@@ -201,13 +201,20 @@ METHOD int write_attr {
  * only be enumerated once).  Buses should make no assumptions about which
  * devices have this called on them, nor the order of the calls.
  *
+ * When this routine returns EINVAL, the bus cannot cope with the new mapping
+ * API.  When the driver returns EINVAL, then bus_add_driver() isn't called
+ * when new mapping data is loaded into the kernel.
+ *
  * @param _dev		the bus which the device to reset
  * @param _child	the child device to reset attributes for
+ *
+ * @retval 0		success
+ * @retval EINVAL	Default return value -- disable mapping
  */
-METHOD void reset_attr {
+METHOD int reset_attr {
 	device_t _dev;
 	device_t _child;
-};
+} DEFAULT bus_generic_reset_attr;
 
 /**
  * @brief Notify a bus that a child was detached

Modified: user/imp/masq/sys/kern/subr_bus.c
==============================================================================
--- user/imp/masq/sys/kern/subr_bus.c	Wed May 12 21:25:05 2010	(r208004)
+++ user/imp/masq/sys/kern/subr_bus.c	Wed May 12 21:50:03 2010	(r208005)
@@ -3385,6 +3385,13 @@ bus_generic_add_child(device_t dev, int 
 	return (device_add_child_ordered(dev, order, name, unit));
 }
 
+int
+bus_generic_reset_attr(device_t dev, device_t child)
+{
+
+	return (EINVAL);
+}
+
 /**
  * @brief Helper function for implementing DEVICE_PROBE()
  *

Modified: user/imp/masq/sys/sys/bus.h
==============================================================================
--- user/imp/masq/sys/sys/bus.h	Wed May 12 21:25:05 2010	(r208004)
+++ user/imp/masq/sys/sys/bus.h	Wed May 12 21:50:03 2010	(r208005)
@@ -319,6 +319,7 @@ bus_dma_tag_t
 struct resource_list *
 	bus_generic_get_resource_list (device_t, device_t);
 void	bus_generic_new_pass(device_t dev);
+int	bus_generic_reset_attr(device_t dev, device_t child);
 int	bus_print_child_header(device_t dev, device_t child);
 int	bus_print_child_footer(device_t dev, device_t child);
 int	bus_generic_print_child(device_t dev, device_t child);

From owner-svn-src-user@FreeBSD.ORG  Thu May 13 20:51:21 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 2F5001065672;
	Thu, 13 May 2010 20:51:21 +0000 (UTC)
	(envelope-from stas@FreeBSD.org)
Received: from svn.freebsd.org (unknown [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 1EB4C8FC22;
	Thu, 13 May 2010 20:51:21 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4DKpLxv045603;
	Thu, 13 May 2010 20:51:21 GMT (envelope-from stas@svn.freebsd.org)
Received: (from stas@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4DKpK00045600;
	Thu, 13 May 2010 20:51:20 GMT (envelope-from stas@svn.freebsd.org)
Message-Id: <201005132051.o4DKpK00045600@svn.freebsd.org>
From: Stanislav Sedov <stas@FreeBSD.org>
Date: Thu, 13 May 2010 20:51:20 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r208049 - in
	user/jmallett/octeon/sys/cddl/compat/opensolaris: kern sys
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 13 May 2010 20:51:21 -0000

Author: stas
Date: Thu May 13 20:51:20 2010
New Revision: 208049
URL: http://svn.freebsd.org/changeset/base/208049

Log:
  - Fix n32 mips build of opensolaris bits.
    Opensolaris code defines 63 bits atomics in non-LP64 case,
    which are also defined/supported by mips n32 code.

Modified:
  user/jmallett/octeon/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c
  user/jmallett/octeon/sys/cddl/compat/opensolaris/sys/atomic.h

Modified: user/jmallett/octeon/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c
==============================================================================
--- user/jmallett/octeon/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c	Thu May 13 20:48:39 2010	(r208048)
+++ user/jmallett/octeon/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c	Thu May 13 20:51:20 2010	(r208049)
@@ -53,6 +53,7 @@ atomic_init(void)
 #endif
 
 #ifndef __LP64__
+#if !defined(__mips_n32)
 void
 atomic_add_64(volatile uint64_t *target, int64_t delta)
 {
@@ -61,6 +62,7 @@ atomic_add_64(volatile uint64_t *target,
 	*target += delta;
 	mtx_unlock(&atomic_mtx);
 }
+#endif
 
 void
 atomic_dec_64(volatile uint64_t *target)

Modified: user/jmallett/octeon/sys/cddl/compat/opensolaris/sys/atomic.h
==============================================================================
--- user/jmallett/octeon/sys/cddl/compat/opensolaris/sys/atomic.h	Thu May 13 20:48:39 2010	(r208048)
+++ user/jmallett/octeon/sys/cddl/compat/opensolaris/sys/atomic.h	Thu May 13 20:51:20 2010	(r208049)
@@ -37,7 +37,9 @@
 #define cas32	atomic_cmpset_32
 
 #ifndef __LP64__
+#if !defined(__mips_n32)
 extern void atomic_add_64(volatile uint64_t *target, int64_t delta);
+#endif
 extern void atomic_dec_64(volatile uint64_t *target);
 extern void *atomic_cas_ptr(volatile void *target, void *cmp,  void *newval);
 #endif

From owner-svn-src-user@FreeBSD.ORG  Fri May 14 03:01:53 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 7B9921065670;
	Fri, 14 May 2010 03:01:53 +0000 (UTC)
	(envelope-from thompsa@FreeBSD.org)
Received: from svn.freebsd.org (unknown [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 5206C8FC08;
	Fri, 14 May 2010 03:01:53 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4E31rCO027838;
	Fri, 14 May 2010 03:01:53 GMT (envelope-from thompsa@svn.freebsd.org)
Received: (from thompsa@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4E31rui027837;
	Fri, 14 May 2010 03:01:53 GMT (envelope-from thompsa@svn.freebsd.org)
Message-Id: <201005140301.o4E31rui027837@svn.freebsd.org>
From: Andrew Thompson <thompsa@FreeBSD.org>
Date: Fri, 14 May 2010 03:01:53 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r208057 - user/thompsa/usb
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 14 May 2010 03:01:53 -0000

Author: thompsa
Date: Fri May 14 03:01:53 2010
New Revision: 208057
URL: http://svn.freebsd.org/changeset/base/208057

Log:
  Unused branch.

Deleted:
  user/thompsa/usb/

From owner-svn-src-user@FreeBSD.ORG  Sat May 15 03:16:56 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id B31821065673;
	Sat, 15 May 2010 03:16:56 +0000 (UTC)
	(envelope-from kmacy@FreeBSD.org)
Received: from svn.freebsd.org (unknown [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 683C98FC13;
	Sat, 15 May 2010 03:16:56 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4F3GuoT052989;
	Sat, 15 May 2010 03:16:56 GMT (envelope-from kmacy@svn.freebsd.org)
Received: (from kmacy@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4F3GuDc052986;
	Sat, 15 May 2010 03:16:56 GMT (envelope-from kmacy@svn.freebsd.org)
Message-Id: <201005150316.o4F3GuDc052986@svn.freebsd.org>
From: Kip Macy <kmacy@FreeBSD.org>
Date: Sat, 15 May 2010 03:16:56 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r208107 - in user/kmacy/stable_7_page_lock/sys:
	amd64/amd64 amd64/conf amd64/include
	cddl/contrib/opensolaris/uts/common/fs/zfs dev/md kern
	nfsclient ufs/ffs vm
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 15 May 2010 03:16:56 -0000

Author: kmacy
Date: Sat May 15 03:16:55 2010
New Revision: 208107
URL: http://svn.freebsd.org/changeset/base/208107

Log:
  first cut of backport of page lock

Modified:
  user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c
  user/kmacy/stable_7_page_lock/sys/amd64/conf/GENERIC
  user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h
  user/kmacy/stable_7_page_lock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  user/kmacy/stable_7_page_lock/sys/dev/md/md.c
  user/kmacy/stable_7_page_lock/sys/kern/kern_exec.c
  user/kmacy/stable_7_page_lock/sys/kern/kern_subr.c
  user/kmacy/stable_7_page_lock/sys/kern/subr_witness.c
  user/kmacy/stable_7_page_lock/sys/kern/sys_pipe.c
  user/kmacy/stable_7_page_lock/sys/kern/sys_process.c
  user/kmacy/stable_7_page_lock/sys/kern/uipc_cow.c
  user/kmacy/stable_7_page_lock/sys/kern/uipc_syscalls.c
  user/kmacy/stable_7_page_lock/sys/kern/vfs_bio.c
  user/kmacy/stable_7_page_lock/sys/nfsclient/nfs_bio.c
  user/kmacy/stable_7_page_lock/sys/ufs/ffs/ffs_vnops.c
  user/kmacy/stable_7_page_lock/sys/vm/device_pager.c
  user/kmacy/stable_7_page_lock/sys/vm/pmap.h
  user/kmacy/stable_7_page_lock/sys/vm/sg_pager.c
  user/kmacy/stable_7_page_lock/sys/vm/swap_pager.c
  user/kmacy/stable_7_page_lock/sys/vm/uma_core.c
  user/kmacy/stable_7_page_lock/sys/vm/vm_contig.c
  user/kmacy/stable_7_page_lock/sys/vm/vm_fault.c
  user/kmacy/stable_7_page_lock/sys/vm/vm_glue.c
  user/kmacy/stable_7_page_lock/sys/vm/vm_kern.c
  user/kmacy/stable_7_page_lock/sys/vm/vm_map.c
  user/kmacy/stable_7_page_lock/sys/vm/vm_mmap.c
  user/kmacy/stable_7_page_lock/sys/vm/vm_object.c
  user/kmacy/stable_7_page_lock/sys/vm/vm_page.c
  user/kmacy/stable_7_page_lock/sys/vm/vm_page.h
  user/kmacy/stable_7_page_lock/sys/vm/vm_pageout.c
  user/kmacy/stable_7_page_lock/sys/vm/vnode_pager.c

Modified: user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Fri May 14 22:44:47 2010	(r208106)
+++ user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Sat May 15 03:16:55 2010	(r208107)
@@ -165,9 +165,29 @@ __FBSDID("$FreeBSD$");
 #define PV_STAT(x)	do { } while (0)
 #endif
 
+#define	CACHE_LINE_FETCH_SIZE	128
+#define	PA_LOCK_PAD		CACHE_LINE_FETCH_SIZE
+
+struct vp_lock {
+	struct mtx	vp_lock;
+	unsigned char	pad[(PA_LOCK_PAD - sizeof(struct mtx))];
+};
+
 #define	pa_index(pa)	((pa) >> PDRSHIFT)
 #define	pa_to_pvh(pa)	(&pv_table[pa_index(pa)])
 
+#define	PA_LOCKPTR(pa)	&pa_lock[pa_index((pa)) % PA_LOCK_COUNT].vp_lock
+#define	PA_LOCK(pa)	mtx_lock(PA_LOCKPTR(pa))
+#define	PA_TRYLOCK(pa)	mtx_trylock(PA_LOCKPTR(pa))
+#define	PA_UNLOCK(pa)	mtx_unlock(PA_LOCKPTR(pa))
+#define	PA_LOCK_ASSERT(pa, a)	mtx_assert(PA_LOCKPTR(pa), (a))
+
+#define	PA_LOCK_COUNT	64
+
+struct mtx pv_lock __aligned(128);
+struct vp_lock pa_lock[PA_LOCK_COUNT] __aligned(128);
+
+
 struct pmap kernel_pmap_store;
 
 vm_offset_t virtual_avail;	/* VA of first avail page (after kernel bss) */
@@ -184,6 +204,15 @@ static int pg_ps_enabled = 1;
 SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RDTUN, &pg_ps_enabled, 0,
     "Are large page mappings enabled?");
 
+static uint64_t pmap_tryrelock_calls;
+SYSCTL_QUAD(_vm_pmap, OID_AUTO, tryrelock_calls, CTLFLAG_RD,
+    &pmap_tryrelock_calls, 0, "Number of tryrelock calls");
+
+static int pmap_tryrelock_restart;
+SYSCTL_INT(_vm_pmap, OID_AUTO, tryrelock_restart, CTLFLAG_RD,
+    &pmap_tryrelock_restart, 0, "Number of tryrelock restarts");
+
+
 static u_int64_t	KPTphys;	/* phys addr of kernel level 1 */
 static u_int64_t	KPDphys;	/* phys addr of kernel level 2 */
 u_int64_t		KPDPphys;	/* phys addr of kernel level 3 */
@@ -212,8 +241,9 @@ struct msgbuf *msgbufp = 0;
 static caddr_t crashdumpmap;
 
 static void	free_pv_entry(pmap_t pmap, pv_entry_t pv);
-static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try);
-static void	pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa);
+static pv_entry_t get_pv_entry(pmap_t locked_pmap);
+static void pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
+	struct pv_list_head *pv_list);
 static boolean_t pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa);
 static void	pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa);
 static void	pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va);
@@ -221,7 +251,8 @@ static pv_entry_t pmap_pvh_remove(struct
 		    vm_offset_t va);
 
 static int pmap_change_attr_locked(vm_offset_t va, vm_size_t size, int mode);
-static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va);
+static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va,
+	struct pv_list_head *pv_list);
 static boolean_t pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m,
     vm_prot_t prot);
 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
@@ -238,7 +269,7 @@ static boolean_t pmap_protect_pde(pmap_t
     vm_prot_t prot);
 static void pmap_pte_attr(pt_entry_t *pte, int cache_bits);
 static int pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva,
-		vm_page_t *free);
+    vm_page_t *free, struct pv_list_head *pv_list);
 static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq,
 		vm_offset_t sva, pd_entry_t ptepde, vm_page_t *free);
 static void pmap_remove_pt_page(pmap_t pmap, vm_page_t mpte);
@@ -246,17 +277,16 @@ static void pmap_remove_page(pmap_t pmap
     vm_page_t *free);
 static void pmap_remove_entry(struct pmap *pmap, vm_page_t m,
 		vm_offset_t va);
-static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
     vm_page_t m);
 static void pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde,
     pd_entry_t newpde);
 static void pmap_update_pde_invalidate(vm_offset_t va, pd_entry_t newpde);
 
-static vm_page_t pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags);
-static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags);
+static vm_page_t pmap_allocpde(pmap_t pmap, vm_paddr_t pa, vm_offset_t va, int flags);
+static vm_page_t pmap_allocpte(pmap_t pmap, vm_paddr_t pa, vm_offset_t va, int flags);
 
-static vm_page_t _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags);
+static vm_page_t _pmap_allocpte(pmap_t pmap, vm_paddr_t pa, vm_pindex_t ptepindex, int flags);
 static int _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m,
                 vm_page_t* free);
 static int pmap_unuse_pt(pmap_t, vm_offset_t, pd_entry_t, vm_page_t *);
@@ -265,6 +295,76 @@ static vm_offset_t pmap_kmem_choose(vm_o
 CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t));
 CTASSERT(1 << PTESHIFT == sizeof(pt_entry_t));
 
+
+#define LS_MAX		4
+struct lock_stack {
+	struct mtx *ls_array[LS_MAX];
+	int ls_top;
+};
+
+static void
+ls_init(struct lock_stack *ls)
+{
+
+	ls->ls_top = 0;
+}
+
+static void
+ls_push(struct lock_stack *ls, struct mtx *lock)
+{
+
+	KASSERT(ls->ls_top < LS_MAX, ("lock stack overflow"));
+	
+	ls->ls_array[ls->ls_top] = lock;
+	ls->ls_top++;
+	mtx_lock(lock);
+}
+
+
+static int
+ls_trypush(struct lock_stack *ls, struct mtx *lock)
+{
+
+	KASSERT(ls->ls_top < LS_MAX, ("lock stack overflow"));
+
+	if (mtx_trylock(lock) == 0)
+		return (0);
+	
+	ls->ls_array[ls->ls_top] = lock;
+	ls->ls_top++;
+	return (1);
+}
+
+#ifdef notyet
+static void
+ls_pop(struct lock_stack *ls)
+{
+	struct mtx *lock;
+
+	KASSERT(ls->ls_top > 0, ("lock stack underflow"));
+
+	ls->ls_top--;
+	lock = ls->ls_array[ls->ls_top];
+	mtx_unlock(lock);
+}
+#endif
+
+static void
+ls_popa(struct lock_stack *ls)
+{
+	struct mtx *lock;
+
+	KASSERT(ls->ls_top > 0, ("lock stack underflow"));
+
+	while (ls->ls_top > 0) {
+		ls->ls_top--;
+		lock = ls->ls_array[ls->ls_top];
+		mtx_unlock(lock);
+	}
+}
+#ifdef INVARIANTS
+extern void kdb_backtrace(void);
+#endif
 /*
  * Move the kernel virtual free pointer to the next
  * 2MB.  This is used to help improve performance
@@ -414,6 +514,37 @@ vtopde(vm_offset_t va)
 	return (PDmap + ((va >> PDRSHIFT) & mask));
 }
 
+/*
+ * Try to acquire a physical address lock while a pmap is locked.  If we
+ * fail to trylock we unlock and lock the pmap directly and cache the
+ * locked pa in *locked.  The caller should then restart their loop in case
+ * the virtual to physical mapping has changed.
+ */
+static int
+pa_tryrelock(pmap_t pmap, vm_paddr_t pa, vm_paddr_t *locked)
+{
+	vm_paddr_t lockpa;
+
+	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+	atomic_add_long((volatile long *)&pmap_tryrelock_calls, 1);
+	lockpa = *locked;
+	*locked = pa;
+	if (lockpa) {
+		PA_LOCK_ASSERT(lockpa, MA_OWNED);
+		if (PA_LOCKPTR(pa) == PA_LOCKPTR(lockpa))
+			return (0);
+		PA_UNLOCK(lockpa);
+	}
+	if (PA_TRYLOCK(pa))
+		return 0;
+	PMAP_UNLOCK(pmap);
+	PA_LOCK(pa);
+	PMAP_LOCK(pmap);
+	atomic_add_int((volatile int *)&pmap_tryrelock_restart, 1);
+
+	return (EAGAIN);
+}
+
 static u_int64_t
 allocpages(vm_paddr_t *firstaddr, int n)
 {
@@ -512,6 +643,7 @@ pmap_bootstrap(vm_paddr_t *firstaddr)
 {
 	vm_offset_t va;
 	pt_entry_t *pte, *unused;
+	int i;	
 
 	/*
 	 * Create an initial set of page tables to run the kernel in.
@@ -570,6 +702,13 @@ pmap_bootstrap(vm_paddr_t *firstaddr)
 
 	/* Initialize the PAT MSR. */
 	pmap_init_pat();
+
+		/* Setup page locks. */
+	for (i = 0; i < PA_LOCK_COUNT; i++)
+		mtx_init(&pa_lock[i].vp_lock, "page lock", NULL,
+		    MTX_DEF | MTX_RECURSE | MTX_DUPOK);
+	mtx_init(&pv_lock, "pv list lock", NULL, MTX_DEF);
+
 }
 
 /*
@@ -625,6 +764,14 @@ pmap_page_init(vm_page_t m)
 	m->md.pat_mode = PAT_WRITE_BACK;
 }
 
+struct mtx *
+pmap_page_lockptr(vm_page_t m)
+{
+
+	KASSERT(m != NULL, ("pmap_page_lockptr: NULL page"));
+	return (PA_LOCKPTR(VM_PAGE_TO_PHYS(m)));
+}
+
 /*
  *	Initialize the pmap module.
  *	Called by vm_init, to initialize any structures that the pmap
@@ -1147,15 +1294,20 @@ pmap_extract_and_hold(pmap_t pmap, vm_of
 {
 	pd_entry_t pde, *pdep;
 	pt_entry_t pte;
+	vm_paddr_t pa;
 	vm_page_t m;
 
+	pa = 0;
 	m = NULL;
-	vm_page_lock_queues();
 	PMAP_LOCK(pmap);
+retry:
 	pdep = pmap_pde(pmap, va);
 	if (pdep != NULL && (pde = *pdep)) {
 		if (pde & PG_PS) {
 			if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) {
+				if (pa_tryrelock(pmap, pde & PG_PS_FRAME, &pa))
+					goto retry;
+
 				m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) |
 				    (va & PDRMASK));
 				vm_page_hold(m);
@@ -1164,12 +1316,15 @@ pmap_extract_and_hold(pmap_t pmap, vm_of
 			pte = *pmap_pde_to_pte(pdep, va);
 			if ((pte & PG_V) &&
 			    ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) {
+				if (pa_tryrelock(pmap, pte & PG_FRAME, &pa))
+					goto retry;
 				m = PHYS_TO_VM_PAGE(pte & PG_FRAME);
 				vm_page_hold(m);
 			}
 		}
 	}
-	vm_page_unlock_queues();
+	if (pa)
+		PA_UNLOCK(pa);
 	PMAP_UNLOCK(pmap);
 	return (m);
 }
@@ -1567,7 +1722,7 @@ pmap_pinit(pmap_t pmap)
  * race conditions.
  */
 static vm_page_t
-_pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags)
+_pmap_allocpte(pmap_t pmap, vm_paddr_t pa, vm_pindex_t ptepindex, int flags)
 {
 	vm_page_t m, pdppg, pdpg;
 
@@ -1582,9 +1737,9 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t 
 	    VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
 		if (flags & M_WAITOK) {
 			PMAP_UNLOCK(pmap);
-			vm_page_unlock_queues();
+			PA_UNLOCK(pa);
 			VM_WAIT;
-			vm_page_lock_queues();
+			PA_LOCK(pa);
 			PMAP_LOCK(pmap);
 		}
 
@@ -1624,7 +1779,7 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t 
 		pml4 = &pmap->pm_pml4[pml4index];
 		if ((*pml4 & PG_V) == 0) {
 			/* Have to allocate a new pdp, recurse */
-			if (_pmap_allocpte(pmap, NUPDE + NUPDPE + pml4index,
+			if (_pmap_allocpte(pmap, pa, NUPDE + NUPDPE + pml4index,
 			    flags) == NULL) {
 				--m->wire_count;
 				atomic_subtract_int(&cnt.v_wire_count, 1);
@@ -1657,7 +1812,7 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t 
 		pml4 = &pmap->pm_pml4[pml4index];
 		if ((*pml4 & PG_V) == 0) {
 			/* Have to allocate a new pd, recurse */
-			if (_pmap_allocpte(pmap, NUPDE + pdpindex,
+			if (_pmap_allocpte(pmap, pa, NUPDE + pdpindex,
 			    flags) == NULL) {
 				--m->wire_count;
 				atomic_subtract_int(&cnt.v_wire_count, 1);
@@ -1671,7 +1826,7 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t 
 			pdp = &pdp[pdpindex & ((1ul << NPDPEPGSHIFT) - 1)];
 			if ((*pdp & PG_V) == 0) {
 				/* Have to allocate a new pd, recurse */
-				if (_pmap_allocpte(pmap, NUPDE + pdpindex,
+				if (_pmap_allocpte(pmap, pa, NUPDE + pdpindex,
 				    flags) == NULL) {
 					--m->wire_count;
 					atomic_subtract_int(&cnt.v_wire_count,
@@ -1698,7 +1853,7 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t 
 }
 
 static vm_page_t
-pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags)
+pmap_allocpde(pmap_t pmap, vm_paddr_t pa, vm_offset_t va, int flags)
 {
 	vm_pindex_t pdpindex, ptepindex;
 	pdp_entry_t *pdpe;
@@ -1717,7 +1872,7 @@ retry:
 		/* Allocate a pd page. */
 		ptepindex = pmap_pde_pindex(va);
 		pdpindex = ptepindex >> NPDPEPGSHIFT;
-		pdpg = _pmap_allocpte(pmap, NUPDE + pdpindex, flags);
+		pdpg = _pmap_allocpte(pmap, pa, NUPDE + pdpindex, flags);
 		if (pdpg == NULL && (flags & M_WAITOK))
 			goto retry;
 	}
@@ -1725,11 +1880,12 @@ retry:
 }
 
 static vm_page_t
-pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags)
+pmap_allocpte(pmap_t pmap, vm_paddr_t pa, vm_offset_t va, int flags)
 {
 	vm_pindex_t ptepindex;
 	pd_entry_t *pd;
 	vm_page_t m;
+	struct pv_list_head pv_list;
 
 	KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT ||
 	    (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK,
@@ -1750,7 +1906,8 @@ retry:
 	 * normal 4K page.
 	 */
 	if (pd != NULL && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) {
-		if (!pmap_demote_pde(pmap, pd, va)) {
+		TAILQ_INIT(&pv_list);
+		if (!pmap_demote_pde(pmap, pd, va, &pv_list)) {
 			/*
 			 * Invalidation of the 2MB page mapping may have caused
 			 * the deallocation of the underlying PD page.
@@ -1771,7 +1928,7 @@ retry:
 		 * Here if the pte page isn't mapped, or if it has been
 		 * deallocated.
 		 */
-		m = _pmap_allocpte(pmap, ptepindex, flags);
+		m = _pmap_allocpte(pmap, pa, ptepindex, flags);
 		if (m == NULL && (flags & M_WAITOK))
 			goto retry;
 	}
@@ -1977,6 +2134,7 @@ SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_coll
  * allocate per-page pv entries until repromotion occurs, thereby
  * exacerbating the shortage of free pv entries.
  */
+#ifdef nomore
 static void
 pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
 {
@@ -1992,8 +2150,8 @@ pmap_collect(pmap_t locked_pmap, struct 
 		if (m->hold_count || m->busy)
 			continue;
 		TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
-			va = pv->pv_va;
 			pmap = PV_PMAP(pv);
+			va = pv->pv_va;
 			/* Avoid deadlock and lock recursion. */
 			if (pmap > locked_pmap)
 				PMAP_LOCK(pmap);
@@ -2027,7 +2185,7 @@ pmap_collect(pmap_t locked_pmap, struct 
 		}
 	}
 }
-
+#endif
 
 /*
  * free the pv_entry back to the free list
@@ -2039,8 +2197,8 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
 	struct pv_chunk *pc;
 	int idx, field, bit;
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+	mtx_lock(&pv_lock);
 	PV_STAT(pv_entry_frees++);
 	PV_STAT(pv_entry_spare++);
 	pv_entry_count--;
@@ -2054,6 +2212,7 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
 	if (pc->pc_map[0] != PC_FREE0 || pc->pc_map[1] != PC_FREE1 ||
 	    pc->pc_map[2] != PC_FREE2) {
 		TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
+		mtx_unlock(&pv_lock);
 		return;
 	}
 	PV_STAT(pv_entry_spare -= _NPCPV);
@@ -2062,7 +2221,10 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
 	/* entire chunk is free, return it */
 	m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
 	dump_drop_page(m->phys_addr);
-	vm_page_unwire(m, 0);
+	mtx_unlock(&pv_lock);
+	KASSERT(m->wire_count == 1, ("wire_count == %d", m->wire_count));
+	m->wire_count--;
+	atomic_subtract_int(&cnt.v_wire_count, 1);
 	vm_page_free(m);
 }
 
@@ -2071,7 +2233,7 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
  * when needed.
  */
 static pv_entry_t
-get_pv_entry(pmap_t pmap, int try)
+get_pv_entry(pmap_t pmap)
 {
 	static const struct timeval printinterval = { 60, 0 };
 	static struct timeval lastprint;
@@ -2083,7 +2245,7 @@ get_pv_entry(pmap_t pmap, int try)
 	vm_page_t m;
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	mtx_lock(&pv_lock);
 	PV_STAT(pv_entry_allocs++);
 	pv_entry_count++;
 	if (pv_entry_count > pv_entry_high_water)
@@ -2092,7 +2254,6 @@ get_pv_entry(pmap_t pmap, int try)
 			    "increasing either the vm.pmap.shpgperproc or the "
 			    "vm.pmap.pv_entry_max sysctl.\n");
 	pq = NULL;
-retry:
 	pc = TAILQ_FIRST(&pmap->pm_pvchunk);
 	if (pc != NULL) {
 		for (field = 0; field < _NPCM; field++) {
@@ -2111,6 +2272,7 @@ retry:
 				TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
 			}
 			PV_STAT(pv_entry_spare--);
+			mtx_unlock(&pv_lock);
 			return (pv);
 		}
 	}
@@ -2119,26 +2281,10 @@ retry:
 	    VM_ALLOC_SYSTEM : VM_ALLOC_NORMAL) | VM_ALLOC_NOOBJ |
 	    VM_ALLOC_WIRED);
 	if (m == NULL) {
-		if (try) {
-			pv_entry_count--;
-			PV_STAT(pc_chunk_tryfail++);
-			return (NULL);
-		}
-		/*
-		 * Reclaim pv entries: At first, destroy mappings to inactive
-		 * pages.  After that, if a pv chunk entry is still needed,
-		 * destroy mappings to active pages.
-		 */
-		if (pq == NULL) {
-			PV_STAT(pmap_collect_inactive++);
-			pq = &vm_page_queues[PQ_INACTIVE];
-		} else if (pq == &vm_page_queues[PQ_INACTIVE]) {
-			PV_STAT(pmap_collect_active++);
-			pq = &vm_page_queues[PQ_ACTIVE];
-		} else
-			panic("get_pv_entry: increase vm.pmap.shpgperproc");
-		pmap_collect(pmap, pq);
-		goto retry;
+		pv_entry_count--;
+		PV_STAT(pc_chunk_tryfail++);
+		mtx_unlock(&pv_lock);
+		return (NULL);
 	}
 	PV_STAT(pc_chunk_count++);
 	PV_STAT(pc_chunk_allocs++);
@@ -2152,9 +2298,64 @@ retry:
 	pv = &pc->pc_pventry[0];
 	TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
 	PV_STAT(pv_entry_spare += _NPCPV - 1);
+
+	mtx_unlock(&pv_lock);
 	return (pv);
 }
 
+static void
+pmap_pv_list_free(pmap_t pmap, struct pv_list_head *pv_list)
+{
+	pv_entry_t pv;
+
+	while (!TAILQ_EMPTY(pv_list)) {
+		pv = TAILQ_FIRST(pv_list);
+		TAILQ_REMOVE(pv_list, pv, pv_list);
+		free_pv_entry(pmap, pv);
+	}
+}
+
+static boolean_t
+pmap_pv_list_alloc(pmap_t pmap, int count, struct pv_list_head *pv_list)
+{
+	pv_entry_t pv;
+	int i;
+	boolean_t slept;
+
+	slept = FALSE;
+	for (i = 0; i < count; i++) {
+		while ((pv = get_pv_entry(pmap)) == NULL) {
+			PMAP_UNLOCK(pmap);
+			slept = TRUE;
+			VM_WAIT;
+			PMAP_LOCK(pmap);
+		}
+		TAILQ_INSERT_HEAD(pv_list, pv, pv_list);
+	}
+
+	return (slept);
+}
+
+static boolean_t
+pmap_pv_list_try_alloc(pmap_t pmap, int count, struct pv_list_head *pv_list)
+{
+	pv_entry_t pv;
+	int i;
+	boolean_t success;
+
+	success = TRUE;
+	for (i = 0; i < count; i++) {
+		if ((pv = get_pv_entry(pmap)) == NULL) {
+			success = FALSE;
+			pmap_pv_list_free(pmap, pv_list);
+			goto done;
+		}
+		TAILQ_INSERT_HEAD(pv_list, pv, pv_list);
+	}
+done:
+	return (success);
+}
+
 /*
  * First find and then remove the pv entry for the specified pmap and virtual
  * address from the specified pv list.  Returns the pv entry if found and NULL
@@ -2166,7 +2367,8 @@ pmap_pvh_remove(struct md_page *pvh, pma
 {
 	pv_entry_t pv;
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+
 	TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) {
 		if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
 			TAILQ_REMOVE(&pvh->pv_list, pv, pv_list);
@@ -2182,27 +2384,37 @@ pmap_pvh_remove(struct md_page *pvh, pma
  * entries for each of the 4KB page mappings.
  */
 static void
-pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa)
+pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
+	struct pv_list_head *pv_list)
 {
 	struct md_page *pvh;
 	pv_entry_t pv;
 	vm_offset_t va_last;
 	vm_page_t m;
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+	PA_LOCK_ASSERT(pa, MA_OWNED);
 	KASSERT((pa & PDRMASK) == 0,
 	    ("pmap_pv_demote_pde: pa is not 2mpage aligned"));
 
-	/*
-	 * Transfer the 2mpage's pv entry for this mapping to the first
-	 * page's pv list.
-	 */
+	 /* Transfer the 2mpage's pv entry for this mapping to the first
+	  *  page's pv list.
+	  */
 	pvh = pa_to_pvh(pa);
 	va = trunc_2mpage(va);
 	pv = pmap_pvh_remove(pvh, pmap, va);
 	KASSERT(pv != NULL, ("pmap_pv_demote_pde: pv not found"));
 	m = PHYS_TO_VM_PAGE(pa);
+#ifdef INVARIANTS
+		if (va == 0) {
+			printf("inserting va==0\n");
+			kdb_backtrace();
+		}
+#endif
+	vm_page_lock(m);
 	TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
+	vm_page_unlock(m);
+	
 	/* Instantiate the remaining NPTEPG - 1 pv entries. */
 	va_last = va + NBPDR - PAGE_SIZE;
 	do {
@@ -2210,8 +2422,20 @@ pmap_pv_demote_pde(pmap_t pmap, vm_offse
 		KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0,
 		    ("pmap_pv_demote_pde: page %p is not managed", m));
 		va += PAGE_SIZE;
-		pmap_insert_entry(pmap, va, m);
+		pv = TAILQ_FIRST(pv_list);
+		TAILQ_REMOVE(pv_list, pv, pv_list);
+#ifdef INVARIANTS
+		if (va == 0) {
+			printf("inserting va==0\n");
+			kdb_backtrace();
+		}
+#endif		
+		pv->pv_va = va;
+		vm_page_lock(m);
+		TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
+		vm_page_unlock(m);
 	} while (va < va_last);
+
 }
 
 /*
@@ -2227,7 +2451,7 @@ pmap_pv_promote_pde(pmap_t pmap, vm_offs
 	vm_offset_t va_last;
 	vm_page_t m;
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	PA_LOCK_ASSERT(pa, MA_OWNED);
 	KASSERT((pa & PDRMASK) == 0,
 	    ("pmap_pv_promote_pde: pa is not 2mpage aligned"));
 
@@ -2273,7 +2497,8 @@ pmap_remove_entry(pmap_t pmap, vm_page_t
 {
 	struct md_page *pvh;
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	vm_page_lock_assert(m, MA_OWNED);
+
 	pmap_pvh_free(&m->md, pmap, va);
 	if (TAILQ_EMPTY(&m->md.pv_list)) {
 		pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
@@ -2283,22 +2508,6 @@ pmap_remove_entry(pmap_t pmap, vm_page_t
 }
 
 /*
- * Create a pv entry for page at pa for
- * (pmap, va).
- */
-static void
-pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
-{
-	pv_entry_t pv;
-
-	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
-	pv = get_pv_entry(pmap, FALSE);
-	pv->pv_va = va;
-	TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
-}
-
-/*
  * Conditionally create a pv entry.
  */
 static boolean_t
@@ -2307,9 +2516,15 @@ pmap_try_insert_pv_entry(pmap_t pmap, vm
 	pv_entry_t pv;
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	vm_page_lock_assert(m, MA_OWNED);
 	if (pv_entry_count < pv_entry_high_water && 
-	    (pv = get_pv_entry(pmap, TRUE)) != NULL) {
+	    (pv = get_pv_entry(pmap)) != NULL) {
+#ifdef INVARIANTS
+		if (va == 0) {
+			printf("inserting va==0\n");
+			kdb_backtrace();
+		}
+#endif		
 		pv->pv_va = va;
 		TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
 		return (TRUE);
@@ -2326,9 +2541,16 @@ pmap_pv_insert_pde(pmap_t pmap, vm_offse
 	struct md_page *pvh;
 	pv_entry_t pv;
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	PA_LOCK_ASSERT(pa, MA_OWNED);
+	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 	if (pv_entry_count < pv_entry_high_water && 
-	    (pv = get_pv_entry(pmap, TRUE)) != NULL) {
+	    (pv = get_pv_entry(pmap)) != NULL) {
+#ifdef INVARIANTS
+		if (va == 0) {
+			printf("inserting va==0\n");
+			kdb_backtrace();
+		}
+#endif		
 		pv->pv_va = va;
 		pvh = pa_to_pvh(pa);
 		TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list);
@@ -2356,7 +2578,8 @@ pmap_fill_ptp(pt_entry_t *firstpte, pt_e
  * mapping is invalidated.
  */
 static boolean_t
-pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va)
+pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va,
+	struct pv_list_head *pv_list)
 {
 	pd_entry_t newpde, oldpde;
 	pt_entry_t *firstpte, newpte;
@@ -2392,7 +2615,7 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t 
 		    DMAP_MAX_ADDRESS ? VM_ALLOC_INTERRUPT : VM_ALLOC_NORMAL) |
 		    VM_ALLOC_NOOBJ | VM_ALLOC_WIRED)) == NULL) {
 			free = NULL;
-			pmap_remove_pde(pmap, pde, trunc_2mpage(va), &free);
+			pmap_remove_pde(pmap, pde, trunc_2mpage(va), &free, pv_list);
 			pmap_invalidate_page(pmap, trunc_2mpage(va));
 			pmap_free_zero_pages(free);
 			CTR2(KTR_PMAP, "pmap_demote_pde: failure for va %#lx"
@@ -2402,6 +2625,10 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t 
 		if (va < VM_MAXUSER_ADDRESS)
 			pmap->pm_stats.resident_count++;
 	}
+	if (TAILQ_EMPTY(pv_list) && ((oldpde & PG_MANAGED) != 0)) {
+		if (pmap_pv_list_try_alloc(pmap, NPTEPG-1, pv_list) == FALSE)
+			return (FALSE);
+	}
 	mptepa = VM_PAGE_TO_PHYS(mpte);
 	firstpte = (pt_entry_t *)PHYS_TO_DMAP(mptepa);
 	newpde = mptepa | PG_M | PG_A | (oldpde & PG_U) | PG_RW | PG_V;
@@ -2459,7 +2686,7 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t 
 	 * the 2mpage to referencing the page table page.
 	 */
 	if ((oldpde & PG_MANAGED) != 0)
-		pmap_pv_demote_pde(pmap, va, oldpde & PG_PS_FRAME);
+		pmap_pv_demote_pde(pmap, va, oldpde & PG_PS_FRAME, pv_list);
 
 	pmap_pde_demotions++;
 	CTR2(KTR_PMAP, "pmap_demote_pde: success for va %#lx"
@@ -2472,7 +2699,7 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t 
  */
 static int
 pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva,
-    vm_page_t *free)
+    vm_page_t *free, struct pv_list_head *pv_list)
 {
 	struct md_page *pvh;
 	pd_entry_t oldpde;
@@ -2499,6 +2726,10 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t 
 		eva = sva + NBPDR;
 		for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
 		    va < eva; va += PAGE_SIZE, m++) {
+			/*
+			 * XXX do we need to individually lock each page? 
+			 *
+			 */
 			if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
 				vm_page_dirty(m);
 			if (oldpde & PG_A)
@@ -2509,7 +2740,7 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t 
 		}
 	}
 	if (pmap == kernel_pmap) {
-		if (!pmap_demote_pde(pmap, pdq, sva))
+		if (!pmap_demote_pde(pmap, pdq, sva, pv_list))
 			panic("pmap_remove_pde: failed demotion");
 	} else {
 		mpte = pmap_lookup_pt_page(pmap, sva);
@@ -2526,6 +2757,7 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t 
 	return (pmap_unuse_pt(pmap, sva, *pmap_pdpe(pmap, sva), free));
 }
 
+
 /*
  * pmap_remove_pte: do the things to unmap a page in a process
  */
@@ -2549,6 +2781,7 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t 
 	pmap->pm_stats.resident_count -= 1;
 	if (oldpte & PG_MANAGED) {
 		m = PHYS_TO_VM_PAGE(oldpte & PG_FRAME);
+		vm_page_lock_assert(m, MA_OWNED);
 		if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
 			vm_page_dirty(m);
 		if (oldpte & PG_A)
@@ -2565,6 +2798,7 @@ static void
 pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, vm_page_t *free)
 {
 	pt_entry_t *pte;
+	vm_paddr_t pa = 0;
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 	if ((*pde & PG_V) == 0)
@@ -2572,10 +2806,89 @@ pmap_remove_page(pmap_t pmap, vm_offset_
 	pte = pmap_pde_to_pte(pde, va);
 	if ((*pte & PG_V) == 0)
 		return;
+	if  (*pte & PG_MANAGED)
+		(void)pa_tryrelock(pmap, *pte & PG_FRAME, &pa);
+
 	pmap_remove_pte(pmap, pte, va, *pde, free);
+	if (pa)
+		PA_UNLOCK(pa);
 	pmap_invalidate_page(pmap, va);
 }
 
+static void
+pmap_prealloc_pv_list(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
+	struct pv_list_head *pv_list)
+{
+	vm_offset_t va_next;
+	pml4_entry_t *pml4e;
+	pdp_entry_t *pdpe;
+	pd_entry_t ptpaddr, *pde;
+	pt_entry_t *pte;
+	int i, alloc_count;
+
+	alloc_count = 0;
+	PMAP_LOCK(pmap);
+	for (; sva < eva; sva = va_next) {
+
+		pml4e = pmap_pml4e(pmap, sva);
+		if ((*pml4e & PG_V) == 0) {
+			va_next = (sva + NBPML4) & ~PML4MASK;
+			if (va_next < sva)
+				va_next = eva;
+			continue;
+		}
+
+		pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
+		if ((*pdpe & PG_V) == 0) {
+			va_next = (sva + NBPDP) & ~PDPMASK;
+			if (va_next < sva)
+				va_next = eva;
+			continue;
+		}
+
+		/*
+		 * Calculate index for next page table.
+		 */
+		va_next = (sva + NBPDR) & ~PDRMASK;
+		if (va_next < sva)
+			va_next = eva;
+
+		pde = pmap_pdpe_to_pde(pdpe, sva);
+		ptpaddr = *pde;
+
+		/*
+		 * Weed out invalid mappings.
+		 */
+		if (ptpaddr == 0)
+			continue;
+
+		/*
+		 * Check for large page.
+		 */
+		if ((ptpaddr & PG_PS) != 0) {
+			alloc_count++;
+			continue;
+		}
+		/*
+		 * Limit our scan to either the end of the va represented
+		 * by the current page table page, or to the end of the
+		 * range being removed.
+		 */
+		if (va_next > eva)
+			va_next = eva;
+
+		for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
+		    sva += PAGE_SIZE) {
+			if (*pte == 0)
+				continue;
+		}
+	}
+	for (i = 0; i < alloc_count; i++)
+		pmap_pv_list_alloc(pmap, NPTEPG-1, pv_list);
+
+	PMAP_UNLOCK(pmap);
+}
+
 /*
  *	Remove the given range of addresses from the specified map.
  *
@@ -2590,7 +2903,9 @@ pmap_remove(pmap_t pmap, vm_offset_t sva
 	pdp_entry_t *pdpe;
 	pd_entry_t ptpaddr, *pde;
 	pt_entry_t *pte;
+	vm_paddr_t pa;
 	vm_page_t free = NULL;
+	struct pv_list_head pv_list;
 	int anyvalid;
 
 	/*
@@ -2599,11 +2914,19 @@ pmap_remove(pmap_t pmap, vm_offset_t sva
 	if (pmap->pm_stats.resident_count == 0)
 		return;
 
-	anyvalid = 0;
+	pa = anyvalid = 0;
+	TAILQ_INIT(&pv_list);
 
-	vm_page_lock_queues();
-	PMAP_LOCK(pmap);
+	/*
+	 * pre-allocate pvs
+	 *
+	 */
+	if ((pmap == kernel_pmap) &&
+	    (sva + PAGE_SIZE != eva)) 
+		pmap_prealloc_pv_list(pmap, sva, eva, &pv_list);
 
+	PMAP_LOCK(pmap);
+restart:
 	/*
 	 * special handling of removing one page.  a very
 	 * common operation and easy to short circuit some
@@ -2658,6 +2981,11 @@ pmap_remove(pmap_t pmap, vm_offset_t sva
 		 * Check for large page.
 		 */
 		if ((ptpaddr & PG_PS) != 0) {
+			if (pa_tryrelock(pmap, ptpaddr & PG_FRAME, &pa)) {
+				va_next = sva;
+				continue;
+			}
+
 			/*
 			 * Are we removing the entire large page?  If not,
 			 * demote the mapping and fall through.
@@ -2669,9 +2997,9 @@ pmap_remove(pmap_t pmap, vm_offset_t sva
 				 */
 				if ((ptpaddr & PG_G) == 0)
 					anyvalid = 1;
-				pmap_remove_pde(pmap, pde, sva, &free);
+				pmap_remove_pde(pmap, pde, sva, &free, &pv_list);
 				continue;
-			} else if (!pmap_demote_pde(pmap, pde, sva)) {
+			} else if (!pmap_demote_pde(pmap, pde, sva, &pv_list)) {
 				/* The large page mapping was destroyed. */
 				continue;
 			} else
@@ -2688,23 +3016,35 @@ pmap_remove(pmap_t pmap, vm_offset_t sva
 
 		for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
 		    sva += PAGE_SIZE) {
+			int ret;
+
 			if (*pte == 0)
 				continue;
 
+			if  ((*pte & PG_MANAGED) &&
+			    pa_tryrelock(pmap, *pte & PG_FRAME, &pa))
+				goto restart;
+
 			/*
 			 * The TLB entry for a PG_G mapping is invalidated
 			 * by pmap_remove_pte().
 			 */
 			if ((*pte & PG_G) == 0)
 				anyvalid = 1;
-			if (pmap_remove_pte(pmap, pte, sva, ptpaddr, &free))
+			ret = pmap_remove_pte(pmap, pte, sva, ptpaddr, &free);
+
+			if (ret)
 				break;
 		}
 	}
 out:
+	if (pa)
+		PA_UNLOCK(pa);

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-user@FreeBSD.ORG  Sat May 15 21:21:40 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 92271106566C;
	Sat, 15 May 2010 21:21:40 +0000 (UTC)
	(envelope-from kmacy@FreeBSD.org)
Received: from svn.freebsd.org (unknown [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 80EB78FC17;
	Sat, 15 May 2010 21:21:40 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4FLLeJs094353;
	Sat, 15 May 2010 21:21:40 GMT (envelope-from kmacy@svn.freebsd.org)
Received: (from kmacy@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4FLLejW094348;
	Sat, 15 May 2010 21:21:40 GMT (envelope-from kmacy@svn.freebsd.org)
Message-Id: <201005152121.o4FLLejW094348@svn.freebsd.org>
From: Kip Macy <kmacy@FreeBSD.org>
Date: Sat, 15 May 2010 21:21:40 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r208121 - in user/kmacy/stable_7_page_lock/sys:
	amd64/amd64 kern sys
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 15 May 2010 21:21:40 -0000

Author: kmacy
Date: Sat May 15 21:21:40 2010
New Revision: 208121
URL: http://svn.freebsd.org/changeset/base/208121

Log:
  MFH 207140:
  
  generalize lock stack operations and move to subr_lock.c

Modified:
  user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c
  user/kmacy/stable_7_page_lock/sys/kern/kern_mutex.c
  user/kmacy/stable_7_page_lock/sys/kern/subr_lock.c
  user/kmacy/stable_7_page_lock/sys/sys/lock.h
Directory Properties:
  user/kmacy/stable_7_page_lock/sys/   (props changed)
  user/kmacy/stable_7_page_lock/sys/cddl/contrib/opensolaris/   (props changed)
  user/kmacy/stable_7_page_lock/sys/contrib/dev/acpica/   (props changed)
  user/kmacy/stable_7_page_lock/sys/contrib/pf/   (props changed)

Modified: user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Sat May 15 21:18:15 2010	(r208120)
+++ user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Sat May 15 21:21:40 2010	(r208121)
@@ -295,73 +295,6 @@ static vm_offset_t pmap_kmem_choose(vm_o
 CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t));
 CTASSERT(1 << PTESHIFT == sizeof(pt_entry_t));
 
-
-#define LS_MAX		4
-struct lock_stack {
-	struct mtx *ls_array[LS_MAX];
-	int ls_top;
-};
-
-static void
-ls_init(struct lock_stack *ls)
-{
-
-	ls->ls_top = 0;
-}
-
-static void
-ls_push(struct lock_stack *ls, struct mtx *lock)
-{
-
-	KASSERT(ls->ls_top < LS_MAX, ("lock stack overflow"));
-	
-	ls->ls_array[ls->ls_top] = lock;
-	ls->ls_top++;
-	mtx_lock(lock);
-}
-
-
-static int
-ls_trypush(struct lock_stack *ls, struct mtx *lock)
-{
-
-	KASSERT(ls->ls_top < LS_MAX, ("lock stack overflow"));
-
-	if (mtx_trylock(lock) == 0)
-		return (0);
-	
-	ls->ls_array[ls->ls_top] = lock;
-	ls->ls_top++;
-	return (1);
-}
-
-#ifdef notyet
-static void
-ls_pop(struct lock_stack *ls)
-{
-	struct mtx *lock;
-
-	KASSERT(ls->ls_top > 0, ("lock stack underflow"));
-
-	ls->ls_top--;
-	lock = ls->ls_array[ls->ls_top];
-	mtx_unlock(lock);
-}
-#endif
-
-static void
-ls_popa(struct lock_stack *ls)
-{
-	struct mtx *lock;
-
-	KASSERT(ls->ls_top > 0, ("lock stack underflow"));
-
-	while (ls->ls_top > 0) {
-		ls->ls_top--;
-		lock = ls->ls_array[ls->ls_top];
-		mtx_unlock(lock);
-	}
-}
 #ifdef INVARIANTS
 extern void kdb_backtrace(void);
 #endif
@@ -3453,14 +3386,18 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	opa = 0;
 	opalocked = FALSE;
 	ls_init(&ls);
-	ls_push(&ls, PA_LOCKPTR(lockedpa));
-	ls_push(&ls, PMAP_LOCKPTR(pmap));
+	ls_push(&ls, &lock_class_mtx_sleep,
+	    (struct lock_object *)PA_LOCKPTR(lockedpa));
+	ls_push(&ls, &lock_class_mtx_sleep,
+	    (struct lock_object *)PMAP_LOCKPTR(pmap));
 	if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
 		while ((pv = get_pv_entry(pmap)) == NULL) {
 			ls_popa(&ls);
 			VM_WAIT;
-			ls_push(&ls, PA_LOCKPTR(lockedpa));
-			ls_push(&ls, PMAP_LOCKPTR(pmap));
+			ls_push(&ls, &lock_class_mtx_sleep,
+			    (struct lock_object *)PA_LOCKPTR(lockedpa));
+			ls_push(&ls, &lock_class_mtx_sleep,
+			    (struct lock_object *)PMAP_LOCKPTR(pmap));
 		}
 	}
 	
@@ -3484,8 +3421,10 @@ restart:
 	origpte = *pte;
 	if (opa && (opa != (origpte & PG_FRAME))) {
 		ls_popa(&ls);
-		ls_push(&ls, PA_LOCKPTR(lockedpa));
-		ls_push(&ls, PMAP_LOCKPTR(pmap));
+		ls_push(&ls, &lock_class_mtx_sleep,
+			    (struct lock_object *)PA_LOCKPTR(lockedpa));
+		ls_push(&ls, &lock_class_mtx_sleep,
+			    (struct lock_object *)PMAP_LOCKPTR(pmap));
 		opalocked = FALSE;
 		opa = 0;
 		goto restart;
@@ -3494,17 +3433,23 @@ restart:
 	opa = origpte & PG_FRAME;
 	if (opa && (opa != lockedpa) && (opalocked == FALSE)) {
 		opalocked = TRUE;
-		if (ls_trypush(&ls, PA_LOCKPTR(opa)) == 0) {
+		if (ls_trypush(&ls, &lock_class_mtx_sleep,
+			(struct lock_object *)PA_LOCKPTR(opa)) == 0) {
 			ls_popa(&ls);
 			if ((uintptr_t)PA_LOCKPTR(lockedpa) <
 			    (uintptr_t)PA_LOCKPTR(opa)) {
-				ls_push(&ls, PA_LOCKPTR(lockedpa));
-				ls_push(&ls, PA_LOCKPTR(opa));
+				ls_push(&ls, &lock_class_mtx_sleep,
+				    (struct lock_object *)PA_LOCKPTR(lockedpa));
+				ls_push(&ls, &lock_class_mtx_sleep,
+				    (struct lock_object *)PA_LOCKPTR(opa));
 			} else {
-				ls_push(&ls, PA_LOCKPTR(opa));
-				ls_push(&ls, PA_LOCKPTR(lockedpa));
+				ls_push(&ls, &lock_class_mtx_sleep,
+				    (struct lock_object *)PA_LOCKPTR(opa));
+				ls_push(&ls, &lock_class_mtx_sleep,
+				    (struct lock_object *)PA_LOCKPTR(lockedpa));
 			}
-			ls_push(&ls, PMAP_LOCKPTR(pmap));
+			ls_push(&ls, &lock_class_mtx_sleep,
+			    (struct lock_object *)PMAP_LOCKPTR(pmap));
 			goto restart;
 		}
 	}

Modified: user/kmacy/stable_7_page_lock/sys/kern/kern_mutex.c
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/kern/kern_mutex.c	Sat May 15 21:18:15 2010	(r208120)
+++ user/kmacy/stable_7_page_lock/sys/kern/kern_mutex.c	Sat May 15 21:21:40 2010	(r208121)
@@ -88,6 +88,8 @@ __FBSDID("$FreeBSD$");
 static void	db_show_mtx(struct lock_object *lock);
 #endif
 static void	lock_mtx(struct lock_object *lock, int how);
+static void	lock_full_mtx(struct lock_object *lock, char *file, int line);
+static int	trylock_mtx(struct lock_object *lock);
 static void	lock_spin(struct lock_object *lock, int how);
 static int	unlock_mtx(struct lock_object *lock);
 static int	unlock_spin(struct lock_object *lock);
@@ -103,6 +105,10 @@ struct lock_class lock_class_mtx_sleep =
 #endif
 	.lc_lock = lock_mtx,
 	.lc_unlock = unlock_mtx,
+	.lc_lock_full = lock_full_mtx,
+	.lc_trylock = trylock_mtx,
+	
+	
 };
 struct lock_class lock_class_mtx_spin = {
 	.lc_name = "spin mutex",
@@ -142,6 +148,25 @@ lock_mtx(struct lock_object *lock, int h
 }
 
 void
+lock_full_mtx(struct lock_object *lock, char *file, int line)
+{
+
+#if LOCK_DEBUG > 0 || defined(MUTEX_NOINLINE)
+	_mtx_lock_flags((struct mtx *)lock, 0, file, line);
+#else
+	_get_sleep_lock((struct mtx *)lock, curthread, 0, file, line);
+#endif	
+	
+}
+
+int
+trylock_mtx(struct lock_object *lock)
+{
+
+	return (mtx_trylock((struct mtx *)lock));
+}
+
+void
 lock_spin(struct lock_object *lock, int how)
 {
 
@@ -154,7 +179,7 @@ unlock_mtx(struct lock_object *lock)
 	struct mtx *m;
 
 	m = (struct mtx *)lock;
-	mtx_assert(m, MA_OWNED | MA_NOTRECURSED);
+	mtx_assert(m, MA_OWNED);
 	mtx_unlock(m);
 	return (0);
 }

Modified: user/kmacy/stable_7_page_lock/sys/kern/subr_lock.c
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/kern/subr_lock.c	Sat May 15 21:18:15 2010	(r208120)
+++ user/kmacy/stable_7_page_lock/sys/kern/subr_lock.c	Sat May 15 21:21:40 2010	(r208121)
@@ -354,3 +354,69 @@ void _lock_profile_release_lock(struct l
         l->lpo_contest_holding = 0;
 }
 #endif
+
+void
+ls_init(struct lock_stack *ls)
+{
+
+	ls->ls_top = 0;
+}
+
+void
+_ls_push(struct lock_stack *ls, struct lock_class *class, struct lock_object *lock,
+    char *file, int line)
+{
+
+	KASSERT(ls->ls_top < LS_MAX, ("lock stack overflow"));
+	
+	ls->ls_array[ls->ls_top].lse_lock = lock;
+	ls->ls_array[ls->ls_top].lse_class = class;
+	ls->ls_top++;
+	class->lc_lock_full(lock, file, line);
+}
+
+int
+ls_trypush(struct lock_stack *ls, struct lock_class *class, struct lock_object *lock)
+{
+
+	KASSERT(ls->ls_top < LS_MAX, ("lock stack overflow"));
+
+	if (class->lc_trylock(lock) == 0)
+		return (0);
+	
+	ls->ls_array[ls->ls_top].lse_lock = lock;
+	ls->ls_array[ls->ls_top].lse_class = class;
+	ls->ls_top++;
+	return (1);
+}
+
+void
+ls_pop(struct lock_stack *ls)
+{
+	struct lock_object *lock;
+	struct lock_class *class;
+
+	KASSERT(ls->ls_top > 0, ("lock stack underflow"));
+
+	ls->ls_top--;
+	lock = ls->ls_array[ls->ls_top].lse_lock;
+	class = ls->ls_array[ls->ls_top].lse_class;	
+	class->lc_unlock(lock);
+}
+
+void
+ls_popa(struct lock_stack *ls)
+{
+	struct lock_object *lock;
+	struct lock_class *class;
+
+	KASSERT(ls->ls_top > 0, ("lock stack underflow"));
+
+	while (ls->ls_top > 0) {
+		ls->ls_top--;
+		lock = ls->ls_array[ls->ls_top].lse_lock;
+		class = ls->ls_array[ls->ls_top].lse_class;
+		class->lc_unlock(lock);
+	}
+}
+

Modified: user/kmacy/stable_7_page_lock/sys/sys/lock.h
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/sys/lock.h	Sat May 15 21:18:15 2010	(r208120)
+++ user/kmacy/stable_7_page_lock/sys/sys/lock.h	Sat May 15 21:21:40 2010	(r208121)
@@ -60,6 +60,8 @@ struct lock_class {
 	void	(*lc_ddb_show)(struct lock_object *lock);
 	void	(*lc_lock)(struct lock_object *lock, int how);
 	int	(*lc_unlock)(struct lock_object *lock);
+	void	(*lc_lock_full)(struct lock_object *lock, char *file, int line);
+	int	(*lc_trylock)(struct lock_object *lock);
 };
 
 #define	LC_SLEEPLOCK	0x00000001	/* Sleep lock. */
@@ -248,6 +250,29 @@ void	witness_display_spinlock(struct loc
 int	witness_line(struct lock_object *);
 const char *witness_file(struct lock_object *);
 
+
+#define LS_MAX		4
+struct lock_stack_entry {
+	struct lock_object	*lse_lock;
+	struct lock_class	*lse_class;
+};
+
+struct lock_stack {
+	struct lock_stack_entry ls_array[LS_MAX];
+	int ls_top;
+};
+
+
+#define ls_push(ls, class, m)	_ls_push((ls), (class), (m), LOCK_FILE, LOCK_LINE)
+
+void	ls_init(struct lock_stack *ls);
+void 	_ls_push(struct lock_stack *ls, struct lock_class *class,
+    struct lock_object *lock, char *file, int line);
+int 	ls_trypush(struct lock_stack *ls, struct lock_class *class,
+    struct lock_object *lock);
+void 	ls_pop(struct lock_stack *ls);
+void 	ls_popa(struct lock_stack *ls);
+
 #ifdef	WITNESS
 
 /* Flags for witness_warn(). */

From owner-svn-src-user@FreeBSD.ORG  Sat May 15 23:00:41 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 691DA106566B;
	Sat, 15 May 2010 23:00:41 +0000 (UTC)
	(envelope-from kmacy@FreeBSD.org)
Received: from svn.freebsd.org (unknown [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 578BC8FC08;
	Sat, 15 May 2010 23:00:41 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4FN0fCb016250;
	Sat, 15 May 2010 23:00:41 GMT (envelope-from kmacy@svn.freebsd.org)
Received: (from kmacy@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4FN0fDa016243;
	Sat, 15 May 2010 23:00:41 GMT (envelope-from kmacy@svn.freebsd.org)
Message-Id: <201005152300.o4FN0fDa016243@svn.freebsd.org>
From: Kip Macy <kmacy@FreeBSD.org>
Date: Sat, 15 May 2010 23:00:41 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r208123 - in user/kmacy/stable_7_page_lock/sys:
	amd64/amd64 amd64/include vm
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 15 May 2010 23:00:41 -0000

Author: kmacy
Date: Sat May 15 23:00:40 2010
New Revision: 208123
URL: http://svn.freebsd.org/changeset/base/208123

Log:
  further converge with HEAD - MFH 207928
  - make pa_tryrelock global as vm_page_pa_tryrelock
  - pad out page_queue_mtx and page_queue_free_mtx
  - add CACHE_LINE_SHIFT and CACHE_LINE_SIZE to amd64/include/param.h
  - define PA_LOCK_COUNT as 256 on SMP amd64
  - remove pmap_collect
  - add PA_UNLOCK_COND
  - add generation counter to amd64's pmap
  - remove INVARIANTS checks for pv_va, locking is known to work
  - fix pmap_copy failure handling (do unlock before breaking out of loop)
  - make amd64's pmap return convention style(9) compliant

Modified:
  user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c
  user/kmacy/stable_7_page_lock/sys/amd64/include/param.h
  user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h
  user/kmacy/stable_7_page_lock/sys/amd64/include/vmparam.h
  user/kmacy/stable_7_page_lock/sys/vm/vm_page.c
  user/kmacy/stable_7_page_lock/sys/vm/vm_page.h
  user/kmacy/stable_7_page_lock/sys/vm/vm_param.h
Directory Properties:
  user/kmacy/stable_7_page_lock/sys/   (props changed)
  user/kmacy/stable_7_page_lock/sys/cddl/contrib/opensolaris/   (props changed)
  user/kmacy/stable_7_page_lock/sys/contrib/dev/acpica/   (props changed)
  user/kmacy/stable_7_page_lock/sys/contrib/pf/   (props changed)

Modified: user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Sat May 15 22:39:33 2010	(r208122)
+++ user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Sat May 15 23:00:40 2010	(r208123)
@@ -165,28 +165,7 @@ __FBSDID("$FreeBSD$");
 #define PV_STAT(x)	do { } while (0)
 #endif
 
-#define	CACHE_LINE_FETCH_SIZE	128
-#define	PA_LOCK_PAD		CACHE_LINE_FETCH_SIZE
-
-struct vp_lock {
-	struct mtx	vp_lock;
-	unsigned char	pad[(PA_LOCK_PAD - sizeof(struct mtx))];
-};
-
-#define	pa_index(pa)	((pa) >> PDRSHIFT)
-#define	pa_to_pvh(pa)	(&pv_table[pa_index(pa)])
-
-#define	PA_LOCKPTR(pa)	&pa_lock[pa_index((pa)) % PA_LOCK_COUNT].vp_lock
-#define	PA_LOCK(pa)	mtx_lock(PA_LOCKPTR(pa))
-#define	PA_TRYLOCK(pa)	mtx_trylock(PA_LOCKPTR(pa))
-#define	PA_UNLOCK(pa)	mtx_unlock(PA_LOCKPTR(pa))
-#define	PA_LOCK_ASSERT(pa, a)	mtx_assert(PA_LOCKPTR(pa), (a))
-
-#define	PA_LOCK_COUNT	64
-
-struct mtx pv_lock __aligned(128);
-struct vp_lock pa_lock[PA_LOCK_COUNT] __aligned(128);
-
+#define	pa_to_pvh(pa)		(&pv_table[pa_index(pa)])
 
 struct pmap kernel_pmap_store;
 
@@ -204,15 +183,6 @@ static int pg_ps_enabled = 1;
 SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RDTUN, &pg_ps_enabled, 0,
     "Are large page mappings enabled?");
 
-static uint64_t pmap_tryrelock_calls;
-SYSCTL_QUAD(_vm_pmap, OID_AUTO, tryrelock_calls, CTLFLAG_RD,
-    &pmap_tryrelock_calls, 0, "Number of tryrelock calls");
-
-static int pmap_tryrelock_restart;
-SYSCTL_INT(_vm_pmap, OID_AUTO, tryrelock_restart, CTLFLAG_RD,
-    &pmap_tryrelock_restart, 0, "Number of tryrelock restarts");
-
-
 static u_int64_t	KPTphys;	/* phys addr of kernel level 1 */
 static u_int64_t	KPDphys;	/* phys addr of kernel level 2 */
 u_int64_t		KPDPphys;	/* phys addr of kernel level 3 */
@@ -295,9 +265,6 @@ static vm_offset_t pmap_kmem_choose(vm_o
 CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t));
 CTASSERT(1 << PTESHIFT == sizeof(pt_entry_t));
 
-#ifdef INVARIANTS
-extern void kdb_backtrace(void);
-#endif
 /*
  * Move the kernel virtual free pointer to the next
  * 2MB.  This is used to help improve performance
@@ -310,7 +277,7 @@ pmap_kmem_choose(vm_offset_t addr)
 	vm_offset_t newaddr = addr;
 
 	newaddr = (addr + (NBPDR - 1)) & ~(NBPDR - 1);
-	return newaddr;
+	return (newaddr);
 }
 
 /********************/
@@ -321,7 +288,7 @@ pmap_kmem_choose(vm_offset_t addr)
 static __inline vm_pindex_t
 pmap_pde_pindex(vm_offset_t va)
 {
-	return va >> PDRSHIFT;
+	return (va >> PDRSHIFT);
 }
 
 
@@ -380,7 +347,7 @@ pmap_pdpe(pmap_t pmap, vm_offset_t va)
 
 	pml4e = pmap_pml4e(pmap, va);
 	if ((*pml4e & PG_V) == 0)
-		return NULL;
+		return (NULL);
 	return (pmap_pml4e_to_pdpe(pml4e, va));
 }
 
@@ -402,7 +369,7 @@ pmap_pde(pmap_t pmap, vm_offset_t va)
 
 	pdpe = pmap_pdpe(pmap, va);
 	if (pdpe == NULL || (*pdpe & PG_V) == 0)
-		 return NULL;
+		return (NULL);
 	return (pmap_pdpe_to_pde(pdpe, va));
 }
 
@@ -424,7 +391,7 @@ pmap_pte(pmap_t pmap, vm_offset_t va)
 
 	pde = pmap_pde(pmap, va);
 	if (pde == NULL || (*pde & PG_V) == 0)
-		return NULL;
+		return (NULL);
 	if ((*pde & PG_PS) != 0)	/* compat with i386 pmap_pte() */
 		return ((pt_entry_t *)pde);
 	return (pmap_pde_to_pte(pde, va));
@@ -447,37 +414,6 @@ vtopde(vm_offset_t va)
 	return (PDmap + ((va >> PDRSHIFT) & mask));
 }
 
-/*
- * Try to acquire a physical address lock while a pmap is locked.  If we
- * fail to trylock we unlock and lock the pmap directly and cache the
- * locked pa in *locked.  The caller should then restart their loop in case
- * the virtual to physical mapping has changed.
- */
-static int
-pa_tryrelock(pmap_t pmap, vm_paddr_t pa, vm_paddr_t *locked)
-{
-	vm_paddr_t lockpa;
-
-	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
-	atomic_add_long((volatile long *)&pmap_tryrelock_calls, 1);
-	lockpa = *locked;
-	*locked = pa;
-	if (lockpa) {
-		PA_LOCK_ASSERT(lockpa, MA_OWNED);
-		if (PA_LOCKPTR(pa) == PA_LOCKPTR(lockpa))
-			return (0);
-		PA_UNLOCK(lockpa);
-	}
-	if (PA_TRYLOCK(pa))
-		return 0;
-	PMAP_UNLOCK(pmap);
-	PA_LOCK(pa);
-	PMAP_LOCK(pmap);
-	atomic_add_int((volatile int *)&pmap_tryrelock_restart, 1);
-
-	return (EAGAIN);
-}
-
 static u_int64_t
 allocpages(vm_paddr_t *firstaddr, int n)
 {
@@ -576,7 +512,6 @@ pmap_bootstrap(vm_paddr_t *firstaddr)
 {
 	vm_offset_t va;
 	pt_entry_t *pte, *unused;
-	int i;	
 
 	/*
 	 * Create an initial set of page tables to run the kernel in.
@@ -635,13 +570,6 @@ pmap_bootstrap(vm_paddr_t *firstaddr)
 
 	/* Initialize the PAT MSR. */
 	pmap_init_pat();
-
-		/* Setup page locks. */
-	for (i = 0; i < PA_LOCK_COUNT; i++)
-		mtx_init(&pa_lock[i].vp_lock, "page lock", NULL,
-		    MTX_DEF | MTX_RECURSE | MTX_DUPOK);
-	mtx_init(&pv_lock, "pv list lock", NULL, MTX_DEF);
-
 }
 
 /*
@@ -697,14 +625,6 @@ pmap_page_init(vm_page_t m)
 	m->md.pat_mode = PAT_WRITE_BACK;
 }
 
-struct mtx *
-pmap_page_lockptr(vm_page_t m)
-{
-
-	KASSERT(m != NULL, ("pmap_page_lockptr: NULL page"));
-	return (PA_LOCKPTR(VM_PAGE_TO_PHYS(m)));
-}
-
 /*
  *	Initialize the pmap module.
  *	Called by vm_init, to initialize any structures that the pmap
@@ -824,7 +744,6 @@ static u_long pmap_pde_promotions;
 SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, promotions, CTLFLAG_RD,
     &pmap_pde_promotions, 0, "2MB page promotions");
 
-
 /***************************************************
  * Low level helper routines.....
  ***************************************************/
@@ -1238,9 +1157,9 @@ retry:
 	if (pdep != NULL && (pde = *pdep)) {
 		if (pde & PG_PS) {
 			if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) {
-				if (pa_tryrelock(pmap, pde & PG_PS_FRAME, &pa))
+				if (vm_page_pa_tryrelock(pmap, (pde & PG_PS_FRAME) |
+				       (va & PDRMASK), &pa))
 					goto retry;
-
 				m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) |
 				    (va & PDRMASK));
 				vm_page_hold(m);
@@ -1249,15 +1168,14 @@ retry:
 			pte = *pmap_pde_to_pte(pdep, va);
 			if ((pte & PG_V) &&
 			    ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) {
-				if (pa_tryrelock(pmap, pte & PG_FRAME, &pa))
+				if (vm_page_pa_tryrelock(pmap, pte & PG_FRAME, &pa))
 					goto retry;
 				m = PHYS_TO_VM_PAGE(pte & PG_FRAME);
 				vm_page_hold(m);
 			}
 		}
 	}
-	if (pa)
-		PA_UNLOCK(pa);
+	PA_UNLOCK_COND(pa);
 	PMAP_UNLOCK(pmap);
 	return (m);
 }
@@ -1287,7 +1205,7 @@ pmap_kextract(vm_offset_t va)
 			pa = (pa & PG_FRAME) | (va & PAGE_MASK);
 		}
 	}
-	return pa;
+	return (pa);
 }
 
 /***************************************************
@@ -1517,9 +1435,9 @@ pmap_unwire_pte_hold(pmap_t pmap, vm_off
 
 	--m->wire_count;
 	if (m->wire_count == 0)
-		return _pmap_unwire_pte_hold(pmap, va, m, free);
+		return (_pmap_unwire_pte_hold(pmap, va, m, free));
 	else
-		return 0;
+		return (0);
 }
 
 static int 
@@ -1575,7 +1493,7 @@ _pmap_unwire_pte_hold(pmap_t pmap, vm_of
 	 */
 	pmap_add_delayed_free_list(m, free, TRUE);
 	
-	return 1;
+	return (1);
 }
 
 /*
@@ -1588,10 +1506,10 @@ pmap_unuse_pt(pmap_t pmap, vm_offset_t v
 	vm_page_t mpte;
 
 	if (va >= VM_MAXUSER_ADDRESS)
-		return 0;
+		return (0);
 	KASSERT(ptepde != 0, ("pmap_unuse_pt: ptepde != 0"));
 	mpte = PHYS_TO_VM_PAGE(ptepde & PG_FRAME);
-	return pmap_unwire_pte_hold(pmap, va, mpte, free);
+	return (pmap_unwire_pte_hold(pmap, va, mpte, free));
 }
 
 void
@@ -1782,7 +1700,7 @@ _pmap_allocpte(pmap_t pmap, vm_paddr_t p
 
 	pmap->pm_stats.resident_count++;
 
-	return m;
+	return (m);
 }
 
 static vm_page_t
@@ -2049,75 +1967,6 @@ SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry
 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
 	"Current number of spare pv entries");
 
-static int pmap_collect_inactive, pmap_collect_active;
-
-SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_inactive, CTLFLAG_RD, &pmap_collect_inactive, 0,
-	"Current number times pmap_collect called on inactive queue");
-SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_active, CTLFLAG_RD, &pmap_collect_active, 0,
-	"Current number times pmap_collect called on active queue");
-#endif
-
-/*
- * We are in a serious low memory condition.  Resort to
- * drastic measures to free some pages so we can allocate
- * another pv entry chunk.  This is normally called to
- * unmap inactive pages, and if necessary, active pages.
- *
- * We do not, however, unmap 2mpages because subsequent accesses will
- * allocate per-page pv entries until repromotion occurs, thereby
- * exacerbating the shortage of free pv entries.
- */
-#ifdef nomore
-static void
-pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
-{
-	struct md_page *pvh;
-	pd_entry_t *pde;
-	pmap_t pmap;
-	pt_entry_t *pte, tpte;
-	pv_entry_t next_pv, pv;
-	vm_offset_t va;
-	vm_page_t m, free;
-
-	TAILQ_FOREACH(m, &vpq->pl, pageq) {
-		if (m->hold_count || m->busy)
-			continue;
-		TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
-			pmap = PV_PMAP(pv);
-			va = pv->pv_va;
-			/* Avoid deadlock and lock recursion. */
-			if (pmap > locked_pmap)
-				PMAP_LOCK(pmap);
-			else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap))
-				continue;
-			pmap->pm_stats.resident_count--;
-			pde = pmap_pde(pmap, va);
-			KASSERT((*pde & PG_PS) == 0, ("pmap_collect: found"
-			    " a 2mpage in page %p's pv list", m));
-			pte = pmap_pde_to_pte(pde, va);
-			tpte = pte_load_clear(pte);
-			KASSERT((tpte & PG_W) == 0,
-			    ("pmap_collect: wired pte %#lx", tpte));
-			if (tpte & PG_A)
-				vm_page_flag_set(m, PG_REFERENCED);
-			if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
-				vm_page_dirty(m);
-			free = NULL;
-			pmap_unuse_pt(pmap, va, *pde, &free);
-			pmap_invalidate_page(pmap, va);
-			pmap_free_zero_pages(free);
-			TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
-			if (TAILQ_EMPTY(&m->md.pv_list)) {
-				pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
-				if (TAILQ_EMPTY(&pvh->pv_list))
-					vm_page_flag_clear(m, PG_WRITEABLE);
-			}
-			free_pv_entry(pmap, pv);
-			if (pmap != locked_pmap)
-				PMAP_UNLOCK(pmap);
-		}
-	}
-}
 #endif
 
 /*
@@ -2131,10 +1980,9 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
 	int idx, field, bit;
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
-	mtx_lock(&pv_lock);
 	PV_STAT(pv_entry_frees++);
 	PV_STAT(pv_entry_spare++);
-	pv_entry_count--;
+	atomic_add_int(&pv_entry_count, -1);
 	pc = pv_to_chunk(pv);
 	idx = pv - &pc->pc_pventry[0];
 	field = idx / 64;
@@ -2145,7 +1993,6 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
 	if (pc->pc_map[0] != PC_FREE0 || pc->pc_map[1] != PC_FREE1 ||
 	    pc->pc_map[2] != PC_FREE2) {
 		TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
-		mtx_unlock(&pv_lock);
 		return;
 	}
 	PV_STAT(pv_entry_spare -= _NPCPV);
@@ -2154,7 +2001,6 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
 	/* entire chunk is free, return it */
 	m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
 	dump_drop_page(m->phys_addr);
-	mtx_unlock(&pv_lock);
 	KASSERT(m->wire_count == 1, ("wire_count == %d", m->wire_count));
 	m->wire_count--;
 	atomic_subtract_int(&cnt.v_wire_count, 1);
@@ -2178,9 +2024,8 @@ get_pv_entry(pmap_t pmap)
 	vm_page_t m;
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
-	mtx_lock(&pv_lock);
 	PV_STAT(pv_entry_allocs++);
-	pv_entry_count++;
+	atomic_add_int(&pv_entry_count, 1);
 	if (pv_entry_count > pv_entry_high_water)
 		if (ratecheck(&lastprint, &printinterval))
 			printf("Approaching the limit on PV entries, consider "
@@ -2205,7 +2050,6 @@ get_pv_entry(pmap_t pmap)
 				TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
 			}
 			PV_STAT(pv_entry_spare--);
-			mtx_unlock(&pv_lock);
 			return (pv);
 		}
 	}
@@ -2214,9 +2058,8 @@ get_pv_entry(pmap_t pmap)
 	    VM_ALLOC_SYSTEM : VM_ALLOC_NORMAL) | VM_ALLOC_NOOBJ |
 	    VM_ALLOC_WIRED);
 	if (m == NULL) {
-		pv_entry_count--;
 		PV_STAT(pc_chunk_tryfail++);
-		mtx_unlock(&pv_lock);
+		atomic_add_int(&pv_entry_count, -1);
 		return (NULL);
 	}
 	PV_STAT(pc_chunk_count++);
@@ -2231,8 +2074,6 @@ get_pv_entry(pmap_t pmap)
 	pv = &pc->pc_pventry[0];
 	TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
 	PV_STAT(pv_entry_spare += _NPCPV - 1);
-
-	mtx_unlock(&pv_lock);
 	return (pv);
 }
 
@@ -2317,37 +2158,35 @@ pmap_pvh_remove(struct md_page *pvh, pma
  * entries for each of the 4KB page mappings.
  */
 static void
-pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
+pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t paddr,
 	struct pv_list_head *pv_list)
 {
 	struct md_page *pvh;
 	pv_entry_t pv;
 	vm_offset_t va_last;
 	vm_page_t m;
+	vm_paddr_t pa = 0;
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
-	PA_LOCK_ASSERT(pa, MA_OWNED);
+	PA_LOCK_ASSERT(paddr, MA_OWNED);
 	KASSERT((pa & PDRMASK) == 0,
 	    ("pmap_pv_demote_pde: pa is not 2mpage aligned"));
 
 	 /* Transfer the 2mpage's pv entry for this mapping to the first
 	  *  page's pv list.
 	  */
-	pvh = pa_to_pvh(pa);
+	pvh = pa_to_pvh(paddr);
 	va = trunc_2mpage(va);
 	pv = pmap_pvh_remove(pvh, pmap, va);
 	KASSERT(pv != NULL, ("pmap_pv_demote_pde: pv not found"));
-	m = PHYS_TO_VM_PAGE(pa);
-#ifdef INVARIANTS
-		if (va == 0) {
-			printf("inserting va==0\n");
-			kdb_backtrace();
-		}
-#endif
-	vm_page_lock(m);
+	m = PHYS_TO_VM_PAGE(paddr);
 	TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
-	vm_page_unlock(m);
-	
+	/* We open ourselves up to an LOR by doing the page lock acquisitions
+	 * with the pmap lock held - which raises the question as to whether
+	 * we should use vm_page_pa_tryrelock (can the pmap be corrupted if we allow it
+	 * to be changed during a demotion?) or should we lock the entire range
+	 * in advance? Either option is a bit awkward.
+	 */
 	/* Instantiate the remaining NPTEPG - 1 pv entries. */
 	va_last = va + NBPDR - PAGE_SIZE;
 	do {
@@ -2357,18 +2196,11 @@ pmap_pv_demote_pde(pmap_t pmap, vm_offse
 		va += PAGE_SIZE;
 		pv = TAILQ_FIRST(pv_list);
 		TAILQ_REMOVE(pv_list, pv, pv_list);
-#ifdef INVARIANTS
-		if (va == 0) {
-			printf("inserting va==0\n");
-			kdb_backtrace();
-		}
-#endif		
 		pv->pv_va = va;
-		vm_page_lock(m);
+		vm_page_pa_tryrelock(pmap, VM_PAGE_TO_PHYS(m), &pa);
 		TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
-		vm_page_unlock(m);
 	} while (va < va_last);
-
+	PA_UNLOCK_COND(pa);
 }
 
 /*
@@ -2390,10 +2222,7 @@ pmap_pv_promote_pde(pmap_t pmap, vm_offs
 
 	/*
 	 * Transfer the first page's pv entry for this mapping to the
-	 * 2mpage's pv list.  Aside from avoiding the cost of a call
-	 * to get_pv_entry(), a transfer avoids the possibility that
-	 * get_pv_entry() calls pmap_collect() and that pmap_collect()
-	 * removes one of the mappings that is being promoted.
+	 * 2mpage's pv list. 
 	 */
 	m = PHYS_TO_VM_PAGE(pa);
 	va = trunc_2mpage(va);
@@ -2452,12 +2281,6 @@ pmap_try_insert_pv_entry(pmap_t pmap, vm
 	vm_page_lock_assert(m, MA_OWNED);
 	if (pv_entry_count < pv_entry_high_water && 
 	    (pv = get_pv_entry(pmap)) != NULL) {
-#ifdef INVARIANTS
-		if (va == 0) {
-			printf("inserting va==0\n");
-			kdb_backtrace();
-		}
-#endif		
 		pv->pv_va = va;
 		TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
 		return (TRUE);
@@ -2478,12 +2301,6 @@ pmap_pv_insert_pde(pmap_t pmap, vm_offse
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 	if (pv_entry_count < pv_entry_high_water && 
 	    (pv = get_pv_entry(pmap)) != NULL) {
-#ifdef INVARIANTS
-		if (va == 0) {
-			printf("inserting va==0\n");
-			kdb_backtrace();
-		}
-#endif		
 		pv->pv_va = va;
 		pvh = pa_to_pvh(pa);
 		TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list);
@@ -2638,6 +2455,7 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t 
 	pd_entry_t oldpde;
 	vm_offset_t eva, va;
 	vm_page_t m, mpte;
+	vm_paddr_t paddr, pa = 0;
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 	KASSERT((sva & PDRMASK) == 0,
@@ -2657,12 +2475,14 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t 
 		pvh = pa_to_pvh(oldpde & PG_PS_FRAME);
 		pmap_pvh_free(pvh, pmap, sva);
 		eva = sva + NBPDR;
-		for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
-		    va < eva; va += PAGE_SIZE, m++) {
-			/*
-			 * XXX do we need to individually lock each page? 
-			 *
-			 */
+		paddr = oldpde & PG_PS_FRAME;
+		for (va = sva, m = PHYS_TO_VM_PAGE(paddr);
+		     va < eva; va += PAGE_SIZE, paddr += PAGE_SIZE, m++) {
+			if ((oldpde & PG_A) ||
+			    (TAILQ_EMPTY(&m->md.pv_list) &&
+				TAILQ_EMPTY(&pvh->pv_list)))
+				vm_page_pa_tryrelock(pmap, paddr, &pa);
+
 			if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
 				vm_page_dirty(m);
 			if (oldpde & PG_A)
@@ -2671,6 +2491,7 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t 
 			    TAILQ_EMPTY(&pvh->pv_list))
 				vm_page_flag_clear(m, PG_WRITEABLE);
 		}
+		PA_UNLOCK_COND(pa);
 	}
 	if (pmap == kernel_pmap) {
 		if (!pmap_demote_pde(pmap, pdq, sva, pv_list))
@@ -2690,7 +2511,6 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t 
 	return (pmap_unuse_pt(pmap, sva, *pmap_pdpe(pmap, sva), free));
 }
 
-
 /*
  * pmap_remove_pte: do the things to unmap a page in a process
  */
@@ -2740,11 +2560,10 @@ pmap_remove_page(pmap_t pmap, vm_offset_
 	if ((*pte & PG_V) == 0)
 		return;
 	if  (*pte & PG_MANAGED)
-		(void)pa_tryrelock(pmap, *pte & PG_FRAME, &pa);
+		(void)vm_page_pa_tryrelock(pmap, *pte & PG_FRAME, &pa);
 
 	pmap_remove_pte(pmap, pte, va, *pde, free);
-	if (pa)
-		PA_UNLOCK(pa);
+	PA_UNLOCK_COND(pa);
 	pmap_invalidate_page(pmap, va);
 }
 
@@ -2914,7 +2733,7 @@ restart:
 		 * Check for large page.
 		 */
 		if ((ptpaddr & PG_PS) != 0) {
-			if (pa_tryrelock(pmap, ptpaddr & PG_FRAME, &pa)) {
+			if (vm_page_pa_tryrelock(pmap, ptpaddr & PG_FRAME, &pa)) {
 				va_next = sva;
 				continue;
 			}
@@ -2949,30 +2768,24 @@ restart:
 
 		for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
 		    sva += PAGE_SIZE) {
-			int ret;
-
 			if (*pte == 0)
 				continue;
 
 			if  ((*pte & PG_MANAGED) &&
-			    pa_tryrelock(pmap, *pte & PG_FRAME, &pa))
+			    vm_page_pa_tryrelock(pmap, *pte & PG_FRAME, &pa))
 				goto restart;
-
 			/*
 			 * The TLB entry for a PG_G mapping is invalidated
 			 * by pmap_remove_pte().
 			 */
 			if ((*pte & PG_G) == 0)
 				anyvalid = 1;
-			ret = pmap_remove_pte(pmap, pte, sva, ptpaddr, &free);
-
-			if (ret)
+			if (pmap_remove_pte(pmap, pte, sva, ptpaddr, &free))
 				break;
 		}
 	}
 out:
-	if (pa)
-		PA_UNLOCK(pa);
+	PA_UNLOCK_COND(pa);
 	if (anyvalid)
 		pmap_invalidate_all(pmap);
 	if (!TAILQ_EMPTY(&pv_list))
@@ -3126,6 +2939,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sv
 	TAILQ_INIT(&pv_list);
 	pa = 0;
 	anychanged = 0;
+
 	PMAP_LOCK(pmap);
 restart:	
 	for (; sva < eva; sva = va_next) {
@@ -3195,17 +3009,12 @@ retry:
 				continue;
 			if (pbits & PG_MANAGED) {
 				m = NULL;
-				if (pa_tryrelock(pmap, pbits & PG_FRAME, &pa))
+				if (vm_page_pa_tryrelock(pmap, pbits & PG_FRAME, &pa))
 					goto restart;
 				if (pbits & PG_A) {
 					m = PHYS_TO_VM_PAGE(pbits & PG_FRAME);
-					vm_page_flag_set(m, PG_REFERENCED);
-					pbits &= ~PG_A;
-				}
-				if ((pbits & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
-					if (m == NULL)
-						m = PHYS_TO_VM_PAGE(pbits &
-						    PG_FRAME);
+					if (vm_page_pa_tryrelock(pmap, pbits & PG_FRAME, &pa))
+					    goto restart;
 					vm_page_dirty(m);
 				}
 			}
@@ -3225,8 +3034,7 @@ retry:
 			}
 		}
 	}
-	if (pa)
-		PA_UNLOCK(pa);
+	PA_UNLOCK_COND(pa);
 	if (anychanged)
 		pmap_invalidate_all(pmap);
 	PMAP_UNLOCK(pmap);
@@ -3453,7 +3261,6 @@ restart:
 			goto restart;
 		}
 	}
-	    
 	/*
 	 * Mapping has not changed, must be protection or wiring change.
 	 */
@@ -3485,7 +3292,6 @@ restart:
 		}
 		goto validate;
 	} 
-	
 	/*
 	 * Mapping has changed, invalidate old range and fall through to
 	 * handle validating new mapping.
@@ -3513,12 +3319,6 @@ restart:
 	if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
 		KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva,
 		    ("pmap_enter: managed mapping within the clean submap"));
-#ifdef INVARIANTS
-		if (va == 0) {
-			printf("inserting va==0\n");
-			kdb_backtrace();
-		}
-#endif		
 		pv->pv_va = va;
 		TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
 		pa |= PG_MANAGED;
@@ -3683,15 +3483,19 @@ pmap_enter_object(pmap_t pmap, vm_offset
 	vm_offset_t va;
 	vm_page_t m, mpte;
 	vm_pindex_t diff, psize;
+	vm_paddr_t pa;
 
 	VM_OBJECT_LOCK_ASSERT(m_start->object, MA_OWNED);
 	psize = atop(end - start);
 	mpte = NULL;
 	m = m_start;
+	pa = 0;
+	PMAP_LOCK(pmap);
+restart:	
 	while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
 		va = start + ptoa(diff);
-		vm_page_lock(m);
-		PMAP_LOCK(pmap);
+		if (vm_page_pa_tryrelock(pmap, VM_PAGE_TO_PHYS(m), &pa))
+			goto restart;
 		if ((va & PDRMASK) == 0 && va + NBPDR <= end &&
 		    (VM_PAGE_TO_PHYS(m) & PDRMASK) == 0 &&
 		    pg_ps_enabled && vm_reserv_level_iffullpop(m) == 0 &&
@@ -3700,10 +3504,10 @@ pmap_enter_object(pmap_t pmap, vm_offset
 		else
 			mpte = pmap_enter_quick_locked(pmap, va, m, prot,
 			    mpte);
-		PMAP_UNLOCK(pmap);
-		vm_page_unlock(m);
 		m = TAILQ_NEXT(m, listq);
 	}
+	PA_UNLOCK_COND(pa);
+	PMAP_UNLOCK(pmap);
 }
 
 /*
@@ -3719,7 +3523,6 @@ void
 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
 {
 
-	vm_page_lock_assert(m, MA_OWNED);
 	PMAP_LOCK(pmap);
 	(void) pmap_enter_quick_locked(pmap, va, m, prot, NULL);
 	PMAP_UNLOCK(pmap);
@@ -3822,7 +3625,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_
 		pte_store(pte, pa | PG_V | PG_U);
 	else
 		pte_store(pte, pa | PG_V | PG_U | PG_MANAGED);
-	return mpte;
+	return (mpte);
 }
 
 /*
@@ -3963,8 +3766,7 @@ retry:
 			slept = pmap_pv_list_alloc(pmap, NPTEPG-1, &pv_list);
 		if (slept)
 			goto retry;
-		
-		if (pa_tryrelock(pmap, *pde & PG_FRAME, &pa))
+		if (vm_page_pa_tryrelock(pmap, *pde & PG_FRAME, &pa))
 			goto retry;
 	}
 	if ((*pde & PG_PS) != 0) {
@@ -3983,8 +3785,7 @@ retry:
 		atomic_clear_long(pte, PG_W);
 	}
 out:
-	if (pa)
-		PA_UNLOCK(pa);
+	PA_UNLOCK_COND(pa);
 	if (!TAILQ_EMPTY(&pv_list))
 		pmap_pv_list_free(pmap, &pv_list);
 	PMAP_UNLOCK(pmap);
@@ -4060,8 +3861,10 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pm
 				continue;
 
 			dstmpde = pmap_allocpde(dst_pmap, pa, addr, M_NOWAIT);
-			if (dstmpde == NULL)
+			if (dstmpde == NULL) {
+				PA_UNLOCK(pa);
 				break;
+			}
 			pde = (pd_entry_t *)
 			    PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpde));
 			pde = &pde[pmap_pde_index(addr)];
@@ -4128,6 +3931,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pm
 					 	    addr);
 				    	    	pmap_free_zero_pages(free);
 					}
+					PA_UNLOCK(pa);
 					goto out;
 				}
 				PA_UNLOCK(pa);
@@ -4216,12 +4020,12 @@ pmap_page_exists_quick(pmap_t pmap, vm_p
 	int loops = 0;
 
 	if (m->flags & PG_FICTITIOUS)
-		return FALSE;
+		return (FALSE);
 
 	vm_page_lock_assert(m, MA_OWNED);
 	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
 		if (PV_PMAP(pv) == pmap) {
-			return TRUE;
+			return (TRUE);
 		}
 		loops++;
 		if (loops >= 16)
@@ -4326,7 +4130,7 @@ restart:
 					continue;
 				}
 
-				if (pa_tryrelock(pmap, tpte & PG_FRAME, &pa))
+				if (vm_page_pa_tryrelock(pmap, tpte & PG_FRAME, &pa))
 					goto restart;
 
 				m = PHYS_TO_VM_PAGE(tpte & PG_FRAME);
@@ -4351,12 +4155,11 @@ restart:
 					} else
 						vm_page_dirty(m);
 				}
-				mtx_lock(&pv_lock);
+
 				/* Mark free */
 				PV_STAT(pv_entry_frees++);
 				PV_STAT(pv_entry_spare++);
-				pv_entry_count--;
-				mtx_unlock(&pv_lock);
+				atomic_add_int(&pv_entry_count, -1);
 				pc->pc_map[field] |= bitmask;
 				if ((tpte & PG_PS) != 0) {
 					pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
@@ -4390,14 +4193,12 @@ restart:
 			}
 		}
 		if (allfree) {
-			mtx_lock(&pv_lock);
 			PV_STAT(pv_entry_spare -= _NPCPV);
 			PV_STAT(pc_chunk_count--);
 			PV_STAT(pc_chunk_frees++);
 			TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
 			m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
 			dump_drop_page(m->phys_addr);
-			mtx_unlock(&pv_lock);
 			KASSERT(m->wire_count == 1,
 			    ("wire_count == %d", m->wire_count));
 			m->wire_count = 0;
@@ -4405,8 +4206,7 @@ restart:
 			vm_page_free(m);
 		}
 	}
-	if (pa)
-		PA_UNLOCK(pa);
+	PA_UNLOCK_COND(pa);
 
 	pmap_invalidate_all(pmap);
 	PMAP_UNLOCK(pmap);
@@ -5069,7 +4869,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t ad
 	if (pte != 0) {
 		val |= MINCORE_INCORE;
 		if ((pte & PG_MANAGED) == 0)
-			return val;
+			return (val);
 
 		m = PHYS_TO_VM_PAGE(pa);
 
@@ -5105,7 +4905,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t ad
 			vm_page_unlock(m);
 		}
 	} 
-	return val;
+	return (val);
 }
 
 void
@@ -5138,11 +4938,11 @@ pmap_addr_hint(vm_object_t obj, vm_offse
 
 	if ((obj == NULL) || (size < NBPDR) ||
 	    (obj->type != OBJT_DEVICE && obj->type != OBJT_SG)) {
-		return addr;
+		return (addr);
 	}
 
 	addr = (addr + (NBPDR - 1)) & ~(NBPDR - 1);
-	return addr;
+	return (addr);
 }
 
 /*

Modified: user/kmacy/stable_7_page_lock/sys/amd64/include/param.h
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/amd64/include/param.h	Sat May 15 22:39:33 2010	(r208122)
+++ user/kmacy/stable_7_page_lock/sys/amd64/include/param.h	Sat May 15 23:00:40 2010	(r208123)
@@ -86,6 +86,12 @@
  */
 #define	ALIGNED_POINTER(p, t)	1
 
+/*
+ * CACHE_LINE_SIZE is the compile-time maximum cache line size for an
+ * architecture.  It should be used with appropriate caution.
+ */
+#define	CACHE_LINE_SHIFT	7
+#define	CACHE_LINE_SIZE		(1 << CACHE_LINE_SHIFT)
 
 /* Size of the level 1 page table units */
 #define NPTEPG		(PAGE_SIZE/(sizeof (pt_entry_t)))

Modified: user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h	Sat May 15 22:39:33 2010	(r208122)
+++ user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h	Sat May 15 23:00:40 2010	(r208123)
@@ -248,6 +248,8 @@ struct pmap {
 	pml4_entry_t		*pm_pml4;	/* KVA of level 4 page table */
 	TAILQ_HEAD(,pv_chunk)	pm_pvchunk;	/* list of mappings in pmap */
 	u_int			pm_active;	/* active on cpus */
+	uint32_t		pm_gen_count;
+	u_int			pm_retries;
 	/* spare u_int here due to padding */
 	struct pmap_statistics	pm_stats;	/* pmap statistics */
 	vm_page_t		pm_root;	/* spare page table pages */

Modified: user/kmacy/stable_7_page_lock/sys/amd64/include/vmparam.h
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/amd64/include/vmparam.h	Sat May 15 22:39:33 2010	(r208122)
+++ user/kmacy/stable_7_page_lock/sys/amd64/include/vmparam.h	Sat May 15 23:00:40 2010	(r208123)
@@ -145,6 +145,10 @@
 #define	VM_LEVEL_0_ORDER	9
 #endif
 
+#ifdef	SMP
+#define	PA_LOCK_COUNT	256
+#endif
+
 /*
  * Virtual addresses of things.  Derived from the page directory and
  * page table indexes from pmap.h for precision.

Modified: user/kmacy/stable_7_page_lock/sys/vm/vm_page.c
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/vm/vm_page.c	Sat May 15 22:39:33 2010	(r208122)
+++ user/kmacy/stable_7_page_lock/sys/vm/vm_page.c	Sat May 15 23:00:40 2010	(r208123)
@@ -129,14 +129,33 @@ __FBSDID("$FreeBSD$");
 
 #include <machine/md_var.h>
 
+#if defined(__amd64__) || defined (__i386__) 
+extern struct sysctl_oid_list sysctl__vm_pmap_children;
+#else
+SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters");
+#endif
+
+static uint64_t pmap_tryrelock_calls;
+SYSCTL_QUAD(_vm_pmap, OID_AUTO, tryrelock_calls, CTLFLAG_RD,
+    &pmap_tryrelock_calls, 0, "Number of tryrelock calls");
+
+static int pmap_tryrelock_restart;
+SYSCTL_INT(_vm_pmap, OID_AUTO, tryrelock_restart, CTLFLAG_RD,
+    &pmap_tryrelock_restart, 0, "Number of tryrelock restarts");
+
+static int pmap_tryrelock_race;
+SYSCTL_INT(_vm_pmap, OID_AUTO, tryrelock_race, CTLFLAG_RD,
+    &pmap_tryrelock_race, 0, "Number of tryrelock pmap race cases");
+
 /*
  *	Associated with page of user-allocatable memory is a
  *	page structure.
  */
 
 struct vpgqueues vm_page_queues[PQ_COUNT];
-struct mtx vm_page_queue_mtx;
-struct mtx vm_page_queue_free_mtx;
+struct vpglocks vm_page_queue_lock;
+struct vpglocks vm_page_queue_free_lock;
+struct vpglocks	pa_lock[PA_LOCK_COUNT] __aligned(CACHE_LINE_SIZE);
 
 vm_page_t vm_page_array = 0;
 int vm_page_array_size = 0;
@@ -151,6 +170,44 @@ SYSCTL_INT(_vm, OID_AUTO, boot_pages, CT
 static void _vm_page_free_toq(vm_page_t m, boolean_t locked);
 
 /*
+ * Try to acquire a physical address lock while a pmap is locked.  If we
+ * fail to trylock we unlock and lock the pmap directly and cache the
+ * locked pa in *locked.  The caller should then restart their loop in case
+ * the virtual to physical mapping has changed.
+ */
+int
+vm_page_pa_tryrelock(pmap_t pmap, vm_paddr_t pa, vm_paddr_t *locked)
+{
+	vm_paddr_t lockpa;
+	uint32_t gen_count;
+
+	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+	gen_count = pmap->pm_gen_count;
+	atomic_add_long((volatile long *)&pmap_tryrelock_calls, 1);
+	lockpa = *locked;
+	*locked = pa;
+	if (lockpa) {
+		PA_LOCK_ASSERT(lockpa, MA_OWNED);
+		if (PA_LOCKPTR(pa) == PA_LOCKPTR(lockpa))
+			return (0);
+		PA_UNLOCK(lockpa);
+	}
+	if (PA_TRYLOCK(pa))
+		return (0);
+	PMAP_UNLOCK(pmap);
+	atomic_add_int((volatile int *)&pmap_tryrelock_restart, 1);
+	PA_LOCK(pa);
+	PMAP_LOCK(pmap);
+
+	if (pmap->pm_gen_count != gen_count + 1) {
+		pmap->pm_retries++;
+		atomic_add_int((volatile int *)&pmap_tryrelock_race, 1);
+		return (EAGAIN);
+	}
+	return (0);
+}
+
+/*
  *	vm_set_page_size:
  *
  *	Sets the page size, perhaps based upon the memory
@@ -260,6 +317,11 @@ vm_page_startup(vm_offset_t vaddr)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-user@FreeBSD.ORG  Sat May 15 23:15:24 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id C9AF7106566B;
	Sat, 15 May 2010 23:15:24 +0000 (UTC)
	(envelope-from kmacy@FreeBSD.org)
Received: from svn.freebsd.org (unknown [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id B9D818FC1F;
	Sat, 15 May 2010 23:15:24 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4FNFOVh019500;
	Sat, 15 May 2010 23:15:24 GMT (envelope-from kmacy@svn.freebsd.org)
Received: (from kmacy@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4FNFO4P019498;
	Sat, 15 May 2010 23:15:24 GMT (envelope-from kmacy@svn.freebsd.org)
Message-Id: <201005152315.o4FNFO4P019498@svn.freebsd.org>
From: Kip Macy <kmacy@FreeBSD.org>
Date: Sat, 15 May 2010 23:15:24 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r208124 - user/kmacy/stable_7_page_lock/sys/amd64/amd64
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 15 May 2010 23:15:25 -0000

Author: kmacy
Date: Sat May 15 23:15:24 2010
New Revision: 208124
URL: http://svn.freebsd.org/changeset/base/208124

Log:
  eliminate lock_object casts

Modified:
  user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c

Modified: user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Sat May 15 23:00:40 2010	(r208123)
+++ user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Sat May 15 23:15:24 2010	(r208124)
@@ -166,6 +166,7 @@ __FBSDID("$FreeBSD$");
 #endif
 
 #define	pa_to_pvh(pa)		(&pv_table[pa_index(pa)])
+#define	PMAP_LOCKOBJPTR(pmap)	((struct lock_object *)(&(pmap)->pm_mtx))
 
 struct pmap kernel_pmap_store;
 
@@ -3194,18 +3195,14 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	opa = 0;
 	opalocked = FALSE;
 	ls_init(&ls);
-	ls_push(&ls, &lock_class_mtx_sleep,
-	    (struct lock_object *)PA_LOCKPTR(lockedpa));
-	ls_push(&ls, &lock_class_mtx_sleep,
-	    (struct lock_object *)PMAP_LOCKPTR(pmap));
+	ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
+	ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
 	if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
 		while ((pv = get_pv_entry(pmap)) == NULL) {
 			ls_popa(&ls);
 			VM_WAIT;
-			ls_push(&ls, &lock_class_mtx_sleep,
-			    (struct lock_object *)PA_LOCKPTR(lockedpa));
-			ls_push(&ls, &lock_class_mtx_sleep,
-			    (struct lock_object *)PMAP_LOCKPTR(pmap));
+			ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
+			ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
 		}
 	}
 	
@@ -3229,10 +3226,8 @@ restart:
 	origpte = *pte;
 	if (opa && (opa != (origpte & PG_FRAME))) {
 		ls_popa(&ls);
-		ls_push(&ls, &lock_class_mtx_sleep,
-			    (struct lock_object *)PA_LOCKPTR(lockedpa));
-		ls_push(&ls, &lock_class_mtx_sleep,
-			    (struct lock_object *)PMAP_LOCKPTR(pmap));
+		ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
+		ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
 		opalocked = FALSE;
 		opa = 0;
 		goto restart;
@@ -3241,23 +3236,17 @@ restart:
 	opa = origpte & PG_FRAME;
 	if (opa && (opa != lockedpa) && (opalocked == FALSE)) {
 		opalocked = TRUE;
-		if (ls_trypush(&ls, &lock_class_mtx_sleep,
-			(struct lock_object *)PA_LOCKPTR(opa)) == 0) {
+		if (ls_trypush(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(opa)) == 0) {
 			ls_popa(&ls);
 			if ((uintptr_t)PA_LOCKPTR(lockedpa) <
 			    (uintptr_t)PA_LOCKPTR(opa)) {
-				ls_push(&ls, &lock_class_mtx_sleep,
-				    (struct lock_object *)PA_LOCKPTR(lockedpa));
-				ls_push(&ls, &lock_class_mtx_sleep,
-				    (struct lock_object *)PA_LOCKPTR(opa));
+				ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
+				ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(opa));
 			} else {
-				ls_push(&ls, &lock_class_mtx_sleep,
-				    (struct lock_object *)PA_LOCKPTR(opa));
-				ls_push(&ls, &lock_class_mtx_sleep,
-				    (struct lock_object *)PA_LOCKPTR(lockedpa));
+				ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(opa));
+				ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
 			}
-			ls_push(&ls, &lock_class_mtx_sleep,
-			    (struct lock_object *)PMAP_LOCKPTR(pmap));
+			ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
 			goto restart;
 		}
 	}

From owner-svn-src-user@FreeBSD.ORG  Sat May 15 23:27:24 2010
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 42ADE106566C;
	Sat, 15 May 2010 23:27:24 +0000 (UTC)
	(envelope-from kmacy@FreeBSD.org)
Received: from svn.freebsd.org (unknown [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 323EE8FC0A;
	Sat, 15 May 2010 23:27:24 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4FNRO0Q022337;
	Sat, 15 May 2010 23:27:24 GMT (envelope-from kmacy@svn.freebsd.org)
Received: (from kmacy@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4FNROm2022334;
	Sat, 15 May 2010 23:27:24 GMT (envelope-from kmacy@svn.freebsd.org)
Message-Id: <201005152327.o4FNROm2022334@svn.freebsd.org>
From: Kip Macy <kmacy@FreeBSD.org>
Date: Sat, 15 May 2010 23:27:24 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r208125 - in user/kmacy/stable_7_page_lock/sys/amd64:
	amd64 include
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 15 May 2010 23:27:24 -0000

Author: kmacy
Date: Sat May 15 23:27:23 2010
New Revision: 208125
URL: http://svn.freebsd.org/changeset/base/208125

Log:
  minimize trylock restarts by tracking generation counter

Modified:
  user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c
  user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h

Modified: user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Sat May 15 23:15:24 2010	(r208124)
+++ user/kmacy/stable_7_page_lock/sys/amd64/amd64/pmap.c	Sat May 15 23:27:23 2010	(r208125)
@@ -3176,15 +3176,14 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	vm_paddr_t pa;
 	pd_entry_t *pde;
 	pt_entry_t *pte;
-	vm_paddr_t opa, lockedpa;
 	pt_entry_t origpte, newpte;
 	vm_page_t mpte, om;
 	boolean_t invlva, opalocked;
+	vm_paddr_t lockedpa, opa = 0;
 	pv_entry_t pv;
 	struct lock_stack ls;
 
 	va = trunc_page(va);
-
 	KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig"));
 	KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS,
 	    ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%lx)", va));
@@ -3192,28 +3191,28 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	mpte = NULL;
 	pv = NULL;
 	lockedpa = pa = VM_PAGE_TO_PHYS(m);
-	opa = 0;
 	opalocked = FALSE;
 	ls_init(&ls);
 	ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
 	ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
+	PMAP_UPDATE_GEN_COUNT(pmap);
 	if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
 		while ((pv = get_pv_entry(pmap)) == NULL) {
 			ls_popa(&ls);
 			VM_WAIT;
 			ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
 			ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
+			PMAP_UPDATE_GEN_COUNT(pmap);
 		}
 	}
-	
-restart:
+
 	/*
 	 * In the case that a page table page is not
 	 * resident, we are creating it here.
 	 */
-	if (va < VM_MAXUSER_ADDRESS && mpte == NULL)
+	if (va < VM_MAXUSER_ADDRESS)
 		mpte = pmap_allocpte(pmap, lockedpa, va, M_WAITOK);
-
+restart:
 	pde = pmap_pde(pmap, va);
 	if (pde != NULL && (*pde & PG_V) != 0) {
 		if ((*pde & PG_PS) != 0)
@@ -3228,6 +3227,7 @@ restart:
 		ls_popa(&ls);
 		ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
 		ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
+		PMAP_UPDATE_GEN_COUNT(pmap);
 		opalocked = FALSE;
 		opa = 0;
 		goto restart;
@@ -3247,6 +3247,7 @@ restart:
 				ls_push(&ls, &lock_class_mtx_sleep, PA_LOCKOBJPTR(lockedpa));
 			}
 			ls_push(&ls, &lock_class_mtx_sleep, PMAP_LOCKOBJPTR(pmap));
+			PMAP_UPDATE_GEN_COUNT(pmap);
 			goto restart;
 		}
 	}

Modified: user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h
==============================================================================
--- user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h	Sat May 15 23:15:24 2010	(r208124)
+++ user/kmacy/stable_7_page_lock/sys/amd64/include/pmap.h	Sat May 15 23:27:23 2010	(r208125)
@@ -262,7 +262,14 @@ typedef struct pmap	*pmap_t;
 extern struct pmap	kernel_pmap_store;
 #define kernel_pmap	(&kernel_pmap_store)
 
-#define	PMAP_LOCK(pmap)		mtx_lock(&(pmap)->pm_mtx)
+#define PMAP_UPDATE_GEN_COUNT(pmap) (pmap)->pm_gen_count++
+
+#define	PMAP_LOCK(pmap)						\
+	do {							\
+		mtx_lock(&(pmap)->pm_mtx);			\
+		PMAP_UPDATE_GEN_COUNT((pmap));			\
+	} while (0)
+
 #define	PMAP_LOCKPTR(pmap)	(&(pmap)->pm_mtx)
 
 #define	PMAP_LOCK_ASSERT(pmap, type)					\