From owner-svn-src-user@FreeBSD.ORG Sun May 9 06:52:32 2010 Return-Path: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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" + "\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" - "\032" + "\032AESNI" /* AES Crypto*/ "\033XSAVE" "\034OSXSAVE" "\035" 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 __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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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= +.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= +.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= +.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= +.Op Fl -packages-local .Op Fl -delete-packages .Fl -packages-build .Nm @@ -426,6 +430,10 @@ in the category subdirectories, such as .Pa /devel , .Pa /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= # +# 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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 [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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 +#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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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) \