Date: Mon, 17 May 2010 14:00:46 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r208191 - in projects/ppc64: cddl/contrib/opensolaris/lib/libzpool/common/sys lib/libarchive sbin/geom/class/part sys/amd64/amd64 sys/arm/arm sys/cddl/contrib/opensolaris/uts/common/fs/... Message-ID: <201005171400.o4HE0kxn043219@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: nwhitehorn Date: Mon May 17 14:00:46 2010 New Revision: 208191 URL: http://svn.freebsd.org/changeset/base/208191 Log: IFC @ 208190 Modified: projects/ppc64/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h projects/ppc64/lib/libarchive/Makefile projects/ppc64/lib/libarchive/config_freebsd.h projects/ppc64/sbin/geom/class/part/geom_part.c projects/ppc64/sys/amd64/amd64/pmap.c projects/ppc64/sys/arm/arm/pmap.c projects/ppc64/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h projects/ppc64/sys/conf/files projects/ppc64/sys/dev/ata/chipsets/ata-serverworks.c projects/ppc64/sys/dev/ofw/ofw_if.m projects/ppc64/sys/dev/ofw/ofw_standard.c projects/ppc64/sys/dev/ofw/openfirm.c projects/ppc64/sys/dev/ofw/openfirm.h projects/ppc64/sys/geom/part/g_part_apm.c projects/ppc64/sys/i386/i386/pmap.c projects/ppc64/sys/i386/xen/pmap.c projects/ppc64/sys/ia64/ia64/pmap.c projects/ppc64/sys/kern/sched_ule.c projects/ppc64/sys/kern/subr_smp.c projects/ppc64/sys/mips/conf/XLR projects/ppc64/sys/mips/include/locore.h projects/ppc64/sys/mips/include/param.h projects/ppc64/sys/mips/include/smp.h projects/ppc64/sys/mips/mips/cpu.c projects/ppc64/sys/mips/mips/machdep.c projects/ppc64/sys/mips/mips/mp_machdep.c projects/ppc64/sys/mips/mips/mpboot.S projects/ppc64/sys/mips/mips/pmap.c projects/ppc64/sys/mips/rmi/dev/xlr/rge.c projects/ppc64/sys/mips/rmi/files.xlr projects/ppc64/sys/mips/rmi/interrupt.h projects/ppc64/sys/mips/rmi/intr_machdep.c projects/ppc64/sys/mips/rmi/iodi.c projects/ppc64/sys/mips/rmi/on_chip.c projects/ppc64/sys/mips/rmi/pic.h projects/ppc64/sys/mips/rmi/xlr_machdep.c projects/ppc64/sys/mips/rmi/xlr_pci.c projects/ppc64/sys/mips/rmi/xlrconfig.h projects/ppc64/sys/modules/mvs/Makefile projects/ppc64/sys/net/flowtable.c projects/ppc64/sys/net/flowtable.h projects/ppc64/sys/netinet/sctp_bsd_addr.c projects/ppc64/sys/netinet/sctp_bsd_addr.h projects/ppc64/sys/netinet/sctp_constants.h projects/ppc64/sys/netinet/sctp_lock_bsd.h projects/ppc64/sys/netinet/sctp_pcb.c projects/ppc64/sys/netinet/sctp_pcb.h projects/ppc64/sys/netinet/sctp_structs.h projects/ppc64/sys/netinet/sctp_timer.c projects/ppc64/sys/netinet/sctputil.c projects/ppc64/sys/netinet6/ip6_input.c projects/ppc64/sys/powerpc/aim/mmu_oea.c projects/ppc64/sys/powerpc/aim/mmu_oea64.c projects/ppc64/sys/powerpc/aim/ofw_machdep.c projects/ppc64/sys/powerpc/booke/pmap.c projects/ppc64/sys/powerpc/ofw/ofw_pcibus.c projects/ppc64/sys/powerpc/ofw/ofw_real.c projects/ppc64/sys/powerpc/powermac/ata_kauai.c projects/ppc64/sys/powerpc/powermac/smu.c projects/ppc64/sys/sparc64/sparc64/pmap.c projects/ppc64/sys/sun4v/sun4v/pmap.c projects/ppc64/sys/vm/vm_object.c projects/ppc64/sys/vm/vm_page.c projects/ppc64/sys/vm/vm_page.h projects/ppc64/usr.bin/ar/Makefile projects/ppc64/usr.bin/ar/acpyacc.y projects/ppc64/usr.bin/ar/ar.1 projects/ppc64/usr.bin/ar/ar.c projects/ppc64/usr.bin/ar/ar.h projects/ppc64/usr.bin/ar/read.c projects/ppc64/usr.bin/ar/write.c projects/ppc64/usr.bin/wc/wc.c projects/ppc64/usr.sbin/daemon/daemon.8 Directory Properties: projects/ppc64/ (props changed) projects/ppc64/cddl/contrib/opensolaris/ (props changed) projects/ppc64/contrib/ee/ (props changed) projects/ppc64/contrib/expat/ (props changed) projects/ppc64/contrib/file/ (props changed) projects/ppc64/contrib/gdb/ (props changed) projects/ppc64/contrib/gnu-sort/ (props changed) projects/ppc64/contrib/groff/ (props changed) projects/ppc64/contrib/less/ (props changed) projects/ppc64/contrib/libpcap/ (props changed) projects/ppc64/contrib/ncurses/ (props changed) projects/ppc64/contrib/one-true-awk/ (props changed) projects/ppc64/contrib/openbsm/ (props changed) projects/ppc64/contrib/openpam/ (props changed) projects/ppc64/contrib/pf/ (props changed) projects/ppc64/contrib/tcpdump/ (props changed) projects/ppc64/contrib/tcsh/ (props changed) projects/ppc64/contrib/tzcode/stdtime/ (props changed) projects/ppc64/contrib/tzcode/zic/ (props changed) projects/ppc64/contrib/tzdata/ (props changed) projects/ppc64/contrib/wpa/ (props changed) projects/ppc64/lib/libutil/ (props changed) projects/ppc64/lib/libz/ (props changed) projects/ppc64/sbin/ (props changed) projects/ppc64/sbin/ipfw/ (props changed) projects/ppc64/sys/ (props changed) projects/ppc64/sys/amd64/include/xen/ (props changed) projects/ppc64/sys/cddl/contrib/opensolaris/ (props changed) projects/ppc64/sys/contrib/dev/acpica/ (props changed) projects/ppc64/sys/contrib/x86emu/ (props changed) projects/ppc64/sys/dev/xen/xenpci/ (props changed) projects/ppc64/usr.bin/csup/ (props changed) projects/ppc64/usr.bin/procstat/ (props changed) Modified: projects/ppc64/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h ============================================================================== --- projects/ppc64/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h Mon May 17 14:00:46 2010 (r208191) @@ -343,6 +343,9 @@ extern void taskq_wait(taskq_t *); extern int taskq_member(taskq_t *, void *); extern void system_taskq_init(void); +#define taskq_dispatch_safe(tq, func, arg, task) \ + taskq_dispatch((tq), (func), (arg), TQ_SLEEP) + #define XVA_MAPSIZE 3 #define XVA_MAGIC 0x78766174 Modified: projects/ppc64/lib/libarchive/Makefile ============================================================================== --- projects/ppc64/lib/libarchive/Makefile Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/lib/libarchive/Makefile Mon May 17 14:00:46 2010 (r208191) @@ -2,8 +2,16 @@ .include <bsd.own.mk> LIB= archive -DPADD= ${LIBBZ2} ${LIBZ} ${LIBMD} ${LIBLZMA} -LDADD= -lbz2 -lz -lmd -llzma +DPADD= ${LIBZ} ${LIBMD} +LDADD= -lz -lmd + +DPADD+= ${LIBBZ2} +LDADD+= -lbz2 +CFLAGS+= -DHAVE_BZLIB_H=1 + +DPADD+= ${LIBLZMA} +LDADD+= -llzma +CFLAGS+= -DHAVE_LIBLZMA=1 -DHAVE_LZMA_H=1 # FreeBSD SHLIB_MAJOR value is managed as part of the FreeBSD system. # It has no real relation to the libarchive version number. @@ -11,7 +19,6 @@ SHLIB_MAJOR= 5 CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\" CFLAGS+= -I${.OBJDIR} -CFLAGS+= -DHAVE_LIBLZMA=1 -DHAVE_LZMA_H=1 .if ${MK_OPENSSL} != "no" CFLAGS+= -DWITH_OPENSSL Modified: projects/ppc64/lib/libarchive/config_freebsd.h ============================================================================== --- projects/ppc64/lib/libarchive/config_freebsd.h Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/lib/libarchive/config_freebsd.h Mon May 17 14:00:46 2010 (r208191) @@ -52,7 +52,6 @@ #endif #define HAVE_BSDXML_H 1 -#define HAVE_BZLIB_H 1 #define HAVE_CHFLAGS 1 #define HAVE_CHOWN 1 #define HAVE_DECL_INT64_MAX 1 Modified: projects/ppc64/sbin/geom/class/part/geom_part.c ============================================================================== --- projects/ppc64/sbin/geom/class/part/geom_part.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sbin/geom/class/part/geom_part.c Mon May 17 14:00:46 2010 (r208191) @@ -705,7 +705,7 @@ gpart_bootcode(struct gctl_req *req, uns if (gctl_has_param(req, bootcode_param)) { s = gctl_get_ascii(req, bootcode_param); - bootsize = 64 * 1024; /* Arbitrary limit. */ + bootsize = 800 * 1024; /* Arbitrary limit. */ bootcode = gpart_bootfile_read(s, &bootsize); error = gctl_change_param(req, bootcode_param, bootsize, bootcode); Modified: projects/ppc64/sys/amd64/amd64/pmap.c ============================================================================== --- projects/ppc64/sys/amd64/amd64/pmap.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/amd64/amd64/pmap.c Mon May 17 14:00:46 2010 (r208191) @@ -3139,7 +3139,10 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 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)); + ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%lx)", + va)); + KASSERT((m->oflags & VPO_BUSY) != 0, + ("pmap_enter: page %p is not busy", m)); mpte = NULL; @@ -4240,7 +4243,16 @@ pmap_remove_write(vm_page_t m) pt_entry_t oldpte, *pte; vm_offset_t va; - if ((m->flags & PG_FICTITIOUS) != 0 || + KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + ("pmap_remove_write: page %p is not managed", m)); + + /* + * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PG_WRITEABLE + * is clear, no page table entries need updating. + */ + VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); + if ((m->oflags & VPO_BUSY) == 0 && (m->flags & PG_WRITEABLE) == 0) return; vm_page_lock_queues(); Modified: projects/ppc64/sys/arm/arm/pmap.c ============================================================================== --- projects/ppc64/sys/arm/arm/pmap.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/arm/arm/pmap.c Mon May 17 14:00:46 2010 (r208191) @@ -3318,6 +3318,8 @@ pmap_enter_locked(pmap_t pmap, vm_offset u_int oflags; vm_paddr_t pa; + KASSERT((m->oflags & VPO_BUSY) != 0 || (flags & M_NOWAIT) != 0, + ("pmap_enter_locked: page %p is not busy", m)); PMAP_ASSERT_LOCKED(pmap); mtx_assert(&vm_page_queue_mtx, MA_OWNED); if (va == vector_page) { @@ -4527,7 +4529,17 @@ void pmap_remove_write(vm_page_t m) { - if (m->flags & PG_WRITEABLE) { + KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + ("pmap_remove_write: page %p is not managed", m)); + + /* + * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PG_WRITEABLE + * is clear, no page table entries need updating. + */ + VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); + if ((m->oflags & VPO_BUSY) != 0 || + (m->flags & PG_WRITEABLE) != 0) { vm_page_lock_queues(); pmap_clearbit(m, PVF_WRITE); vm_page_unlock_queues(); Modified: projects/ppc64/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h ============================================================================== --- projects/ppc64/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h Mon May 17 14:00:46 2010 (r208191) @@ -317,8 +317,10 @@ struct zio { /* FMA state */ uint64_t io_ena; +#ifdef _KERNEL /* FreeBSD only. */ struct ostask io_task; +#endif }; extern zio_t *zio_null(zio_t *pio, spa_t *spa, Modified: projects/ppc64/sys/conf/files ============================================================================== --- projects/ppc64/sys/conf/files Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/conf/files Mon May 17 14:00:46 2010 (r208191) @@ -1294,7 +1294,7 @@ dev/mpt/mpt_raid.c optional mpt dev/mpt/mpt_user.c optional mpt dev/msk/if_msk.c optional msk inet dev/mvs/mvs.c optional mvs -dev/mvs/mvs_if.m standard +dev/mvs/mvs_if.m optional mvs dev/mvs/mvs_pci.c optional mvs pci dev/mwl/if_mwl.c optional mwl dev/mwl/if_mwl_pci.c optional mwl pci Modified: projects/ppc64/sys/dev/ata/chipsets/ata-serverworks.c ============================================================================== --- projects/ppc64/sys/dev/ata/chipsets/ata-serverworks.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/dev/ata/chipsets/ata-serverworks.c Mon May 17 14:00:46 2010 (r208191) @@ -41,9 +41,6 @@ __FBSDID("$FreeBSD$"); #include <sys/sema.h> #include <sys/taskqueue.h> #include <vm/uma.h> -#ifdef __powerpc__ -#include <machine/intr_machdep.h> -#endif #include <machine/stdarg.h> #include <machine/resource.h> #include <machine/bus.h> @@ -220,10 +217,6 @@ ata_serverworks_ch_attach(device_t dev) ch->hw.tf_write = ata_serverworks_tf_write; #ifdef __powerpc__ ch->hw.status = ata_serverworks_status; - - /* Make sure that our interrupt is edge triggered */ - powerpc_config_intr(bus_get_resource_start(device_get_parent(dev), - SYS_RES_IRQ, 0), INTR_TRIGGER_EDGE, INTR_POLARITY_HIGH); #endif if (ctlr->chip->chipid == ATA_K2) { Modified: projects/ppc64/sys/dev/ofw/ofw_if.m ============================================================================== --- projects/ppc64/sys/dev/ofw/ofw_if.m Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/dev/ofw/ofw_if.m Mon May 17 14:00:46 2010 (r208191) @@ -340,13 +340,6 @@ METHOD void release { # Commands for returning control to the firmware /** - * @brief Turn off firmware background activities - */ -METHOD void quiesce { - ofw_t _ofw; -}; - -/** * @brief Temporarily return control to firmware. */ METHOD void enter { Modified: projects/ppc64/sys/dev/ofw/ofw_standard.c ============================================================================== --- projects/ppc64/sys/dev/ofw/ofw_standard.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/dev/ofw/ofw_standard.c Mon May 17 14:00:46 2010 (r208191) @@ -105,7 +105,6 @@ static ssize_t ofw_std_write(ofw_t ofw, static int ofw_std_seek(ofw_t ofw, ihandle_t instance, uint64_t pos); static caddr_t ofw_std_claim(ofw_t ofw, void *virt, size_t size, u_int align); static void ofw_std_release(ofw_t ofw, void *virt, size_t size); -static void ofw_std_quiesce(ofw_t ofw); static void ofw_std_enter(ofw_t ofw); static void ofw_std_exit(ofw_t ofw); @@ -134,7 +133,6 @@ static ofw_method_t ofw_std_methods[] = OFWMETHOD(ofw_seek, ofw_std_seek), OFWMETHOD(ofw_claim, ofw_std_claim), OFWMETHOD(ofw_release, ofw_std_release), - OFWMETHOD(ofw_quiesce, ofw_std_quiesce), OFWMETHOD(ofw_enter, ofw_std_enter), OFWMETHOD(ofw_exit, ofw_std_exit), @@ -731,23 +729,6 @@ ofw_std_release(ofw_t ofw, void *virt, s * Control transfer functions */ -/* Turn off OF background tasks */ -static void -ofw_std_quiesce(ofw_t ofw) -{ - struct { - cell_t name; - cell_t nargs; - cell_t nreturns; - } args = { - (cell_t)"quiesce", - 0, - 0, - }; - - openfirmware(&args); -} - /* Suspend and drop back to the Open Firmware interface. */ static void ofw_std_enter(ofw_t ofw) Modified: projects/ppc64/sys/dev/ofw/openfirm.c ============================================================================== --- projects/ppc64/sys/dev/ofw/openfirm.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/dev/ofw/openfirm.c Mon May 17 14:00:46 2010 (r208191) @@ -409,15 +409,6 @@ OF_release(void *virt, size_t size) * Control transfer functions */ -/* Turn off OF background tasks */ -void -OF_quiesce() -{ - - OFW_QUIESCE(ofw_obj); -} - - /* Suspend and drop back to the Open Firmware interface. */ void OF_enter() Modified: projects/ppc64/sys/dev/ofw/openfirm.h ============================================================================== --- projects/ppc64/sys/dev/ofw/openfirm.h Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/dev/ofw/openfirm.h Mon May 17 14:00:46 2010 (r208191) @@ -134,7 +134,6 @@ void *OF_claim(void *virtrequest, size_ void OF_release(void *virt, size_t size); /* Control transfer functions */ -void OF_quiesce(void); void OF_enter(void); void OF_exit(void) __attribute__((noreturn)); Modified: projects/ppc64/sys/geom/part/g_part_apm.c ============================================================================== --- projects/ppc64/sys/geom/part/g_part_apm.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/geom/part/g_part_apm.c Mon May 17 14:00:46 2010 (r208191) @@ -131,6 +131,26 @@ apm_parse_type(const char *type, char *b strncpy(buf, type, bufsz); return (0); } + alias = g_part_alias_name(G_PART_ALIAS_APPLE_BOOT); + if (!strcasecmp(type, alias)) { + strcpy(buf, APM_ENT_TYPE_APPLE_BOOT); + return (0); + } + alias = g_part_alias_name(G_PART_ALIAS_APPLE_HFS); + if (!strcasecmp(type, alias)) { + strcpy(buf, APM_ENT_TYPE_APPLE_HFS); + return (0); + } + alias = g_part_alias_name(G_PART_ALIAS_APPLE_UFS); + if (!strcasecmp(type, alias)) { + strcpy(buf, APM_ENT_TYPE_APPLE_UFS); + return (0); + } + alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_BOOT); + if (!strcasecmp(type, alias)) { + strcpy(buf, APM_ENT_TYPE_APPLE_BOOT); + return (0); + } alias = g_part_alias_name(G_PART_ALIAS_FREEBSD); if (!strcasecmp(type, alias)) { strcpy(buf, APM_ENT_TYPE_FREEBSD); @@ -445,6 +465,12 @@ g_part_apm_type(struct g_part_table *bas entry = (struct g_part_apm_entry *)baseentry; type = entry->ent.ent_type; + if (!strcmp(type, APM_ENT_TYPE_APPLE_BOOT)) + return (g_part_alias_name(G_PART_ALIAS_APPLE_BOOT)); + if (!strcmp(type, APM_ENT_TYPE_APPLE_HFS)) + return (g_part_alias_name(G_PART_ALIAS_APPLE_HFS)); + if (!strcmp(type, APM_ENT_TYPE_APPLE_UFS)) + return (g_part_alias_name(G_PART_ALIAS_APPLE_UFS)); if (!strcmp(type, APM_ENT_TYPE_FREEBSD)) return (g_part_alias_name(G_PART_ALIAS_FREEBSD)); if (!strcmp(type, APM_ENT_TYPE_FREEBSD_SWAP)) Modified: projects/ppc64/sys/i386/i386/pmap.c ============================================================================== --- projects/ppc64/sys/i386/i386/pmap.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/i386/i386/pmap.c Mon May 17 14:00:46 2010 (r208191) @@ -3268,7 +3268,10 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 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%x)", va)); + ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%x)", + va)); + KASSERT((m->oflags & VPO_BUSY) != 0, + ("pmap_enter: page %p is not busy", m)); mpte = NULL; @@ -4410,7 +4413,16 @@ pmap_remove_write(vm_page_t m) pt_entry_t oldpte, *pte; vm_offset_t va; - if ((m->flags & PG_FICTITIOUS) != 0 || + KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + ("pmap_remove_write: page %p is not managed", m)); + + /* + * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PG_WRITEABLE + * is clear, no page table entries need updating. + */ + VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); + if ((m->oflags & VPO_BUSY) == 0 && (m->flags & PG_WRITEABLE) == 0) return; vm_page_lock_queues(); Modified: projects/ppc64/sys/i386/xen/pmap.c ============================================================================== --- projects/ppc64/sys/i386/xen/pmap.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/i386/xen/pmap.c Mon May 17 14:00:46 2010 (r208191) @@ -2682,12 +2682,12 @@ pmap_enter(pmap_t pmap, vm_offset_t va, CTR6(KTR_PMAP, "pmap_enter: pmap=%08p va=0x%08x access=0x%x ma=0x%08x prot=0x%x wired=%d", pmap, va, access, xpmap_ptom(VM_PAGE_TO_PHYS(m)), prot, wired); va = trunc_page(va); -#ifdef PMAP_DIAGNOSTIC - if (va > VM_MAX_KERNEL_ADDRESS) - panic("pmap_enter: toobig"); - if ((va >= UPT_MIN_ADDRESS) && (va < UPT_MAX_ADDRESS)) - panic("pmap_enter: invalid to pmap_enter page table pages (va: 0x%x)", va); -#endif + 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%x)", + va)); + KASSERT((m->oflags & VPO_BUSY) != 0, + ("pmap_enter: page %p is not busy", m)); mpte = NULL; @@ -3780,7 +3780,16 @@ pmap_remove_write(vm_page_t m) pmap_t pmap; pt_entry_t oldpte, *pte; - if ((m->flags & PG_FICTITIOUS) != 0 || + KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + ("pmap_remove_write: page %p is not managed", m)); + + /* + * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PG_WRITEABLE + * is clear, no page table entries need updating. + */ + VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); + if ((m->oflags & VPO_BUSY) == 0 && (m->flags & PG_WRITEABLE) == 0) return; vm_page_lock_queues(); Modified: projects/ppc64/sys/ia64/ia64/pmap.c ============================================================================== --- projects/ppc64/sys/ia64/ia64/pmap.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/ia64/ia64/pmap.c Mon May 17 14:00:46 2010 (r208191) @@ -1497,10 +1497,9 @@ pmap_enter(pmap_t pmap, vm_offset_t va, oldpmap = pmap_switch(pmap); va &= ~PAGE_MASK; -#ifdef DIAGNOSTIC - if (va > VM_MAX_KERNEL_ADDRESS) - panic("pmap_enter: toobig"); -#endif + KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig")); + KASSERT((m->oflags & VPO_BUSY) != 0, + ("pmap_enter: page %p is not busy", m)); /* * Find (or create) a pte for the given mapping. @@ -2116,7 +2115,16 @@ pmap_remove_write(vm_page_t m) pv_entry_t pv; vm_prot_t prot; - if ((m->flags & PG_FICTITIOUS) != 0 || + KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + ("pmap_remove_write: page %p is not managed", m)); + + /* + * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PG_WRITEABLE + * is clear, no page table entries need updating. + */ + VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); + if ((m->oflags & VPO_BUSY) == 0 && (m->flags & PG_WRITEABLE) == 0) return; vm_page_lock_queues(); Modified: projects/ppc64/sys/kern/sched_ule.c ============================================================================== --- projects/ppc64/sys/kern/sched_ule.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/kern/sched_ule.c Mon May 17 14:00:46 2010 (r208191) @@ -80,7 +80,7 @@ dtrace_vtime_switch_func_t dtrace_vtime_ #include <machine/cpu.h> #include <machine/smp.h> -#if defined(__sparc64__) || defined(__mips__) +#if defined(__sparc64__) #error "This architecture is not currently compatible with ULE" #endif Modified: projects/ppc64/sys/kern/subr_smp.c ============================================================================== --- projects/ppc64/sys/kern/subr_smp.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/kern/subr_smp.c Mon May 17 14:00:46 2010 (r208191) @@ -503,7 +503,10 @@ smp_topo_none(void) top = &group[0]; top->cg_parent = NULL; top->cg_child = NULL; - top->cg_mask = (1 << mp_ncpus) - 1; + if (mp_ncpus == sizeof(top->cg_mask) * 8) + top->cg_mask = -1; + else + top->cg_mask = (1 << mp_ncpus) - 1; top->cg_count = mp_ncpus; top->cg_children = 0; top->cg_level = CG_SHARE_NONE; Modified: projects/ppc64/sys/mips/conf/XLR ============================================================================== --- projects/ppc64/sys/mips/conf/XLR Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/mips/conf/XLR Mon May 17 14:00:46 2010 (r208191) @@ -59,10 +59,11 @@ include "../rmi/std.xlr" makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols #profile 2 -#options SCHED_ULE # ULE scheduler +options SCHED_ULE # ULE scheduler #options VERBOSE_SYSINIT -options SCHED_4BSD # 4BSD scheduler -#options PREEMPTION # Enable kernel thread preemption +#options SCHED_4BSD # 4BSD scheduler +options SMP +options PREEMPTION # Enable kernel thread preemption #options FULL_PREEMPTION # Enable kernel thread preemption options INET # InterNETworking options INET6 # IPv6 communications protocols Modified: projects/ppc64/sys/mips/include/locore.h ============================================================================== --- projects/ppc64/sys/mips/include/locore.h Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/mips/include/locore.h Mon May 17 14:00:46 2010 (r208191) @@ -60,6 +60,7 @@ typedef int mips_prid_t; /* 0x09 unannounced */ /* 0x0a unannounced */ #define MIPS_PRID_CID_LEXRA 0x0b /* Lexra */ +#define MIPS_PRID_CID_RMI 0x0c /* RMI */ #define MIPS_PRID_CID_CAVIUM 0x0d /* Cavium */ #define MIPS_PRID_COPTS(x) (((x) >> 24) & 0x00ff) /* Company Options */ Modified: projects/ppc64/sys/mips/include/param.h ============================================================================== --- projects/ppc64/sys/mips/include/param.h Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/mips/include/param.h Mon May 17 14:00:46 2010 (r208191) @@ -70,7 +70,7 @@ #define MID_MACHINE 0 /* None but has to be defined */ #ifdef SMP -#define MAXSMPCPU 16 +#define MAXSMPCPU 32 #define MAXCPU MAXSMPCPU #else #define MAXSMPCPU 1 Modified: projects/ppc64/sys/mips/include/smp.h ============================================================================== --- projects/ppc64/sys/mips/include/smp.h Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/mips/include/smp.h Mon May 17 14:00:46 2010 (r208191) @@ -26,6 +26,7 @@ #define IPI_AST 0x0004 #define IPI_STOP 0x0008 #define IPI_STOP_HARD 0x0008 +#define IPI_PREEMPT 0x0010 #ifndef LOCORE Modified: projects/ppc64/sys/mips/mips/cpu.c ============================================================================== --- projects/ppc64/sys/mips/mips/cpu.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/mips/mips/cpu.c Mon May 17 14:00:46 2010 (r208191) @@ -178,6 +178,9 @@ cpu_identify(void) case MIPS_PRID_CID_LEXRA: printf("Lexra"); break; + case MIPS_PRID_CID_RMI: + printf("RMI"); + break; case MIPS_PRID_CID_CAVIUM: printf("Cavium"); break; Modified: projects/ppc64/sys/mips/mips/machdep.c ============================================================================== --- projects/ppc64/sys/mips/mips/machdep.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/mips/mips/machdep.c Mon May 17 14:00:46 2010 (r208191) @@ -346,7 +346,7 @@ mips_vector_init(void) bcopy(MipsTLBMiss, (void *)TLB_MISS_EXC_VEC, MipsTLBMissEnd - MipsTLBMiss); -#ifdef TARGET_OCTEON +#if defined(TARGET_OCTEON) || defined(TARGET_XLR_XLS) /* Fake, but sufficient, for the 32-bit with 64-bit hardware addresses */ bcopy(MipsTLBMiss, (void *)XTLB_MISS_EXC_VEC, MipsTLBMissEnd - MipsTLBMiss); Modified: projects/ppc64/sys/mips/mips/mp_machdep.c ============================================================================== --- projects/ppc64/sys/mips/mips/mp_machdep.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/mips/mips/mp_machdep.c Mon May 17 14:00:46 2010 (r208191) @@ -141,6 +141,10 @@ mips_ipi_handler(void *arg) atomic_clear_int(&stopped_cpus, cpumask); CTR0(KTR_SMP, "IPI_STOP (restart)"); break; + case IPI_PREEMPT: + CTR1(KTR_SMP, "%s: IPI_PREEMPT", __func__); + sched_preempt(curthread); + break; default: panic("Unknown IPI 0x%0x on cpu %d", ipi, curcpu); } @@ -234,7 +238,9 @@ cpu_mp_start(void) void smp_init_secondary(u_int32_t cpuid) { +#ifndef TARGET_XLR_XLS int ipi_int_mask, clock_int_mask; +#endif /* TLB */ Mips_SetWIRED(0); @@ -288,12 +294,16 @@ smp_init_secondary(u_int32_t cpuid) while (smp_started == 0) ; /* nothing */ +#ifndef TARGET_XLR_XLS /* * Unmask the clock and ipi interrupts. */ clock_int_mask = hard_int_mask(5); ipi_int_mask = hard_int_mask(platform_ipi_intrnum()); set_intr_mask(ALL_INT_MASK & ~(ipi_int_mask | clock_int_mask)); +#else + platform_init_ap(cpuid); +#endif /* * Bootstrap the compare register. Modified: projects/ppc64/sys/mips/mips/mpboot.S ============================================================================== --- projects/ppc64/sys/mips/mips/mpboot.S Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/mips/mips/mpboot.S Mon May 17 14:00:46 2010 (r208191) @@ -76,9 +76,10 @@ GLOBAL(mpentry) PTR_LA gp, _C_LABEL(_gp) +#ifndef TARGET_XLR_XLS jal platform_init_ap move a0, s0 - +#endif jal smp_init_secondary move a0, s0 Modified: projects/ppc64/sys/mips/mips/pmap.c ============================================================================== --- projects/ppc64/sys/mips/mips/pmap.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/mips/mips/pmap.c Mon May 17 14:00:46 2010 (r208191) @@ -80,6 +80,7 @@ __FBSDID("$FreeBSD$"); #include <vm/vm.h> #include <vm/vm_param.h> +#include <vm/vm_phys.h> #include <sys/lock.h> #include <sys/mutex.h> #include <vm/vm_kern.h> @@ -109,6 +110,10 @@ __FBSDID("$FreeBSD$"); #define PMAP_SHPGPERPROC 200 #endif +#if defined(TARGET_XLR_XLS) +#define HIGHMEM_SUPPORT +#endif + #if !defined(PMAP_DIAGNOSTIC) #define PMAP_INLINE __inline #else @@ -183,12 +188,18 @@ static int pmap_unuse_pt(pmap_t, vm_offs static int init_pte_prot(vm_offset_t va, vm_page_t m, vm_prot_t prot); static void pmap_TLB_invalidate_kernel(vm_offset_t); static void pmap_TLB_update_kernel(vm_offset_t, pt_entry_t); +static vm_page_t pmap_alloc_pte_page(pmap_t, unsigned int, int, vm_offset_t *); +static void pmap_release_pte_page(vm_page_t); #ifdef SMP static void pmap_invalidate_page_action(void *arg); static void pmap_invalidate_all_action(void *arg); static void pmap_update_page_action(void *arg); +#endif +#ifdef HIGHMEM_SUPPORT +static void * pmap_ptpgzone_allocf(uma_zone_t, int, u_int8_t*, int); +static uma_zone_t ptpgzone; #endif struct local_sysmaps { @@ -530,6 +541,12 @@ pmap_init(void) pv_entry_max = PMAP_SHPGPERPROC * maxproc + cnt.v_page_count; pv_entry_high_water = 9 * (pv_entry_max / 10); uma_zone_set_obj(pvzone, &pvzone_obj, pv_entry_max); + +#ifdef HIGHMEM_SUPPORT + ptpgzone = uma_zcreate("PT ENTRY", PAGE_SIZE, NULL, + NULL, NULL, NULL, PAGE_SIZE-1, UMA_ZONE_NOFREE); + uma_zone_set_allocf(ptpgzone, pmap_ptpgzone_allocf); +#endif } /*************************************************** @@ -887,7 +904,7 @@ _pmap_unwire_pte_hold(pmap_t pmap, vm_pa /* * If the page is finally unwired, simply free it. */ - vm_page_free_zero(m); + pmap_release_pte_page(m); atomic_subtract_int(&cnt.v_wire_count, 1); return (1); } @@ -947,6 +964,118 @@ pmap_pinit0(pmap_t pmap) bzero(&pmap->pm_stats, sizeof pmap->pm_stats); } +#ifdef HIGHMEM_SUPPORT +static void * +pmap_ptpgzone_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) +{ + vm_page_t m; + vm_paddr_t paddr; + + *flags = UMA_SLAB_PRIV; + m = vm_phys_alloc_contig(1, 0, MIPS_KSEG0_LARGEST_PHYS, + PAGE_SIZE, PAGE_SIZE); + if (m == NULL) + return (NULL); + + paddr = VM_PAGE_TO_PHYS(m); + return ((void *)MIPS_PHYS_TO_KSEG0(paddr)); +} + +static vm_page_t +pmap_alloc_pte_page(pmap_t pmap, unsigned int index, int wait, vm_offset_t *vap) +{ + vm_paddr_t paddr; + void *va; + vm_page_t m; + int locked; + + locked = mtx_owned(&pmap->pm_mtx); + if (locked) { + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + PMAP_UNLOCK(pmap); + vm_page_unlock_queues(); + } + va = uma_zalloc(ptpgzone, wait); + if (locked) { + vm_page_lock_queues(); + PMAP_LOCK(pmap); + } + if (va == NULL) + return (NULL); + + paddr = MIPS_KSEG0_TO_PHYS(va); + m = PHYS_TO_VM_PAGE(paddr); + + if ((m->flags & PG_ZERO) == 0) + bzero(va, PAGE_SIZE); + m->pindex = index; + m->valid = VM_PAGE_BITS_ALL; + m->wire_count = 1; + atomic_add_int(&cnt.v_wire_count, 1); + *vap = (vm_offset_t)va; + return (m); +} + +static void +pmap_release_pte_page(vm_page_t m) +{ + void *va; + vm_paddr_t paddr; + + paddr = VM_PAGE_TO_PHYS(m); + va = (void *)MIPS_PHYS_TO_KSEG0(paddr); + uma_zfree(ptpgzone, va); +} +#else +static vm_page_t +pmap_alloc_pte_page(pmap_t pmap, unsigned int index, int wait, vm_offset_t *vap) +{ + vm_offset_t va; + vm_page_t m; + int locked, req; + + locked = mtx_owned(&pmap->pm_mtx); + req = VM_ALLOC_WIRED | VM_ALLOC_NOOBJ; + if (wait & M_WAITOK) + req |= VM_ALLOC_NORMAL; + else + req |= VM_ALLOC_INTERRUPT; + + m = vm_page_alloc(NULL, index, req); + if (m == NULL) { + if (wait & M_WAITOK) { + if (locked) { + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + PMAP_UNLOCK(pmap); + vm_page_unlock_queues(); + } + VM_WAIT; + if (locked) { + vm_page_lock_queues(); + PMAP_LOCK(pmap); + } + } + return NULL; + } + + va = MIPS_PHYS_TO_KSEG0(VM_PAGE_TO_PHYS(m)); + if ((m->flags & PG_ZERO) == 0) + bzero((void *)va, PAGE_SIZE); + else + vm_page_flag_clear(m, PG_ZERO); + + m->valid = VM_PAGE_BITS_ALL; + *vap = (vm_offset_t)va; + return (m); +} + +static void +pmap_release_pte_page(vm_page_t m) +{ + vm_page_free(m); +} +#endif + /* * Initialize a preallocated and zeroed pmap structure, * such as one in a vmspace structure. @@ -955,37 +1084,16 @@ int pmap_pinit(pmap_t pmap) { vm_offset_t ptdva; - vm_paddr_t ptdpa; vm_page_t ptdpg; int i; - int req; PMAP_LOCK_INIT(pmap); - req = VM_ALLOC_NOOBJ | VM_ALLOC_NORMAL | VM_ALLOC_WIRED | - VM_ALLOC_ZERO; - /* * allocate the page directory page */ - while ((ptdpg = vm_page_alloc(NULL, NUSERPGTBLS, req)) == NULL) - VM_WAIT; - - ptdpg->valid = VM_PAGE_BITS_ALL; - - ptdpa = VM_PAGE_TO_PHYS(ptdpg); - if (ptdpa < MIPS_KSEG0_LARGEST_PHYS) { - ptdva = MIPS_PHYS_TO_KSEG0(ptdpa); - } else { - ptdva = kmem_alloc_nofault(kernel_map, PAGE_SIZE); - if (ptdva == 0) - panic("pmap_pinit: unable to allocate kva"); - pmap_kenter(ptdva, ptdpa); - } - + ptdpg = pmap_alloc_pte_page(pmap, NUSERPGTBLS, M_WAITOK, &ptdva); pmap->pm_segtab = (pd_entry_t *)ptdva; - if ((ptdpg->flags & PG_ZERO) == 0) - bzero(pmap->pm_segtab, PAGE_SIZE); pmap->pm_active = 0; pmap->pm_ptphint = NULL; @@ -1006,7 +1114,7 @@ pmap_pinit(pmap_t pmap) static vm_page_t _pmap_allocpte(pmap_t pmap, unsigned ptepindex, int flags) { - vm_offset_t pteva, ptepa; + vm_offset_t pteva; vm_page_t m; int req; @@ -1018,25 +1126,9 @@ _pmap_allocpte(pmap_t pmap, unsigned pte /* * Find or fabricate a new pagetable page */ - if ((m = vm_page_alloc(NULL, ptepindex, req)) == NULL) { - if (flags & M_WAITOK) { - PMAP_UNLOCK(pmap); - vm_page_unlock_queues(); - VM_WAIT; - vm_page_lock_queues(); - PMAP_LOCK(pmap); - } - /* - * Indicate the need to retry. While waiting, the page - * table page may have been allocated. - */ + m = pmap_alloc_pte_page(pmap, ptepindex, flags, &pteva); + if (m == NULL) return (NULL); - } - if ((m->flags & PG_ZERO) == 0) - pmap_zero_page(m); - - KASSERT(m->queue == PQ_NONE, - ("_pmap_allocpte: %p->queue != PQ_NONE", m)); /* * Map the pagetable page into the process address space, if it @@ -1044,34 +1136,12 @@ _pmap_allocpte(pmap_t pmap, unsigned pte */ pmap->pm_stats.resident_count++; - - ptepa = VM_PAGE_TO_PHYS(m); - if (ptepa < MIPS_KSEG0_LARGEST_PHYS) { - pteva = MIPS_PHYS_TO_KSEG0(ptepa); - } else { - pteva = kmem_alloc_nofault(kernel_map, PAGE_SIZE); - if (pteva == 0) - panic("_pmap_allocpte: unable to allocate kva"); - pmap_kenter(pteva, ptepa); - } - pmap->pm_segtab[ptepindex] = (pd_entry_t)pteva; /* * Set the page table hint */ pmap->pm_ptphint = m; - - /* - * Kernel page tables are allocated in pmap_bootstrap() or - * pmap_growkernel(). - */ - if (is_kernel_pmap(pmap)) - panic("_pmap_allocpte() called for kernel pmap\n"); - - m->valid = VM_PAGE_BITS_ALL; - vm_page_flag_clear(m, PG_ZERO); - return (m); } @@ -1158,17 +1228,12 @@ pmap_release(pmap_t pmap) ptdva = (vm_offset_t)pmap->pm_segtab; ptdpg = PHYS_TO_VM_PAGE(vtophys(ptdva)); - if (ptdva >= VM_MIN_KERNEL_ADDRESS) { - pmap_kremove(ptdva); - kmem_free(kernel_map, ptdva, PAGE_SIZE); - } else { - KASSERT(MIPS_IS_KSEG0_ADDR(ptdva), - ("pmap_release: 0x%0lx is not in kseg0", (long)ptdva)); - } + KASSERT(MIPS_IS_KSEG0_ADDR(ptdva), + ("pmap_release: 0x%0lx is not in kseg0", (long)ptdva)); ptdpg->wire_count--; atomic_subtract_int(&cnt.v_wire_count, 1); - vm_page_free_zero(ptdpg); + pmap_release_pte_page(ptdpg); PMAP_LOCK_DESTROY(pmap); } @@ -1178,10 +1243,10 @@ pmap_release(pmap_t pmap) void pmap_growkernel(vm_offset_t addr) { - vm_offset_t ptppaddr; + vm_offset_t pageva; vm_page_t nkpg; pt_entry_t *pte; - int i, req; + int i; mtx_assert(&kernel_map->system_mtx, MA_OWNED); if (kernel_vm_end == 0) { @@ -1213,26 +1278,13 @@ pmap_growkernel(vm_offset_t addr) /* * This index is bogus, but out of the way */ - req = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED | VM_ALLOC_NOOBJ; - nkpg = vm_page_alloc(NULL, nkpt, req); + nkpg = pmap_alloc_pte_page(kernel_pmap, nkpt, M_NOWAIT, &pageva); + if (!nkpg) panic("pmap_growkernel: no memory to grow kernel"); nkpt++; - - ptppaddr = VM_PAGE_TO_PHYS(nkpg); - if (ptppaddr >= MIPS_KSEG0_LARGEST_PHYS) { - /* - * We need to do something here, but I am not sure - * what. We can access anything in the 0 - 512Meg - * region, but if we get a page to go in the kernel - * segmap that is outside of of that we really need - * to have another mapping beyond the temporary ones - * I have. Not sure how to do this yet. FIXME FIXME. - */ - panic("Gak, can't handle a k-page table outside of lower 512Meg"); - } - pte = (pt_entry_t *)MIPS_PHYS_TO_KSEG0(ptppaddr); + pte = (pt_entry_t *)pageva; segtab_pde(kernel_segmap, kernel_vm_end) = (pd_entry_t)pte; /* @@ -1396,7 +1448,8 @@ pmap_remove_entry(struct pmap *pmap, vm_ } } - KASSERT(pv != NULL, ("pmap_remove_entry: pv not found")); + KASSERT(pv != NULL, ("pmap_remove_entry: pv not found, pa %lx va %lx", + (u_long)VM_PAGE_TO_PHYS(m), (u_long)va)); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); m->md.pv_list_count--; if (TAILQ_FIRST(&m->md.pv_list) == NULL) @@ -1738,10 +1791,9 @@ pmap_enter(pmap_t pmap, vm_offset_t va, return; va &= ~PAGE_MASK; -#ifdef PMAP_DIAGNOSTIC - if (va > VM_MAX_KERNEL_ADDRESS) - panic("pmap_enter: toobig"); -#endif + KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig")); + KASSERT((m->oflags & VPO_BUSY) != 0, + ("pmap_enter: page %p is not busy", m)); mpte = NULL; @@ -2531,7 +2583,16 @@ pmap_remove_write(vm_page_t m) vm_offset_t va; pt_entry_t *pte; - if ((m->flags & PG_FICTITIOUS) != 0 || + KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + ("pmap_remove_write: page %p is not managed", m)); + + /* + * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PG_WRITEABLE + * is clear, no page table entries need updating. + */ + VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); + if ((m->oflags & VPO_BUSY) == 0 && (m->flags & PG_WRITEABLE) == 0) return; Modified: projects/ppc64/sys/mips/rmi/dev/xlr/rge.c ============================================================================== --- projects/ppc64/sys/mips/rmi/dev/xlr/rge.c Mon May 17 11:18:33 2010 (r208190) +++ projects/ppc64/sys/mips/rmi/dev/xlr/rge.c Mon May 17 14:00:46 2010 (r208191) @@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$"); #define __RMAN_RESOURCE_VISIBLE #include <sys/rman.h> #include <sys/taskqueue.h> +#include <sys/smp.h> #include <net/if.h> #include <net/if_arp.h> @@ -83,6 +84,7 @@ __FBSDID("$FreeBSD$"); #include <machine/param.h> #include <machine/intr_machdep.h> #include <machine/clock.h> /* for DELAY */ +#include <machine/cpuregs.h> #include <machine/bus.h> /* */ #include <machine/resource.h> #include <mips/rmi/interrupt.h> @@ -112,7 +114,6 @@ MODULE_DEPEND(rge, ether, 1, 1, 1); MODULE_DEPEND(rge, miibus, 1, 1, 1); /* #define DEBUG */ -/*#define RX_COPY */ #define RGE_TX_THRESHOLD 1024 #define RGE_TX_Q_SIZE 1024 @@ -204,10 +205,18 @@ ldadd_wu(unsigned int value, unsigned lo return value; } +static __inline__ uint32_t +xlr_enable_kx(void) +{ + uint32_t sr = mips_rd_status(); + + mips_wr_status((sr & ~MIPS_SR_INT_IE) | MIPS_SR_KX); + return sr; +} + /* #define mac_stats_add(x, val) ({(x) += (val);}) */ #define mac_stats_add(x, val) ldadd_wu(val, &x) - #define XLR_MAX_CORE 8 #define RGE_LOCK_INIT(_sc, _name) \ mtx_init(&(_sc)->rge_mtx, _name, MTX_NETWORK_LOCK, MTX_DEF) @@ -332,56 +341,6 @@ DRIVER_MODULE(miibus, rge, miibus_driver #define STR(x) __STR(x) *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005171400.o4HE0kxn043219>