From owner-svn-src-user@FreeBSD.ORG Thu Sep 16 13:49:11 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 43BA9106564A; Thu, 16 Sep 2010 13:49:11 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2E5BF8FC17; Thu, 16 Sep 2010 13:49:11 +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 o8GDnB20091370; Thu, 16 Sep 2010 13:49:11 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8GDnAhM091354; Thu, 16 Sep 2010 13:49:10 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201009161349.o8GDnAhM091354@svn.freebsd.org> From: Nathan Whitehorn Date: Thu, 16 Sep 2010 13:49: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: r212733 - in user/nwhitehorn/ps3: amd64/amd64 amd64/conf amd64/include arm/arm arm/xscale/ixp425 boot/sparc64/boot1 boot/zfs cddl/boot/zfs cddl/compat/opensolaris/sys cddl/contrib/opens... 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, 16 Sep 2010 13:49:11 -0000 Author: nwhitehorn Date: Thu Sep 16 13:49:10 2010 New Revision: 212733 URL: http://svn.freebsd.org/changeset/base/212733 Log: IFC @ r212732 This pulls in recent timer and SLB changes. Added: user/nwhitehorn/ps3/conf/ldscript.mips.64.cfe - copied unchanged from r212732, head/sys/conf/ldscript.mips.64.cfe user/nwhitehorn/ps3/dev/mps/ - copied from r212732, head/sys/dev/mps/ user/nwhitehorn/ps3/mips/conf/SWARM64 - copied unchanged from r212732, head/sys/mips/conf/SWARM64 user/nwhitehorn/ps3/mips/conf/SWARM64_SMP - copied unchanged from r212732, head/sys/mips/conf/SWARM64_SMP user/nwhitehorn/ps3/mips/conf/SWARM_COMMON - copied unchanged from r212732, head/sys/mips/conf/SWARM_COMMON user/nwhitehorn/ps3/modules/mps/ - copied from r212732, head/sys/modules/mps/ Deleted: user/nwhitehorn/ps3/mips/mips/psraccess.S Modified: user/nwhitehorn/ps3/amd64/amd64/legacy.c user/nwhitehorn/ps3/amd64/amd64/machdep.c user/nwhitehorn/ps3/amd64/amd64/mp_machdep.c user/nwhitehorn/ps3/amd64/amd64/nexus.c user/nwhitehorn/ps3/amd64/conf/GENERIC user/nwhitehorn/ps3/amd64/include/apicvar.h user/nwhitehorn/ps3/arm/arm/nexus.c user/nwhitehorn/ps3/arm/arm/pmap.c user/nwhitehorn/ps3/arm/xscale/ixp425/ixp425.c user/nwhitehorn/ps3/boot/sparc64/boot1/boot1.c user/nwhitehorn/ps3/boot/zfs/zfsimpl.c user/nwhitehorn/ps3/cddl/boot/zfs/zfsimpl.h user/nwhitehorn/ps3/cddl/compat/opensolaris/sys/vnode.h user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ctldir.h user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_fm.c user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c user/nwhitehorn/ps3/compat/linprocfs/linprocfs.c user/nwhitehorn/ps3/compat/linux/linux_ioctl.c user/nwhitehorn/ps3/conf/Makefile.mips user/nwhitehorn/ps3/conf/files user/nwhitehorn/ps3/conf/files.mips user/nwhitehorn/ps3/conf/files.powerpc user/nwhitehorn/ps3/conf/kern.mk user/nwhitehorn/ps3/conf/kern.pre.mk user/nwhitehorn/ps3/conf/kmod.mk user/nwhitehorn/ps3/contrib/pf/net/pf.c user/nwhitehorn/ps3/dev/aac/aac.c user/nwhitehorn/ps3/dev/aac/aacreg.h user/nwhitehorn/ps3/dev/aac/aacvar.h user/nwhitehorn/ps3/dev/acpi_support/acpi_hp.c user/nwhitehorn/ps3/dev/acpi_support/acpi_wmi.c user/nwhitehorn/ps3/dev/acpica/acpi.c user/nwhitehorn/ps3/dev/acpica/acpi_cpu.c user/nwhitehorn/ps3/dev/acpica/acpi_hpet.c user/nwhitehorn/ps3/dev/ahci/ahci.c user/nwhitehorn/ps3/dev/atkbdc/atkbdc_isa.c user/nwhitehorn/ps3/dev/cxgb/common/cxgb_t3_hw.c user/nwhitehorn/ps3/dev/cxgb/cxgb_sge.c user/nwhitehorn/ps3/dev/fb/vesa.c user/nwhitehorn/ps3/dev/firewire/firewire.c user/nwhitehorn/ps3/dev/firewire/fwohci_pci.c user/nwhitehorn/ps3/dev/gem/if_gem.c user/nwhitehorn/ps3/dev/gem/if_gem_pci.c user/nwhitehorn/ps3/dev/gem/if_gem_sbus.c user/nwhitehorn/ps3/dev/iicbus/iicbus.c user/nwhitehorn/ps3/dev/led/led.c user/nwhitehorn/ps3/dev/malo/if_malo_pci.c user/nwhitehorn/ps3/dev/msk/if_msk.c user/nwhitehorn/ps3/dev/mvs/mvs.c user/nwhitehorn/ps3/dev/mwl/if_mwl_pci.c user/nwhitehorn/ps3/dev/ofw/ofw_fdt.c user/nwhitehorn/ps3/dev/ofw/ofw_if.m user/nwhitehorn/ps3/dev/ofw/ofw_iicbus.c user/nwhitehorn/ps3/dev/ofw/ofw_standard.c user/nwhitehorn/ps3/dev/ofw/openfirm.c user/nwhitehorn/ps3/dev/pci/pcireg.h user/nwhitehorn/ps3/dev/ppbus/ppbconf.c user/nwhitehorn/ps3/dev/siba/siba.c user/nwhitehorn/ps3/dev/siis/siis.c user/nwhitehorn/ps3/dev/spibus/spibus.c user/nwhitehorn/ps3/dev/usb/usb_busdma.c user/nwhitehorn/ps3/fs/devfs/devfs.h user/nwhitehorn/ps3/fs/devfs/devfs_devs.c user/nwhitehorn/ps3/fs/devfs/devfs_vnops.c user/nwhitehorn/ps3/fs/nfs/nfsdport.h user/nwhitehorn/ps3/fs/nfsclient/nfs_clvnops.c user/nwhitehorn/ps3/fs/nfsserver/nfs_nfsdstate.c user/nwhitehorn/ps3/fs/tmpfs/tmpfs_vnops.c user/nwhitehorn/ps3/geom/eli/g_eli_ctl.c user/nwhitehorn/ps3/geom/mirror/g_mirror_ctl.c user/nwhitehorn/ps3/geom/part/g_part.c user/nwhitehorn/ps3/i386/i386/legacy.c user/nwhitehorn/ps3/i386/i386/machdep.c user/nwhitehorn/ps3/i386/i386/mp_machdep.c user/nwhitehorn/ps3/i386/i386/nexus.c user/nwhitehorn/ps3/i386/include/apicvar.h user/nwhitehorn/ps3/ia64/ia64/nexus.c user/nwhitehorn/ps3/isa/isa_common.c user/nwhitehorn/ps3/kern/bus_if.m user/nwhitehorn/ps3/kern/kern_clock.c user/nwhitehorn/ps3/kern/kern_clocksource.c user/nwhitehorn/ps3/kern/kern_et.c user/nwhitehorn/ps3/kern/kern_jail.c user/nwhitehorn/ps3/kern/kern_sig.c user/nwhitehorn/ps3/kern/kern_tc.c user/nwhitehorn/ps3/kern/kern_timeout.c user/nwhitehorn/ps3/kern/sched_4bsd.c user/nwhitehorn/ps3/kern/sched_ule.c user/nwhitehorn/ps3/kern/subr_bus.c user/nwhitehorn/ps3/kern/subr_lock.c user/nwhitehorn/ps3/kern/subr_sbuf.c user/nwhitehorn/ps3/kern/subr_sleepqueue.c user/nwhitehorn/ps3/kern/subr_witness.c user/nwhitehorn/ps3/kern/vfs_mount.c user/nwhitehorn/ps3/kern/vfs_subr.c user/nwhitehorn/ps3/mips/adm5120/obio.c user/nwhitehorn/ps3/mips/alchemy/obio.c user/nwhitehorn/ps3/mips/atheros/apb.c user/nwhitehorn/ps3/mips/cavium/octeon_mp.c user/nwhitehorn/ps3/mips/conf/MALTA64 user/nwhitehorn/ps3/mips/conf/OCTEON1 user/nwhitehorn/ps3/mips/conf/SWARM user/nwhitehorn/ps3/mips/conf/SWARM_SMP user/nwhitehorn/ps3/mips/idt/obio.c user/nwhitehorn/ps3/mips/include/cpufunc.h user/nwhitehorn/ps3/mips/include/md_var.h user/nwhitehorn/ps3/mips/include/smp.h user/nwhitehorn/ps3/mips/mips/machdep.c user/nwhitehorn/ps3/mips/mips/mainbus.c user/nwhitehorn/ps3/mips/mips/mp_machdep.c user/nwhitehorn/ps3/mips/mips/nexus.c user/nwhitehorn/ps3/mips/mips/pmap.c user/nwhitehorn/ps3/mips/mips/trap.c user/nwhitehorn/ps3/mips/rmi/dev/nlge/if_nlge.c user/nwhitehorn/ps3/mips/rmi/dev/xlr/rge.c user/nwhitehorn/ps3/mips/rmi/iodi.c user/nwhitehorn/ps3/mips/rmi/msgring.h user/nwhitehorn/ps3/mips/rmi/rmi_mips_exts.h user/nwhitehorn/ps3/mips/rmi/xlr_machdep.c user/nwhitehorn/ps3/mips/rmi/xlr_pci.c user/nwhitehorn/ps3/mips/sibyte/sb_machdep.c user/nwhitehorn/ps3/mips/sibyte/sb_zbbus.c user/nwhitehorn/ps3/modules/Makefile user/nwhitehorn/ps3/modules/crypto/Makefile user/nwhitehorn/ps3/modules/gem/Makefile user/nwhitehorn/ps3/modules/opensolaris/Makefile user/nwhitehorn/ps3/modules/scc/Makefile user/nwhitehorn/ps3/modules/sound/sound/Makefile user/nwhitehorn/ps3/modules/zfs/Makefile user/nwhitehorn/ps3/net/if.c user/nwhitehorn/ps3/netinet/raw_ip.c user/nwhitehorn/ps3/netinet/sctp_asconf.c user/nwhitehorn/ps3/netinet/sctp_asconf.h user/nwhitehorn/ps3/netinet/sctp_bsd_addr.c user/nwhitehorn/ps3/netinet/sctp_cc_functions.c user/nwhitehorn/ps3/netinet/sctp_indata.c user/nwhitehorn/ps3/netinet/sctp_input.c user/nwhitehorn/ps3/netinet/sctp_output.c user/nwhitehorn/ps3/netinet/sctp_output.h user/nwhitehorn/ps3/netinet/sctp_pcb.c user/nwhitehorn/ps3/netinet/sctp_sysctl.c user/nwhitehorn/ps3/netinet/sctp_timer.c user/nwhitehorn/ps3/netinet/sctp_usrreq.c user/nwhitehorn/ps3/netinet/sctputil.c user/nwhitehorn/ps3/netinet/tcp.h user/nwhitehorn/ps3/netinet6/sctp6_usrreq.c user/nwhitehorn/ps3/nfsclient/nfs.h user/nwhitehorn/ps3/nfsclient/nfs_nfsiod.c user/nwhitehorn/ps3/nfsclient/nfs_subs.c user/nwhitehorn/ps3/pc98/pc98/canbus.c user/nwhitehorn/ps3/pc98/pc98/machdep.c user/nwhitehorn/ps3/powerpc/aim/clock.c user/nwhitehorn/ps3/powerpc/aim/copyinout.c user/nwhitehorn/ps3/powerpc/aim/interrupt.c user/nwhitehorn/ps3/powerpc/aim/machdep.c user/nwhitehorn/ps3/powerpc/aim/mmu_oea.c user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.c user/nwhitehorn/ps3/powerpc/aim/nexus.c user/nwhitehorn/ps3/powerpc/aim/slb.c user/nwhitehorn/ps3/powerpc/aim/trap.c user/nwhitehorn/ps3/powerpc/aim/trap_subr64.S user/nwhitehorn/ps3/powerpc/booke/clock.c user/nwhitehorn/ps3/powerpc/booke/interrupt.c user/nwhitehorn/ps3/powerpc/booke/platform_bare.c user/nwhitehorn/ps3/powerpc/booke/pmap.c user/nwhitehorn/ps3/powerpc/include/intr_machdep.h user/nwhitehorn/ps3/powerpc/include/md_var.h user/nwhitehorn/ps3/powerpc/include/mmuvar.h user/nwhitehorn/ps3/powerpc/include/pcb.h user/nwhitehorn/ps3/powerpc/include/pcpu.h user/nwhitehorn/ps3/powerpc/include/pmap.h user/nwhitehorn/ps3/powerpc/include/smp.h user/nwhitehorn/ps3/powerpc/include/sr.h user/nwhitehorn/ps3/powerpc/ofw/ofw_real.c user/nwhitehorn/ps3/powerpc/powermac/ata_kauai.c user/nwhitehorn/ps3/powerpc/powermac/kiic.c user/nwhitehorn/ps3/powerpc/powerpc/cpu.c user/nwhitehorn/ps3/powerpc/powerpc/exec_machdep.c user/nwhitehorn/ps3/powerpc/powerpc/intr_machdep.c user/nwhitehorn/ps3/powerpc/powerpc/mp_machdep.c user/nwhitehorn/ps3/powerpc/ps3/mmu_ps3.c user/nwhitehorn/ps3/security/audit/audit_bsm_klib.c user/nwhitehorn/ps3/sparc64/include/asm.h user/nwhitehorn/ps3/sparc64/include/intr_machdep.h user/nwhitehorn/ps3/sparc64/include/md_var.h user/nwhitehorn/ps3/sparc64/include/smp.h user/nwhitehorn/ps3/sparc64/pci/schizo.c user/nwhitehorn/ps3/sparc64/sparc64/bus_machdep.c user/nwhitehorn/ps3/sparc64/sparc64/intr_machdep.c user/nwhitehorn/ps3/sparc64/sparc64/iommu.c user/nwhitehorn/ps3/sparc64/sparc64/machdep.c user/nwhitehorn/ps3/sparc64/sparc64/mp_machdep.c user/nwhitehorn/ps3/sparc64/sparc64/nexus.c user/nwhitehorn/ps3/sparc64/sparc64/support.S user/nwhitehorn/ps3/sparc64/sparc64/vm_machdep.c user/nwhitehorn/ps3/sun4v/include/intr_machdep.h user/nwhitehorn/ps3/sun4v/include/smp.h user/nwhitehorn/ps3/sun4v/sun4v/bus_machdep.c user/nwhitehorn/ps3/sun4v/sun4v/hviommu.c user/nwhitehorn/ps3/sun4v/sun4v/intr_machdep.c user/nwhitehorn/ps3/sun4v/sun4v/mp_machdep.c user/nwhitehorn/ps3/sun4v/sun4v/nexus.c user/nwhitehorn/ps3/sun4v/sun4v/vnex.c user/nwhitehorn/ps3/sys/bus.h user/nwhitehorn/ps3/sys/callout.h user/nwhitehorn/ps3/sys/elf_common.h user/nwhitehorn/ps3/sys/lock.h user/nwhitehorn/ps3/sys/mount.h user/nwhitehorn/ps3/sys/param.h user/nwhitehorn/ps3/sys/pcpu.h user/nwhitehorn/ps3/sys/sbuf.h user/nwhitehorn/ps3/sys/sched.h user/nwhitehorn/ps3/sys/systm.h user/nwhitehorn/ps3/sys/timeet.h user/nwhitehorn/ps3/sys/timetc.h user/nwhitehorn/ps3/ufs/ffs/ffs_softdep.c user/nwhitehorn/ps3/ufs/ffs/fs.h user/nwhitehorn/ps3/ufs/ffs/softdep.h user/nwhitehorn/ps3/x86/cpufreq/est.c user/nwhitehorn/ps3/x86/x86/local_apic.c Directory Properties: user/nwhitehorn/ps3/ (props changed) user/nwhitehorn/ps3/amd64/include/xen/ (props changed) user/nwhitehorn/ps3/boot/powerpc/ps3/ (props changed) user/nwhitehorn/ps3/cddl/contrib/opensolaris/ (props changed) user/nwhitehorn/ps3/contrib/dev/acpica/ (props changed) user/nwhitehorn/ps3/contrib/pf/ (props changed) user/nwhitehorn/ps3/contrib/x86emu/ (props changed) user/nwhitehorn/ps3/dev/xen/xenpci/ (props changed) user/nwhitehorn/ps3/powerpc/ps3/ (props changed) Modified: user/nwhitehorn/ps3/amd64/amd64/legacy.c ============================================================================== --- user/nwhitehorn/ps3/amd64/amd64/legacy.c Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/amd64/amd64/legacy.c Thu Sep 16 13:49:10 2010 (r212733) @@ -60,7 +60,7 @@ struct legacy_device { static int legacy_probe(device_t); static int legacy_attach(device_t); static int legacy_print_child(device_t, device_t); -static device_t legacy_add_child(device_t bus, int order, const char *name, +static device_t legacy_add_child(device_t bus, u_int order, const char *name, int unit); static int legacy_read_ivar(device_t, device_t, int, uintptr_t *); static int legacy_write_ivar(device_t, device_t, int, uintptr_t); @@ -149,7 +149,7 @@ legacy_print_child(device_t bus, device_ } static device_t -legacy_add_child(device_t bus, int order, const char *name, int unit) +legacy_add_child(device_t bus, u_int order, const char *name, int unit) { device_t child; struct legacy_device *atdev; @@ -213,7 +213,7 @@ legacy_write_ivar(device_t dev, device_t static void cpu_identify(driver_t *driver, device_t parent); static int cpu_read_ivar(device_t dev, device_t child, int index, uintptr_t *result); -static device_t cpu_add_child(device_t bus, int order, const char *name, +static device_t cpu_add_child(device_t bus, u_int order, const char *name, int unit); static struct resource_list *cpu_get_rlist(device_t dev, device_t child); @@ -277,7 +277,7 @@ cpu_identify(driver_t *driver, device_t } static device_t -cpu_add_child(device_t bus, int order, const char *name, int unit) +cpu_add_child(device_t bus, u_int order, const char *name, int unit) { struct cpu_device *cd; device_t child; Modified: user/nwhitehorn/ps3/amd64/amd64/machdep.c ============================================================================== --- user/nwhitehorn/ps3/amd64/amd64/machdep.c Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/amd64/amd64/machdep.c Thu Sep 16 13:49:10 2010 (r212733) @@ -585,59 +585,89 @@ cpu_halt(void) } void (*cpu_idle_hook)(void) = NULL; /* ACPI idle hook. */ +static int cpu_ident_amdc1e = 0; /* AMD C1E supported. */ +static int idle_mwait = 1; /* Use MONITOR/MWAIT for short idle. */ +TUNABLE_INT("machdep.idle_mwait", &idle_mwait); +SYSCTL_INT(_machdep, OID_AUTO, idle_mwait, CTLFLAG_RW, &idle_mwait, + 0, "Use MONITOR/MWAIT for short idle"); + +#define STATE_RUNNING 0x0 +#define STATE_MWAIT 0x1 +#define STATE_SLEEPING 0x2 static void -cpu_idle_hlt(int busy) +cpu_idle_acpi(int busy) { - /* - * we must absolutely guarentee that hlt is the next instruction - * after sti or we introduce a timing window. - */ + int *state; + + state = (int *)PCPU_PTR(monitorbuf); + *state = STATE_SLEEPING; disable_intr(); - if (sched_runnable()) + if (sched_runnable()) enable_intr(); + else if (cpu_idle_hook) + cpu_idle_hook(); else __asm __volatile("sti; hlt"); + *state = STATE_RUNNING; } static void -cpu_idle_acpi(int busy) +cpu_idle_hlt(int busy) { + int *state; + + state = (int *)PCPU_PTR(monitorbuf); + *state = STATE_SLEEPING; + /* + * We must absolutely guarentee that hlt is the next instruction + * after sti or we introduce a timing window. + */ disable_intr(); - if (sched_runnable()) + if (sched_runnable()) enable_intr(); - else if (cpu_idle_hook) - cpu_idle_hook(); else __asm __volatile("sti; hlt"); + *state = STATE_RUNNING; } -static int cpu_ident_amdc1e = 0; +/* + * MWAIT cpu power states. Lower 4 bits are sub-states. + */ +#define MWAIT_C0 0xf0 +#define MWAIT_C1 0x00 +#define MWAIT_C2 0x10 +#define MWAIT_C3 0x20 +#define MWAIT_C4 0x30 -static int -cpu_probe_amdc1e(void) +static void +cpu_idle_mwait(int busy) { - int i; + int *state; - /* - * Forget it, if we're not using local APIC timer. - */ - if (resource_disabled("apic", 0) || - (resource_int_value("apic", 0, "clock", &i) == 0 && i == 0)) - return (0); - - /* - * Detect the presence of C1E capability mostly on latest - * dual-cores (or future) k8 family. - */ - if (cpu_vendor_id == CPU_VENDOR_AMD && - (cpu_id & 0x00000f00) == 0x00000f00 && - (cpu_id & 0x0fff0000) >= 0x00040000) { - cpu_ident_amdc1e = 1; - return (1); + state = (int *)PCPU_PTR(monitorbuf); + *state = STATE_MWAIT; + if (!sched_runnable()) { + cpu_monitor(state, 0, 0); + if (*state == STATE_MWAIT) + cpu_mwait(0, MWAIT_C1); } + *state = STATE_RUNNING; +} - return (0); +static void +cpu_idle_spin(int busy) +{ + int *state; + int i; + + state = (int *)PCPU_PTR(monitorbuf); + *state = STATE_RUNNING; + for (i = 0; i < 1000; i++) { + if (sched_runnable()) + return; + cpu_spinwait(); + } } /* @@ -655,110 +685,83 @@ cpu_probe_amdc1e(void) #define AMDK8_CMPHALT (AMDK8_SMIONCMPHALT | AMDK8_C1EONCMPHALT) static void -cpu_idle_amdc1e(int busy) +cpu_probe_amdc1e(void) { - disable_intr(); - if (sched_runnable()) - enable_intr(); - else { - uint64_t msr; - - msr = rdmsr(MSR_AMDK8_IPM); - if (msr & AMDK8_CMPHALT) - wrmsr(MSR_AMDK8_IPM, msr & ~AMDK8_CMPHALT); - - if (cpu_idle_hook) - cpu_idle_hook(); - else - __asm __volatile("sti; hlt"); + /* + * Detect the presence of C1E capability mostly on latest + * dual-cores (or future) k8 family. + */ + if (cpu_vendor_id == CPU_VENDOR_AMD && + (cpu_id & 0x00000f00) == 0x00000f00 && + (cpu_id & 0x0fff0000) >= 0x00040000) { + cpu_ident_amdc1e = 1; } } -static void -cpu_idle_spin(int busy) -{ - return; -} - void (*cpu_idle_fn)(int) = cpu_idle_acpi; void cpu_idle(int busy) { + uint64_t msr; + + CTR2(KTR_SPARE2, "cpu_idle(%d) at %d", + busy, curcpu); #ifdef SMP if (mp_grab_cpu_hlt()) return; #endif - cpu_idle_fn(busy); -} - -/* - * mwait cpu power states. Lower 4 bits are sub-states. - */ -#define MWAIT_C0 0xf0 -#define MWAIT_C1 0x00 -#define MWAIT_C2 0x10 -#define MWAIT_C3 0x20 -#define MWAIT_C4 0x30 - -#define MWAIT_DISABLED 0x0 -#define MWAIT_WOKEN 0x1 -#define MWAIT_WAITING 0x2 + /* If we are busy - try to use fast methods. */ + if (busy) { + if ((cpu_feature2 & CPUID2_MON) && idle_mwait) { + cpu_idle_mwait(busy); + goto out; + } + } -static void -cpu_idle_mwait(int busy) -{ - int *mwait; + /* If we have time - switch timers into idle mode. */ + if (!busy) { + critical_enter(); + cpu_idleclock(); + } - mwait = (int *)PCPU_PTR(monitorbuf); - *mwait = MWAIT_WAITING; - if (sched_runnable()) - return; - cpu_monitor(mwait, 0, 0); - if (*mwait == MWAIT_WAITING) - cpu_mwait(0, MWAIT_C1); -} + /* Apply AMD APIC timer C1E workaround. */ + if (cpu_ident_amdc1e && cpu_disable_deep_sleep) { + msr = rdmsr(MSR_AMDK8_IPM); + if (msr & AMDK8_CMPHALT) + wrmsr(MSR_AMDK8_IPM, msr & ~AMDK8_CMPHALT); + } -static void -cpu_idle_mwait_hlt(int busy) -{ - int *mwait; + /* Call main idle method. */ + cpu_idle_fn(busy); - mwait = (int *)PCPU_PTR(monitorbuf); - if (busy == 0) { - *mwait = MWAIT_DISABLED; - cpu_idle_hlt(busy); - return; - } - *mwait = MWAIT_WAITING; - if (sched_runnable()) - return; - cpu_monitor(mwait, 0, 0); - if (*mwait == MWAIT_WAITING) - cpu_mwait(0, MWAIT_C1); + /* Switch timers mack into active mode. */ + if (!busy) { + cpu_activeclock(); + critical_exit(); + } +out: + CTR2(KTR_SPARE2, "cpu_idle(%d) at %d done", + busy, curcpu); } int cpu_idle_wakeup(int cpu) { struct pcpu *pcpu; - int *mwait; + int *state; - if (cpu_idle_fn == cpu_idle_spin) - return (1); - if (cpu_idle_fn != cpu_idle_mwait && cpu_idle_fn != cpu_idle_mwait_hlt) - return (0); pcpu = pcpu_find(cpu); - mwait = (int *)pcpu->pc_monitorbuf; + state = (int *)pcpu->pc_monitorbuf; /* * This doesn't need to be atomic since missing the race will * simply result in unnecessary IPIs. */ - if (cpu_idle_fn == cpu_idle_mwait_hlt && *mwait == MWAIT_DISABLED) + if (*state == STATE_SLEEPING) return (0); - *mwait = MWAIT_WOKEN; - + if (*state == STATE_MWAIT) + *state = STATE_RUNNING; return (1); } @@ -771,8 +774,6 @@ struct { } idle_tbl[] = { { cpu_idle_spin, "spin" }, { cpu_idle_mwait, "mwait" }, - { cpu_idle_mwait_hlt, "mwait_hlt" }, - { cpu_idle_amdc1e, "amdc1e" }, { cpu_idle_hlt, "hlt" }, { cpu_idle_acpi, "acpi" }, { NULL, NULL } @@ -791,8 +792,8 @@ idle_sysctl_available(SYSCTL_HANDLER_ARG if (strstr(idle_tbl[i].id_name, "mwait") && (cpu_feature2 & CPUID2_MON) == 0) continue; - if (strcmp(idle_tbl[i].id_name, "amdc1e") == 0 && - cpu_ident_amdc1e == 0) + if (strcmp(idle_tbl[i].id_name, "acpi") == 0 && + cpu_idle_hook == NULL) continue; p += sprintf(p, "%s, ", idle_tbl[i].id_name); } @@ -801,6 +802,9 @@ idle_sysctl_available(SYSCTL_HANDLER_ARG return (error); } +SYSCTL_PROC(_machdep, OID_AUTO, idle_available, CTLTYPE_STRING | CTLFLAG_RD, + 0, 0, idle_sysctl_available, "A", "list of available idle functions"); + static int idle_sysctl(SYSCTL_HANDLER_ARGS) { @@ -824,8 +828,8 @@ idle_sysctl(SYSCTL_HANDLER_ARGS) if (strstr(idle_tbl[i].id_name, "mwait") && (cpu_feature2 & CPUID2_MON) == 0) continue; - if (strcmp(idle_tbl[i].id_name, "amdc1e") == 0 && - cpu_ident_amdc1e == 0) + if (strcmp(idle_tbl[i].id_name, "acpi") == 0 && + cpu_idle_hook == NULL) continue; if (strcmp(idle_tbl[i].id_name, buf)) continue; @@ -835,9 +839,6 @@ idle_sysctl(SYSCTL_HANDLER_ARGS) return (EINVAL); } -SYSCTL_PROC(_machdep, OID_AUTO, idle_available, CTLTYPE_STRING | CTLFLAG_RD, - 0, 0, idle_sysctl_available, "A", "list of available idle functions"); - SYSCTL_PROC(_machdep, OID_AUTO, idle, CTLTYPE_STRING | CTLFLAG_RW, 0, 0, idle_sysctl, "A", "currently selected idle function"); @@ -1743,8 +1744,7 @@ hammer_time(u_int64_t modulep, u_int64_t } #endif - if (cpu_probe_amdc1e()) - cpu_idle_fn = cpu_idle_amdc1e; + cpu_probe_amdc1e(); /* Location of kernel stack for locore */ return ((u_int64_t)thread0.td_pcb); Modified: user/nwhitehorn/ps3/amd64/amd64/mp_machdep.c ============================================================================== --- user/nwhitehorn/ps3/amd64/amd64/mp_machdep.c Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/amd64/amd64/mp_machdep.c Thu Sep 16 13:49:10 2010 (r212733) @@ -118,7 +118,6 @@ u_long *ipi_invlcache_counts[MAXCPU]; u_long *ipi_rendezvous_counts[MAXCPU]; u_long *ipi_lazypmap_counts[MAXCPU]; static u_long *ipi_hardclock_counts[MAXCPU]; -static u_long *ipi_statclock_counts[MAXCPU]; #endif extern inthand_t IDTVEC(fast_syscall), IDTVEC(fast_syscall32); @@ -1196,16 +1195,22 @@ smp_masked_invlpg_range(cpumask_t mask, void ipi_bitmap_handler(struct trapframe frame) { + struct trapframe *oldframe; + struct thread *td; int cpu = PCPU_GET(cpuid); u_int ipi_bitmap; + critical_enter(); + td = curthread; + td->td_intr_nesting_level++; + oldframe = td->td_intr_frame; + td->td_intr_frame = &frame; ipi_bitmap = atomic_readandclear_int(&cpu_ipi_pending[cpu]); - if (ipi_bitmap & (1 << IPI_PREEMPT)) { #ifdef COUNT_IPIS (*ipi_preempt_counts[cpu])++; #endif - sched_preempt(curthread); + sched_preempt(td); } if (ipi_bitmap & (1 << IPI_AST)) { #ifdef COUNT_IPIS @@ -1217,14 +1222,11 @@ ipi_bitmap_handler(struct trapframe fram #ifdef COUNT_IPIS (*ipi_hardclock_counts[cpu])++; #endif - hardclockintr(&frame); - } - if (ipi_bitmap & (1 << IPI_STATCLOCK)) { -#ifdef COUNT_IPIS - (*ipi_statclock_counts[cpu])++; -#endif - statclockintr(&frame); + hardclockintr(); } + td->td_intr_frame = oldframe; + td->td_intr_nesting_level--; + critical_exit(); } /* @@ -1579,8 +1581,6 @@ mp_ipi_intrcnt(void *dummy) intrcnt_add(buf, &ipi_lazypmap_counts[i]); snprintf(buf, sizeof(buf), "cpu%d:hardclock", i); intrcnt_add(buf, &ipi_hardclock_counts[i]); - snprintf(buf, sizeof(buf), "cpu%d:statclock", i); - intrcnt_add(buf, &ipi_statclock_counts[i]); } } SYSINIT(mp_ipi_intrcnt, SI_SUB_INTR, SI_ORDER_MIDDLE, mp_ipi_intrcnt, NULL); Modified: user/nwhitehorn/ps3/amd64/amd64/nexus.c ============================================================================== --- user/nwhitehorn/ps3/amd64/amd64/nexus.c Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/amd64/amd64/nexus.c Thu Sep 16 13:49:10 2010 (r212733) @@ -83,7 +83,7 @@ static int nexus_probe(device_t); static int nexus_attach(device_t); static int nexus_print_all_resources(device_t dev); static int nexus_print_child(device_t, device_t); -static device_t nexus_add_child(device_t bus, int order, const char *name, +static device_t nexus_add_child(device_t bus, u_int order, const char *name, int unit); static struct resource *nexus_alloc_resource(device_t, device_t, int, int *, u_long, u_long, u_long, u_int); @@ -293,7 +293,7 @@ nexus_print_child(device_t bus, device_t } static device_t -nexus_add_child(device_t bus, int order, const char *name, int unit) +nexus_add_child(device_t bus, u_int order, const char *name, int unit) { device_t child; struct nexus_device *ndev; Modified: user/nwhitehorn/ps3/amd64/conf/GENERIC ============================================================================== --- user/nwhitehorn/ps3/amd64/conf/GENERIC Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/amd64/conf/GENERIC Thu Sep 16 13:49:10 2010 (r212733) @@ -112,6 +112,7 @@ device hptiop # Highpoint RocketRaid 3 device isp # Qlogic family #device ispfw # Firmware for QLogic HBAs- normally a module device mpt # LSI-Logic MPT-Fusion +device mps # LSI-Logic MPT-Fusion 2 #device ncr # NCR/Symbios Logic device sym # NCR/Symbios Logic (newer chipsets + those of `ncr') device trm # Tekram DC395U/UW/F DC315U adapters Modified: user/nwhitehorn/ps3/amd64/include/apicvar.h ============================================================================== --- user/nwhitehorn/ps3/amd64/include/apicvar.h Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/amd64/include/apicvar.h Thu Sep 16 13:49:10 2010 (r212733) @@ -123,8 +123,7 @@ #define IPI_AST 0 /* Generate software trap. */ #define IPI_PREEMPT 1 #define IPI_HARDCLOCK 2 -#define IPI_STATCLOCK 3 -#define IPI_BITMAP_LAST IPI_STATCLOCK +#define IPI_BITMAP_LAST IPI_HARDCLOCK #define IPI_IS_BITMAPED(x) ((x) <= IPI_BITMAP_LAST) #define IPI_STOP (APIC_IPI_INTS + 7) /* Stop CPU until restarted. */ Modified: user/nwhitehorn/ps3/arm/arm/nexus.c ============================================================================== --- user/nwhitehorn/ps3/arm/arm/nexus.c Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/arm/arm/nexus.c Thu Sep 16 13:49:10 2010 (r212733) @@ -74,7 +74,7 @@ static struct rman mem_rman; static int nexus_probe(device_t); static int nexus_attach(device_t); static int nexus_print_child(device_t, device_t); -static device_t nexus_add_child(device_t, int, const char *, int); +static device_t nexus_add_child(device_t, u_int, const char *, int); static struct resource *nexus_alloc_resource(device_t, device_t, int, int *, u_long, u_long, u_long, u_int); static int nexus_activate_resource(device_t, device_t, int, int, @@ -166,7 +166,7 @@ nexus_print_child(device_t bus, device_t } static device_t -nexus_add_child(device_t bus, int order, const char *name, int unit) +nexus_add_child(device_t bus, u_int order, const char *name, int unit) { device_t child; struct nexus_device *ndev; Modified: user/nwhitehorn/ps3/arm/arm/pmap.c ============================================================================== --- user/nwhitehorn/ps3/arm/arm/pmap.c Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/arm/arm/pmap.c Thu Sep 16 13:49:10 2010 (r212733) @@ -3158,8 +3158,6 @@ pmap_remove_all(vm_page_t m) *ptep = 0; PTE_SYNC_CURRENT(pv->pv_pmap, ptep); pmap_free_l2_bucket(pv->pv_pmap, l2b, 1); - if (pv->pv_flags & PVF_WIRED) - pv->pv_pmap->pm_stats.wired_count--; pv->pv_pmap->pm_stats.resident_count--; flags |= pv->pv_flags; } Modified: user/nwhitehorn/ps3/arm/xscale/ixp425/ixp425.c ============================================================================== --- user/nwhitehorn/ps3/arm/xscale/ixp425/ixp425.c Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/arm/xscale/ixp425/ixp425.c Thu Sep 16 13:49:10 2010 (r212733) @@ -369,7 +369,7 @@ ixp425_hinted_child(device_t bus, const } static device_t -ixp425_add_child(device_t dev, int order, const char *name, int unit) +ixp425_add_child(device_t dev, u_int order, const char *name, int unit) { device_t child; struct ixp425_ivar *ivar; Modified: user/nwhitehorn/ps3/boot/sparc64/boot1/boot1.c ============================================================================== --- user/nwhitehorn/ps3/boot/sparc64/boot1/boot1.c Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/boot/sparc64/boot1/boot1.c Thu Sep 16 13:49:10 2010 (r212733) @@ -26,9 +26,7 @@ __FBSDID("$FreeBSD$"); #define _PATH_LOADER "/boot/loader" #define _PATH_KERNEL "/boot/kernel/kernel" -#define BSIZEMAX 16384 - -typedef int putc_func_t(int c, void *arg); +typedef int putc_func_t(char c, void *arg); typedef int32_t ofwh_t; struct sp_data { @@ -44,11 +42,6 @@ static char bootargs[128]; static ofwh_t bootdev; -static struct fs fs; -static ino_t inomap; -static char blkbuf[BSIZEMAX]; -static unsigned int fsblks; - static uint32_t fs_off; int main(int ac, char **av); @@ -66,14 +59,13 @@ static int mount(const char *device); static void panic(const char *fmt, ...) __dead2; static int printf(const char *fmt, ...); -static int putchar(int c, void *arg); +static int putchar(char c, void *arg); static int vprintf(const char *fmt, va_list ap); static int vsnprintf(char *str, size_t sz, const char *fmt, va_list ap); static int __printf(const char *fmt, putc_func_t *putc, void *arg, va_list ap); -static int __putc(int c, void *arg); static int __puts(const char *s, putc_func_t *putc, void *arg); -static int __sputc(int c, void *arg); +static int __sputc(char c, void *arg); static char *__uitoa(char *buf, u_int val, int base); static char *__ultoa(char *buf, u_long val, int base); @@ -83,19 +75,18 @@ static char *__ultoa(char *buf, u_long v typedef u_int64_t ofwcell_t; typedef u_int32_t u_ofwh_t; typedef int (*ofwfp_t)(ofwcell_t []); -ofwfp_t ofw; /* the prom Open Firmware entry */ +static ofwfp_t ofw; /* the PROM Open Firmware entry */ void ofw_init(int, int, int, int, ofwfp_t); -ofwh_t ofw_finddevice(const char *); -ofwh_t ofw_open(const char *); -int ofw_getprop(ofwh_t, const char *, void *, size_t); -int ofw_read(ofwh_t, void *, size_t); -int ofw_write(ofwh_t, const void *, size_t); -int ofw_seek(ofwh_t, u_int64_t); -void ofw_exit(void) __dead2; +static ofwh_t ofw_finddevice(const char *); +static ofwh_t ofw_open(const char *); +static int ofw_getprop(ofwh_t, const char *, void *, size_t); +static int ofw_read(ofwh_t, void *, size_t); +static int ofw_write(ofwh_t, const void *, size_t); +static int ofw_seek(ofwh_t, u_int64_t); +static void ofw_exit(void) __dead2; -ofwh_t bootdevh; -ofwh_t stdinh, stdouth; +static ofwh_t stdinh, stdouth; /* * This has to stay here, as the PROM seems to ignore the @@ -138,7 +129,7 @@ ofw_init(int d, int d1, int d2, int d3, exit(main(ac, av)); } -ofwh_t +static ofwh_t ofw_finddevice(const char *name) { ofwcell_t args[] = { @@ -156,7 +147,7 @@ ofw_finddevice(const char *name) return (args[4]); } -int +static int ofw_getprop(ofwh_t ofwh, const char *name, void *buf, size_t len) { ofwcell_t args[] = { @@ -178,7 +169,7 @@ ofw_getprop(ofwh_t ofwh, const char *nam return (0); } -ofwh_t +static ofwh_t ofw_open(const char *path) { ofwcell_t args[] = { @@ -196,7 +187,7 @@ ofw_open(const char *path) return (args[4]); } -int +static int ofw_close(ofwh_t devh) { ofwcell_t args[] = { @@ -213,12 +204,12 @@ ofw_close(ofwh_t devh) return (0); } -int +static int ofw_read(ofwh_t devh, void *buf, size_t len) { ofwcell_t args[] = { (ofwcell_t)"read", - 4, + 3, 1, (u_ofwh_t)devh, (ofwcell_t)buf, @@ -233,7 +224,7 @@ ofw_read(ofwh_t devh, void *buf, size_t return (0); } -int +static int ofw_write(ofwh_t devh, const void *buf, size_t len) { ofwcell_t args[] = { @@ -253,12 +244,12 @@ ofw_write(ofwh_t devh, const void *buf, return (0); } -int +static int ofw_seek(ofwh_t devh, u_int64_t off) { ofwcell_t args[] = { (ofwcell_t)"seek", - 4, + 3, 1, (u_ofwh_t)devh, off >> 32, @@ -273,7 +264,7 @@ ofw_seek(ofwh_t devh, u_int64_t off) return (0); } -void +static void ofw_exit(void) { ofwcell_t args[3]; @@ -299,6 +290,7 @@ bcopy(const void *src, void *dst, size_t static void memcpy(void *dst, const void *src, size_t len) { + bcopy(src, dst, len); } @@ -314,6 +306,7 @@ bzero(void *b, size_t len) static int strcmp(const char *s1, const char *s2) { + for (; *s1 == *s2 && *s1; s1++, s2++) ; return ((u_char)*s1 - (u_char)*s2); @@ -431,6 +424,7 @@ load(const char *fname) static int dskread(void *buf, u_int64_t lba, int nblk) { + /* * The Open Firmware should open the correct partition for us. * That means, if we read from offset zero on an open instance handle, @@ -468,7 +462,7 @@ printf(const char *fmt, ...) } static int -putchar(int c, void *arg) +putchar(char c, void *arg) { char buf; @@ -614,7 +608,7 @@ reswitch: c = *fmt++; } static int -__sputc(int c, void *arg) +__sputc(char c, void *arg) { struct sp_data *sp; Modified: user/nwhitehorn/ps3/boot/zfs/zfsimpl.c ============================================================================== --- user/nwhitehorn/ps3/boot/zfs/zfsimpl.c Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/boot/zfs/zfsimpl.c Thu Sep 16 13:49:10 2010 (r212733) @@ -376,6 +376,27 @@ vdev_mirror_read(vdev_t *vdev, const blk return (rc); } +static int +vdev_replacing_read(vdev_t *vdev, const blkptr_t *bp, void *buf, + off_t offset, size_t bytes) +{ + vdev_t *kid; + + /* + * Here we should have two kids: + * First one which is the one we are replacing and we can trust + * only this one to have valid data, but it might not be present. + * Second one is that one we are replacing with. It is most likely + * healthy, but we can't trust it has needed data, so we won't use it. + */ + kid = STAILQ_FIRST(&vdev->v_children); + if (kid == NULL) + return (EIO); + if (kid->v_state != VDEV_STATE_HEALTHY) + return (EIO); + return (kid->v_read(kid, bp, buf, offset, bytes)); +} + static vdev_t * vdev_find(uint64_t guid) { @@ -416,7 +437,7 @@ vdev_init_from_nvlist(const unsigned cha vdev_t *vdev, *kid; const unsigned char *kids; int nkids, i, is_new; - uint64_t is_offline, is_faulted, is_degraded, is_removed; + uint64_t is_offline, is_faulted, is_degraded, is_removed, isnt_present; if (nvlist_find(nvlist, ZPOOL_CONFIG_GUID, DATA_TYPE_UINT64, 0, &guid) @@ -430,12 +451,13 @@ vdev_init_from_nvlist(const unsigned cha if (strcmp(type, VDEV_TYPE_MIRROR) && strcmp(type, VDEV_TYPE_DISK) - && strcmp(type, VDEV_TYPE_RAIDZ)) { + && strcmp(type, VDEV_TYPE_RAIDZ) + && strcmp(type, VDEV_TYPE_REPLACING)) { printf("ZFS: can only boot from disk, mirror or raidz vdevs\n"); return (EIO); } - is_offline = is_removed = is_faulted = is_degraded = 0; + is_offline = is_removed = is_faulted = is_degraded = isnt_present = 0; nvlist_find(nvlist, ZPOOL_CONFIG_OFFLINE, DATA_TYPE_UINT64, 0, &is_offline); @@ -445,6 +467,8 @@ vdev_init_from_nvlist(const unsigned cha &is_faulted); nvlist_find(nvlist, ZPOOL_CONFIG_DEGRADED, DATA_TYPE_UINT64, 0, &is_degraded); + nvlist_find(nvlist, ZPOOL_CONFIG_NOT_PRESENT, DATA_TYPE_UINT64, 0, + &isnt_present); vdev = vdev_find(guid); if (!vdev) { @@ -454,6 +478,8 @@ vdev_init_from_nvlist(const unsigned cha vdev = vdev_create(guid, vdev_mirror_read); else if (!strcmp(type, VDEV_TYPE_RAIDZ)) vdev = vdev_create(guid, vdev_raidz_read); + else if (!strcmp(type, VDEV_TYPE_REPLACING)) + vdev = vdev_create(guid, vdev_replacing_read); else vdev = vdev_create(guid, vdev_disk_read); @@ -488,7 +514,16 @@ vdev_init_from_nvlist(const unsigned cha vdev->v_name = strdup(type); } } + } else { + is_new = 0; + } + if (is_new || is_newer) { + /* + * This is either new vdev or we've already seen this vdev, + * but from an older vdev label, so let's refresh its state + * from the newer label. + */ if (is_offline) vdev->v_state = VDEV_STATE_OFFLINE; else if (is_removed) @@ -497,28 +532,10 @@ vdev_init_from_nvlist(const unsigned cha vdev->v_state = VDEV_STATE_FAULTED; else if (is_degraded) vdev->v_state = VDEV_STATE_DEGRADED; + else if (isnt_present) + vdev->v_state = VDEV_STATE_CANT_OPEN; else vdev->v_state = VDEV_STATE_HEALTHY; - } else { - is_new = 0; - - if (is_newer) { - /* - * We've already seen this vdev, but from an older - * vdev label, so let's refresh its state from the - * newer label. - */ - if (is_offline) - vdev->v_state = VDEV_STATE_OFFLINE; - else if (is_removed) - vdev->v_state = VDEV_STATE_REMOVED; - else if (is_faulted) - vdev->v_state = VDEV_STATE_FAULTED; - else if (is_degraded) - vdev->v_state = VDEV_STATE_DEGRADED; - else - vdev->v_state = VDEV_STATE_HEALTHY; - } } rc = nvlist_find(nvlist, ZPOOL_CONFIG_CHILDREN, @@ -754,6 +771,7 @@ vdev_probe(vdev_phys_read_t *read, void uint64_t val; uint64_t guid; uint64_t pool_txg, pool_guid; + uint64_t is_log; const char *pool_name; const unsigned char *vdevs; int i, rc, is_newer; @@ -830,6 +848,12 @@ vdev_probe(vdev_phys_read_t *read, void return (EIO); } + is_log = 0; + (void) nvlist_find(nvlist, ZPOOL_CONFIG_IS_LOG, DATA_TYPE_UINT64, 0, + &is_log); + if (is_log) + return (EIO); + /* * Create the pool if this is the first time we've seen it. */ Modified: user/nwhitehorn/ps3/cddl/boot/zfs/zfsimpl.h ============================================================================== --- user/nwhitehorn/ps3/cddl/boot/zfs/zfsimpl.h Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/cddl/boot/zfs/zfsimpl.h Thu Sep 16 13:49:10 2010 (r212733) @@ -546,6 +546,7 @@ typedef enum { #define ZPOOL_CONFIG_NPARITY "nparity" #define ZPOOL_CONFIG_HOSTID "hostid" #define ZPOOL_CONFIG_HOSTNAME "hostname" +#define ZPOOL_CONFIG_IS_LOG "is_log" #define ZPOOL_CONFIG_TIMESTAMP "timestamp" /* not stored on disk */ /* Modified: user/nwhitehorn/ps3/cddl/compat/opensolaris/sys/vnode.h ============================================================================== --- user/nwhitehorn/ps3/cddl/compat/opensolaris/sys/vnode.h Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/cddl/compat/opensolaris/sys/vnode.h Thu Sep 16 13:49:10 2010 (r212733) @@ -69,11 +69,14 @@ vn_is_readonly(vnode_t *vp) #define vn_vfsunlock(vp) do { } while (0) #define vn_ismntpt(vp) ((vp)->v_type == VDIR && (vp)->v_mountedhere != NULL) #define vn_mountedvfs(vp) ((vp)->v_mountedhere) -#define vn_has_cached_data(vp) ((vp)->v_object != NULL && (vp)->v_object->resident_page_count > 0) +#define vn_has_cached_data(vp) \ + ((vp)->v_object != NULL && ((vp)->v_object->resident_page_count > 0 \ + || (vp)->v_object->cache != NULL)) #define vn_exists(vp) do { } while (0) #define vn_invalid(vp) do { } while (0) #define vn_renamepath(tdvp, svp, tnm, lentnm) do { } while (0) #define vn_free(vp) do { } while (0) +#define vn_matchops(vp, vops) ((vp)->v_op == &(vops)) #define VN_HOLD(v) vref(v) #define VN_RELE(v) vrele(v) Modified: user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c ============================================================================== --- user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c Thu Sep 16 12:39:50 2010 (r212732) +++ user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c Thu Sep 16 13:49:10 2010 (r212733) @@ -460,11 +460,13 @@ fasttrap_fork(proc_t *p, proc_t *cp) /* * dtrace_helpers_duplicate() allocates memory. */ + _PHOLD(cp); PROC_UNLOCK(p); PROC_UNLOCK(cp); dtrace_helpers_duplicate(p, cp); PROC_LOCK(cp); PROC_LOCK(p); + _PRELE(cp); } /* * This check is purposely here instead of in kern_fork.c because, @@ -494,6 +496,8 @@ fasttrap_fork(proc_t *p, proc_t *cp) mtx_lock_spin(&cp->p_slock); sprlock_proc(cp); mtx_unlock_spin(&cp->p_slock); +#else + _PHOLD(cp); #endif /* @@ -527,6 +531,8 @@ fasttrap_fork(proc_t *p, proc_t *cp) #if defined(sun) mutex_enter(&cp->p_lock); sprunlock(cp); +#else + _PRELE(cp); #endif } @@ -542,6 +548,7 @@ fasttrap_exec_exit(proc_t *p) ASSERT(p == curproc); #endif PROC_LOCK_ASSERT(p, MA_OWNED); + _PHOLD(p); PROC_UNLOCK(p); /* @@ -554,6 +561,7 @@ fasttrap_exec_exit(proc_t *p) dtrace_helpers_destroy(p); #endif PROC_LOCK(p); + _PRELE(p); } @@ -693,8 +701,6 @@ again: */ #if defined(sun) ASSERT(p->p_proc_flag & P_PR_LOCK); -#else - PROC_LOCK_ASSERT(p, MA_OWNED); #endif p->p_dtrace_count++; @@ -887,8 +893,6 @@ fasttrap_tracepoint_disable(proc_t *p, f */ #if defined(sun) ASSERT(p->p_proc_flag & P_PR_LOCK); -#else - PROC_LOCK_ASSERT(p, MA_OWNED); #endif p->p_dtrace_count--; } @@ -1042,9 +1046,14 @@ fasttrap_pid_enable(void *arg, dtrace_id * the chance to execute the trap instruction we're about to place * in their process's text. */ +#ifdef __FreeBSD__ + /* + * pfind() returns a locked process. + */ + _PHOLD(p); PROC_UNLOCK(p); +#endif fasttrap_enable_callbacks(); - PROC_LOCK(p); /* * Enable all the tracepoints and add this probe's id to each @@ -1075,7 +1084,7 @@ fasttrap_pid_enable(void *arg, dtrace_id mutex_enter(&p->p_lock); sprunlock(p); #else - PROC_UNLOCK(p); + PRELE(p); #endif /* @@ -1090,7 +1099,7 @@ fasttrap_pid_enable(void *arg, dtrace_id mutex_enter(&p->p_lock); sprunlock(p); #else - PROC_UNLOCK(p); + PRELE(p); #endif probe->ftp_enabled = 1; @@ -1119,6 +1128,10 @@ fasttrap_pid_disable(void *arg, dtrace_i mutex_exit(&provider->ftp_mtx); return; } +#ifdef __FreeBSD__ *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***