Date: Fri, 7 Sep 2012 22:16:08 +0000 (UTC) From: Matt Jacob <mjacob@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r240215 - in user/mjacob/sys: amd64/amd64 amd64/conf arm/arm arm/include cam/scsi cddl/compat/opensolaris/sys cddl/contrib/opensolaris/uts/common/fs/zfs cddl/contrib/opensolaris/uts/com... Message-ID: <201209072216.q87MG8Q5072816@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mjacob Date: Fri Sep 7 22:16:08 2012 New Revision: 240215 URL: http://svn.freebsd.org/changeset/base/240215 Log: IFC@240214 Added: user/mjacob/sys/dev/random/ivy.c - copied unchanged from r240214, head/sys/dev/random/ivy.c user/mjacob/sys/libkern/jenkins_hash.c - copied unchanged from r240214, head/sys/libkern/jenkins_hash.c user/mjacob/sys/modules/ct/ - copied from r240214, head/sys/modules/ct/ Deleted: user/mjacob/sys/dev/random/nehemiah.h user/mjacob/sys/libkern/jenkins.h user/mjacob/sys/sys/device_port.h Modified: user/mjacob/sys/amd64/amd64/pmap.c user/mjacob/sys/amd64/conf/GENERIC user/mjacob/sys/amd64/conf/NOTES user/mjacob/sys/arm/arm/busdma_machdep.c user/mjacob/sys/arm/arm/pmap.c user/mjacob/sys/arm/include/pmap.h user/mjacob/sys/cam/scsi/scsi_low.c user/mjacob/sys/cam/scsi/scsi_low.h user/mjacob/sys/cam/scsi/scsi_low_pisa.c user/mjacob/sys/cam/scsi/scsi_low_pisa.h user/mjacob/sys/cddl/compat/opensolaris/sys/sid.h user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/bptree.c user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_tx.c user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_synctask.c user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_history.c user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/arc.h user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dnode.h user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_debug.h user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c user/mjacob/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c user/mjacob/sys/conf/NOTES user/mjacob/sys/conf/files user/mjacob/sys/conf/files.amd64 user/mjacob/sys/conf/files.i386 user/mjacob/sys/conf/kern.pre.mk user/mjacob/sys/conf/options.amd64 user/mjacob/sys/conf/options.i386 user/mjacob/sys/dev/arcmsr/arcmsr.c user/mjacob/sys/dev/arcmsr/arcmsr.h user/mjacob/sys/dev/ath/ath_dfs/null/dfs_null.c user/mjacob/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c user/mjacob/sys/dev/ath/ath_hal/ar5212/ar5212_recv.c user/mjacob/sys/dev/ath/if_ath_tx.c user/mjacob/sys/dev/atkbdc/psm.c user/mjacob/sys/dev/bxe/if_bxe.c user/mjacob/sys/dev/ct/bshw_machdep.c user/mjacob/sys/dev/ct/ct.c user/mjacob/sys/dev/ct/ct_isa.c user/mjacob/sys/dev/ct/ctvar.h user/mjacob/sys/dev/gxemul/disk/gxemul_disk.c user/mjacob/sys/dev/hptmv/entry.c user/mjacob/sys/dev/hwpmc/hwpmc_core.c user/mjacob/sys/dev/hwpmc/hwpmc_core.h user/mjacob/sys/dev/hwpmc/hwpmc_intel.c user/mjacob/sys/dev/hwpmc/pmc_events.h user/mjacob/sys/dev/ixgbe/ixgbe_82599.c user/mjacob/sys/dev/ncv/ncr53c500.c user/mjacob/sys/dev/ncv/ncr53c500_pccard.c user/mjacob/sys/dev/ncv/ncr53c500var.h user/mjacob/sys/dev/nsp/nsp.c user/mjacob/sys/dev/nsp/nsp_pccard.c user/mjacob/sys/dev/nsp/nspvar.h user/mjacob/sys/dev/pci/pcireg.h user/mjacob/sys/dev/random/nehemiah.c user/mjacob/sys/dev/random/probe.c user/mjacob/sys/dev/sound/usb/uaudioreg.h user/mjacob/sys/dev/stg/tmc18c30.c user/mjacob/sys/dev/stg/tmc18c30_pccard.c user/mjacob/sys/dev/stg/tmc18c30var.h user/mjacob/sys/dev/twe/twe.c user/mjacob/sys/dev/twe/twe_compat.h user/mjacob/sys/dev/twe/twe_freebsd.c user/mjacob/sys/dev/twe/twevar.h user/mjacob/sys/dev/usb/controller/dwc_otgreg.h user/mjacob/sys/dev/usb/serial/uchcom.c user/mjacob/sys/dev/usb/usbdevs user/mjacob/sys/geom/geom_subr.c user/mjacob/sys/gnu/fs/xfs/FreeBSD/xfs_ioctl.c user/mjacob/sys/gnu/fs/xfs/FreeBSD/xfs_stats.c user/mjacob/sys/gnu/fs/xfs/FreeBSD/xfs_super.c user/mjacob/sys/gnu/fs/xfs/xfs_alloc.c user/mjacob/sys/gnu/fs/xfs/xfs_vfsops.c user/mjacob/sys/i386/conf/GENERIC user/mjacob/sys/i386/conf/NOTES user/mjacob/sys/i386/i386/pmap.c user/mjacob/sys/i386/xen/pmap.c user/mjacob/sys/kern/kern_exit.c user/mjacob/sys/kern/kern_thread.c user/mjacob/sys/kern/subr_hints.c user/mjacob/sys/kern/subr_param.c user/mjacob/sys/kern/sys_procdesc.c user/mjacob/sys/kern/uipc_socket.c user/mjacob/sys/kern/uipc_usrreq.c user/mjacob/sys/mips/conf/BERI_DE4_MDROOT user/mjacob/sys/mips/conf/BERI_SIM_MDROOT user/mjacob/sys/mips/include/pmap.h user/mjacob/sys/mips/include/pte.h user/mjacob/sys/mips/mips/busdma_machdep.c user/mjacob/sys/mips/mips/pmap.c user/mjacob/sys/modules/Makefile user/mjacob/sys/modules/dtrace/dtraceall/Makefile user/mjacob/sys/modules/dtrace/dtraceall/dtraceall.c user/mjacob/sys/modules/random/Makefile user/mjacob/sys/modules/xfs/Makefile user/mjacob/sys/net/flowtable.c user/mjacob/sys/net/if_bridge.c user/mjacob/sys/net/if_ethersubr.c user/mjacob/sys/net/if_var.h user/mjacob/sys/netinet/if_ether.c user/mjacob/sys/netinet/ip_var.h user/mjacob/sys/netinet/ipfw/ip_fw2.c user/mjacob/sys/netinet/ipfw/ip_fw_log.c user/mjacob/sys/netinet/ipfw/ip_fw_pfil.c user/mjacob/sys/netinet/ipfw/ip_fw_private.h user/mjacob/sys/netinet/sctp_asconf.c user/mjacob/sys/netinet/sctp_auth.c user/mjacob/sys/netinet/sctp_cc_functions.c user/mjacob/sys/netinet/sctp_header.h user/mjacob/sys/netinet/sctp_indata.c user/mjacob/sys/netinet/sctp_input.c user/mjacob/sys/netinet/sctp_input.h user/mjacob/sys/netinet/sctp_output.c user/mjacob/sys/netinet/sctp_pcb.c user/mjacob/sys/netinet/sctp_structs.h user/mjacob/sys/netinet/sctp_timer.c user/mjacob/sys/netinet/sctputil.c user/mjacob/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h user/mjacob/sys/rpc/auth.h user/mjacob/sys/rpc/clnt_vc.c user/mjacob/sys/rpc/rpc_com.h user/mjacob/sys/rpc/rpcb_clnt.c user/mjacob/sys/rpc/xdr.h user/mjacob/sys/sparc64/include/vmparam.h user/mjacob/sys/sys/hash.h user/mjacob/sys/sys/pmc.h user/mjacob/sys/sys/time.h user/mjacob/sys/vm/swap_pager.c user/mjacob/sys/vm/vm_map.c user/mjacob/sys/vm/vm_mmap.c Directory Properties: user/mjacob/sys/ (props changed) user/mjacob/sys/cddl/contrib/opensolaris/ (props changed) user/mjacob/sys/conf/ (props changed) Modified: user/mjacob/sys/amd64/amd64/pmap.c ============================================================================== --- user/mjacob/sys/amd64/amd64/pmap.c Fri Sep 7 21:06:54 2012 (r240214) +++ user/mjacob/sys/amd64/amd64/pmap.c Fri Sep 7 22:16:08 2012 (r240215) @@ -323,8 +323,8 @@ static vm_page_t pmap_allocpde(pmap_t pm static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, struct rwlock **lockp); -static int _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m, - vm_page_t* free); +static void _pmap_unwire_ptp(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 *); static vm_offset_t pmap_kmem_choose(vm_offset_t addr); @@ -1557,23 +1557,25 @@ pmap_remove_pt_page(pmap_t pmap, vm_page } /* - * This routine unholds page table pages, and if the hold count - * drops to zero, then it decrements the wire count. + * Decrements a page table page's wire count, which is used to record the + * number of valid page table entries within the page. If the wire count + * drops to zero, then the page table page is unmapped. Returns TRUE if the + * page table page was unmapped and FALSE otherwise. */ -static __inline int -pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t *free) +static inline boolean_t +pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t *free) { --m->wire_count; - if (m->wire_count == 0) - return (_pmap_unwire_pte_hold(pmap, va, m, free)); - else - return (0); + if (m->wire_count == 0) { + _pmap_unwire_ptp(pmap, va, m, free); + return (TRUE); + } else + return (FALSE); } -static int -_pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m, - vm_page_t *free) +static void +_pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t *free) { PMAP_LOCK_ASSERT(pmap, MA_OWNED); @@ -1602,14 +1604,14 @@ _pmap_unwire_pte_hold(pmap_t pmap, vm_of vm_page_t pdpg; pdpg = PHYS_TO_VM_PAGE(*pmap_pdpe(pmap, va) & PG_FRAME); - pmap_unwire_pte_hold(pmap, va, pdpg, free); + pmap_unwire_ptp(pmap, va, pdpg, free); } if (m->pindex >= NUPDE && m->pindex < (NUPDE + NUPDPE)) { /* We just released a PD, unhold the matching PDP */ vm_page_t pdppg; pdppg = PHYS_TO_VM_PAGE(*pmap_pml4e(pmap, va) & PG_FRAME); - pmap_unwire_pte_hold(pmap, va, pdppg, free); + pmap_unwire_ptp(pmap, va, pdppg, free); } /* @@ -1624,8 +1626,6 @@ _pmap_unwire_pte_hold(pmap_t pmap, vm_of * *ALL* TLB shootdown is done */ pmap_add_delayed_free_list(m, free, TRUE); - - return (1); } /* @@ -1641,7 +1641,7 @@ pmap_unuse_pt(pmap_t pmap, vm_offset_t v 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_ptp(pmap, va, mpte, free)); } void @@ -3666,7 +3666,7 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t if (!pmap_pv_insert_pde(pmap, va, VM_PAGE_TO_PHYS(m), lockp)) { free = NULL; - if (pmap_unwire_pte_hold(pmap, va, mpde, &free)) { + if (pmap_unwire_ptp(pmap, va, mpde, &free)) { pmap_invalidate_page(pmap, va); pmap_free_zero_pages(free); } @@ -3842,7 +3842,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_ !pmap_try_insert_pv_entry(pmap, va, m, lockp)) { if (mpte != NULL) { free = NULL; - if (pmap_unwire_pte_hold(pmap, va, mpte, &free)) { + if (pmap_unwire_ptp(pmap, va, mpte, &free)) { pmap_invalidate_page(pmap, va); pmap_free_zero_pages(free); } @@ -4149,8 +4149,8 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pm pmap_resident_count_inc(dst_pmap, 1); } else { free = NULL; - if (pmap_unwire_pte_hold(dst_pmap, - addr, dstmpte, &free)) { + if (pmap_unwire_ptp(dst_pmap, addr, + dstmpte, &free)) { pmap_invalidate_page(dst_pmap, addr); pmap_free_zero_pages(free); Modified: user/mjacob/sys/amd64/conf/GENERIC ============================================================================== --- user/mjacob/sys/amd64/conf/GENERIC Fri Sep 7 21:06:54 2012 (r240214) +++ user/mjacob/sys/amd64/conf/GENERIC Fri Sep 7 22:16:08 2012 (r240215) @@ -148,6 +148,7 @@ device ciss # Compaq Smart RAID 5* device dpt # DPT Smartcache III, IV - See NOTES for options device hptmv # Highpoint RocketRAID 182x device hptrr # Highpoint RocketRAID 17xx, 22xx, 23xx, 25xx +device hpt27xx # Highpoint RocketRAID 27xx device iir # Intel Integrated RAID device ips # IBM (Adaptec) ServeRAID device mly # Mylex AcceleRAID/eXtremeRAID @@ -291,6 +292,8 @@ device wpi # Intel 3945ABG wireless NI # Pseudo devices. device loop # Network loopback device random # Entropy device +options PADLOCK_RNG # VIA Padlock RNG +options IVY_RNG # Intel Bull Mountain RNG device ether # Ethernet support device vlan # 802.1Q VLAN support device tun # Packet tunnel. Modified: user/mjacob/sys/amd64/conf/NOTES ============================================================================== --- user/mjacob/sys/amd64/conf/NOTES Fri Sep 7 21:06:54 2012 (r240214) +++ user/mjacob/sys/amd64/conf/NOTES Fri Sep 7 22:16:08 2012 (r240215) @@ -306,8 +306,6 @@ options DRM_DEBUG # Include debug print # mlx4ib: Mellanox ConnectX HCA InfiniBand # mlxen: Mellanox ConnectX HCA Ethernet # mthca: Mellanox HCA InfiniBand -# mwl: Marvell 88W8363 IEEE 802.11 adapter -# Requires the mwl firmware module # nfe: nVidia nForce MCP on-board Ethernet Networking (BSD open source) # nve: nVidia nForce MCP on-board Ethernet Networking # sfxge: Solarflare SFC9000 family 10Gb Ethernet adapters @@ -324,10 +322,9 @@ device iwn # Intel 4965/1000/5000/6000 device mlx4ib # Mellanox ConnectX HCA InfiniBand device mlxen # Mellanox ConnectX HCA Ethernet device mthca # Mellanox HCA InfiniBand -device mwl # Marvell 88W8363 802.11n wireless NICs. device nfe # nVidia nForce MCP on-board Ethernet device nve # nVidia nForce MCP on-board Ethernet Networking -device sfxge +device sfxge # Solarflare SFC9000 10Gb Ethernet device wpi # Intel 3945ABG wireless NICs. # IEEE 802.11 adapter firmware modules @@ -350,7 +347,6 @@ device wpi # Intel 3945ABG wireless NI # iwn5150fw: Specific module for the 5150 only # iwn6000fw: Specific module for the 6000 only # iwn6050fw: Specific module for the 6050 only -# mwlfw: Marvell 88W8363 firmware # wpifw: Intel 3945ABG Wireless LAN Controller firmware device iwifw @@ -368,7 +364,6 @@ device iwn5000fw device iwn5150fw device iwn6000fw device iwn6050fw -device mwlfw device wpifw # Modified: user/mjacob/sys/arm/arm/busdma_machdep.c ============================================================================== --- user/mjacob/sys/arm/arm/busdma_machdep.c Fri Sep 7 21:06:54 2012 (r240214) +++ user/mjacob/sys/arm/arm/busdma_machdep.c Fri Sep 7 22:16:08 2012 (r240215) @@ -81,6 +81,7 @@ struct bus_dma_tag { int map_count; bus_dma_lock_t *lockfunc; void *lockfuncarg; + bus_dma_segment_t *segments; /* * DMA range for this tag. If the page doesn't fall within * one of these ranges, an error is returned. The caller @@ -374,6 +375,8 @@ bus_dma_tag_create(bus_dma_tag_t parent, newtag->lockfunc = dflt_lock; newtag->lockfuncarg = NULL; } + newtag->segments = NULL; + /* * Take into account any restrictions imposed by our parent tag */ @@ -447,7 +450,6 @@ bus_dma_tag_destroy(bus_dma_tag_t dmat) #endif if (dmat != NULL) { - if (dmat->map_count != 0) return (EBUSY); @@ -457,6 +459,8 @@ bus_dma_tag_destroy(bus_dma_tag_t dmat) parent = dmat->parent; atomic_subtract_int(&dmat->ref_count, 1); if (dmat->ref_count == 0) { + if (dmat->segments != NULL) + free(dmat->segments, M_DEVBUF); free(dmat, M_DEVBUF); /* * Last reference count, so @@ -484,6 +488,17 @@ bus_dmamap_create(bus_dma_tag_t dmat, in bus_dmamap_t newmap; int error = 0; + if (dmat->segments == NULL) { + dmat->segments = (bus_dma_segment_t *)malloc( + sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, + M_NOWAIT); + if (dmat->segments == NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", + __func__, dmat, ENOMEM); + return (ENOMEM); + } + } + newmap = _busdma_alloc_dmamap(); if (newmap == NULL) { CTR3(KTR_BUSDMA, "%s: tag %p error %d", __func__, dmat, ENOMEM); @@ -585,6 +600,16 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, voi mflags = M_NOWAIT; else mflags = M_WAITOK; + if (dmat->segments == NULL) { + dmat->segments = (bus_dma_segment_t *)malloc( + sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, + mflags); + if (dmat->segments == NULL) { + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", + __func__, dmat, dmat->flags, ENOMEM); + return (ENOMEM); + } + } if (flags & BUS_DMA_ZERO) mflags |= M_ZERO; @@ -883,11 +908,6 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_ { vm_offset_t lastaddr = 0; int error, nsegs = -1; -#ifdef __CC_SUPPORTS_DYNAMIC_ARRAY_INIT - bus_dma_segment_t dm_segments[dmat->nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif KASSERT(dmat != NULL, ("dmatag is NULL")); KASSERT(map != NULL, ("dmamap is NULL")); @@ -898,14 +918,14 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_ map->buffer = buf; map->len = buflen; error = bus_dmamap_load_buffer(dmat, - dm_segments, map, buf, buflen, kernel_pmap, + dmat->segments, map, buf, buflen, kernel_pmap, flags, &lastaddr, &nsegs); if (error == EINPROGRESS) return (error); if (error) (*callback)(callback_arg, NULL, 0, error); else - (*callback)(callback_arg, dm_segments, nsegs + 1, error); + (*callback)(callback_arg, dmat->segments, nsegs + 1, error); CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", __func__, dmat, dmat->flags, nsegs + 1, error); @@ -921,11 +941,6 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_callback2_t *callback, void *callback_arg, int flags) { -#ifdef __CC_SUPPORTS_DYNAMIC_ARRAY_INIT - bus_dma_segment_t dm_segments[dmat->nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif int nsegs = -1, error = 0; M_ASSERTPKTHDR(m0); @@ -941,7 +956,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { error = bus_dmamap_load_buffer(dmat, - dm_segments, map, m->m_data, m->m_len, + dmat->segments, map, m->m_data, m->m_len, pmap_kernel(), flags, &lastaddr, &nsegs); map->len += m->m_len; } @@ -954,9 +969,9 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, /* * force "no valid mappings" on error in callback. */ - (*callback)(callback_arg, dm_segments, 0, 0, error); + (*callback)(callback_arg, dmat->segments, 0, 0, error); } else { - (*callback)(callback_arg, dm_segments, nsegs + 1, + (*callback)(callback_arg, dmat->segments, nsegs + 1, m0->m_pkthdr.len, error); } CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", @@ -1012,11 +1027,6 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, int flags) { vm_offset_t lastaddr = 0; -#ifdef __CC_SUPPORTS_DYNAMIC_ARRAY_INIT - bus_dma_segment_t dm_segments[dmat->nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif int nsegs, i, error; bus_size_t resid; struct iovec *iov; @@ -1048,8 +1058,8 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, caddr_t addr = (caddr_t) iov[i].iov_base; if (minlen > 0) { - error = bus_dmamap_load_buffer(dmat, dm_segments, map, - addr, minlen, pmap, flags, &lastaddr, &nsegs); + error = bus_dmamap_load_buffer(dmat, dmat->segments, + map, addr, minlen, pmap, flags, &lastaddr, &nsegs); map->len += minlen; resid -= minlen; @@ -1060,9 +1070,9 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, /* * force "no valid mappings" on error in callback. */ - (*callback)(callback_arg, dm_segments, 0, 0, error); + (*callback)(callback_arg, dmat->segments, 0, 0, error); } else { - (*callback)(callback_arg, dm_segments, nsegs+1, + (*callback)(callback_arg, dmat->segments, nsegs+1, uio->uio_resid, error); } Modified: user/mjacob/sys/arm/arm/pmap.c ============================================================================== --- user/mjacob/sys/arm/arm/pmap.c Fri Sep 7 21:06:54 2012 (r240214) +++ user/mjacob/sys/arm/arm/pmap.c Fri Sep 7 22:16:08 2012 (r240215) @@ -1584,13 +1584,13 @@ pmap_clearbit(struct vm_page *pg, u_int * pmap_remove_pv: remove a mappiing from a vm_page list * * NOTE: pmap_enter_pv expects to lock the pvh itself - * pmap_remove_pv expects te caller to lock the pvh before calling + * pmap_remove_pv expects the caller to lock the pvh before calling */ /* * pmap_enter_pv: enter a mapping onto a vm_page lst * - * => caller should hold the proper lock on pmap_main_lock + * => caller should hold the proper lock on pvh_global_lock * => caller should have pmap locked * => we will gain the lock on the vm_page and allocate the new pv_entry * => caller should adjust ptp's wire_count before calling @@ -1600,12 +1600,11 @@ static void pmap_enter_pv(struct vm_page *pg, struct pv_entry *pve, pmap_t pm, vm_offset_t va, u_int flags) { - int km; rw_assert(&pvh_global_lock, RA_WLOCKED); - if (pg->md.pv_kva) { + if (pg->md.pv_kva != 0) { /* PMAP_ASSERT_LOCKED(pmap_kernel()); */ pve->pv_pmap = pmap_kernel(); pve->pv_va = pg->md.pv_kva; @@ -1617,10 +1616,8 @@ pmap_enter_pv(struct vm_page *pg, struct TAILQ_INSERT_HEAD(&pg->md.pv_list, pve, pv_list); TAILQ_INSERT_HEAD(&pve->pv_pmap->pm_pvlist, pve, pv_plist); PMAP_UNLOCK(pmap_kernel()); - rw_wunlock(&pvh_global_lock); if ((pve = pmap_get_pv_entry()) == NULL) - panic("pmap_kenter_internal: no pv entries"); - rw_wlock(&pvh_global_lock); + panic("pmap_kenter_pv: no pv entries"); if (km) PMAP_LOCK(pmap_kernel()); } @@ -2824,22 +2821,20 @@ pmap_kenter_internal(vm_offset_t va, vm_ *pte |= L2_S_PROT_U; PTE_SYNC(pte); - /* kernel direct mappings can be shared, so use a pv_entry - * to ensure proper caching. - * - * The pvzone is used to delay the recording of kernel - * mappings until the VM is running. - * - * This expects the physical memory to have vm_page_array entry. - */ - if (pvzone != NULL && (m = vm_phys_paddr_to_vm_page(pa))) { + /* + * A kernel mapping may not be the page's only mapping, so create a PV + * entry to ensure proper caching. + * + * The existence test for the pvzone is used to delay the recording of + * kernel mappings until the VM system is fully initialized. + * + * This expects the physical memory to have a vm_page_array entry. + */ + if (pvzone != NULL && (m = vm_phys_paddr_to_vm_page(pa)) != NULL) { rw_wlock(&pvh_global_lock); - if (!TAILQ_EMPTY(&m->md.pv_list) || m->md.pv_kva) { - /* release vm_page lock for pv_entry UMA */ - rw_wunlock(&pvh_global_lock); + if (!TAILQ_EMPTY(&m->md.pv_list) || m->md.pv_kva != 0) { if ((pve = pmap_get_pv_entry()) == NULL) panic("pmap_kenter_internal: no pv entries"); - rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap_kernel()); pmap_enter_pv(m, pve, pmap_kernel(), va, PVF_WRITE | PVF_UNMAN); Modified: user/mjacob/sys/arm/include/pmap.h ============================================================================== --- user/mjacob/sys/arm/include/pmap.h Fri Sep 7 21:06:54 2012 (r240214) +++ user/mjacob/sys/arm/include/pmap.h Fri Sep 7 22:16:08 2012 (r240215) @@ -124,13 +124,6 @@ struct md_page { TAILQ_HEAD(,pv_entry) pv_list; }; -#define VM_MDPAGE_INIT(pg) \ -do { \ - TAILQ_INIT(&pg->pv_list); \ - mtx_init(&(pg)->md_page.pvh_mtx, "MDPAGE Mutex", NULL, MTX_DEV);\ - (pg)->mdpage.pvh_attrs = 0; \ -} while (/*CONSTCOND*/0) - struct l1_ttable; struct l2_dtable; Modified: user/mjacob/sys/cam/scsi/scsi_low.c ============================================================================== --- user/mjacob/sys/cam/scsi/scsi_low.c Fri Sep 7 21:06:54 2012 (r240214) +++ user/mjacob/sys/cam/scsi/scsi_low.c Fri Sep 7 22:16:08 2012 (r240215) @@ -14,13 +14,7 @@ __FBSDID("$FreeBSD$"); /* #define SCSI_LOW_QCLEAR_AFTER_CA */ /* #define SCSI_LOW_FLAGS_QUIRKS_OK */ -#ifdef __NetBSD__ -#define SCSI_LOW_TARGET_OPEN -#endif /* __NetBSD__ */ - -#ifdef __FreeBSD__ #define SCSI_LOW_FLAGS_QUIRKS_OK -#endif /* __FreeBSD__ */ /*- * [NetBSD for NEC PC-98 series] @@ -71,41 +65,12 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> - -#ifdef __FreeBSD__ -#if __FreeBSD_version >= 500001 #include <sys/bio.h> -#else -#include <machine/clock.h> -#endif -#endif /* __FreeBSD__ */ - #include <sys/buf.h> #include <sys/queue.h> #include <sys/malloc.h> #include <sys/errno.h> -#ifdef __NetBSD__ -#include <sys/device.h> -#include <vm/vm.h> - -#include <machine/bus.h> -#include <machine/intr.h> -#include <machine/dvcfg.h> - -#include <dev/cons.h> - -#include <dev/scsipi/scsipi_all.h> -#include <dev/scsipi/scsipiconf.h> -#include <dev/scsipi/scsipi_disk.h> -#include <dev/scsipi/scsi_all.h> -#include <dev/scsipi/scsiconf.h> -#include <sys/scsiio.h> - -#include <i386/Cbus/dev/scsi_low.h> -#endif /* __NetBSD__ */ - -#ifdef __FreeBSD__ #include <cam/cam.h> #include <cam/cam_ccb.h> #include <cam/cam_sim.h> @@ -119,7 +84,6 @@ __FBSDID("$FreeBSD$"); #include <cam/scsi/scsi_low.h> #include <sys/cons.h> -#endif /* __FreeBSD__ */ /************************************************************** * Constants @@ -392,501 +356,6 @@ scsi_low_translate_error_code(cb, tp) return tp->error_code; } -#ifdef SCSI_LOW_INTERFACE_XS -/************************************************************** - * SCSI INTERFACE (XS) - **************************************************************/ -#define SCSI_LOW_MINPHYS 0x10000 -#define SCSI_LOW_MALLOC(size) malloc((size), M_SCSILOW, M_NOWAIT) -#define SCSI_LOW_FREE(pt) free((pt), M_SCSILOW) -#define SCSI_LOW_ALLOC_CCB(flags) scsi_low_get_ccb((flags)) -#define SCSI_LOW_XS_POLL_HZ 1000 - -static int scsi_low_poll_xs(struct scsi_low_softc *, struct slccb *); -static void scsi_low_scsi_minphys_xs(struct buf *); -#ifdef SCSI_LOW_TARGET_OPEN -static int scsi_low_target_open(struct scsipi_link *, struct cfdata *); -#endif /* SCSI_LOW_TARGET_OPEN */ -static int scsi_low_scsi_cmd_xs(struct scsipi_xfer *); -static int scsi_low_enable_xs(void *, int); -static int scsi_low_ioctl_xs(struct scsipi_link *, u_long, caddr_t, int, struct proc *); - -static int scsi_low_attach_xs(struct scsi_low_softc *); -static int scsi_low_world_start_xs(struct scsi_low_softc *); -static int scsi_low_dettach_xs(struct scsi_low_softc *); -static int scsi_low_ccb_setup_xs(struct scsi_low_softc *, struct slccb *); -static int scsi_low_done_xs(struct scsi_low_softc *, struct slccb *); -static void scsi_low_timeout_xs(struct scsi_low_softc *, int, int); -static u_int scsi_low_translate_quirks_xs(u_int); -static void scsi_low_setup_quirks_xs(struct targ_info *, struct lun_info *, u_int); - -struct scsi_low_osdep_funcs scsi_low_osdep_funcs_xs = { - scsi_low_attach_xs, - scsi_low_world_start_xs, - scsi_low_dettach_xs, - scsi_low_ccb_setup_xs, - scsi_low_done_xs, - scsi_low_timeout_xs -}; - -struct scsipi_device scsi_low_dev = { - NULL, /* Use default error handler */ - NULL, /* have a queue, served by this */ - NULL, /* have no async handler */ - NULL, /* Use default 'done' routine */ -}; - -struct scsi_low_error_code scsi_low_error_code_xs[] = { - {0, XS_NOERROR}, - {SENSEIO, XS_SENSE}, - {BUSYERR, XS_BUSY }, - {SELTIMEOUTIO, XS_SELTIMEOUT}, - {TIMEOUTIO, XS_TIMEOUT}, - {-1, XS_DRIVER_STUFFUP} -}; - -static int -scsi_low_ioctl_xs(link, cmd, addr, flag, p) - struct scsipi_link *link; - u_long cmd; - caddr_t addr; - int flag; - struct proc *p; -{ - struct scsi_low_softc *slp; - int s, error = ENOTTY; - - slp = (struct scsi_low_softc *) link->adapter_softc; - if ((slp->sl_flags & HW_INACTIVE) != 0) - return ENXIO; - - if (cmd == SCBUSIORESET) - { - s = SCSI_LOW_SPLSCSI(); - scsi_low_restart(slp, SCSI_LOW_RESTART_HARD, NULL); - splx(s); - error = 0; - } - else if (slp->sl_funcs->scsi_low_ioctl != 0) - { - error = (*slp->sl_funcs->scsi_low_ioctl) - (slp, cmd, addr, flag, p); - } - - return error; -} - -static int -scsi_low_enable_xs(arg, enable) - void *arg; - int enable; -{ - struct scsi_low_softc *slp = arg; - - if (enable != 0) - { - if ((slp->sl_flags & HW_INACTIVE) != 0) - return ENXIO; - } - else - { - if ((slp->sl_flags & HW_INACTIVE) != 0 || - (slp->sl_flags & HW_POWERCTRL) == 0) - return 0; - - slp->sl_flags |= HW_POWDOWN; - if (slp->sl_funcs->scsi_low_power != NULL) - { - (*slp->sl_funcs->scsi_low_power) - (slp, SCSI_LOW_POWDOWN); - } - } - return 0; -} - -static void -scsi_low_scsi_minphys_xs(bp) - struct buf *bp; -{ - - if (bp->b_bcount > SCSI_LOW_MINPHYS) - bp->b_bcount = SCSI_LOW_MINPHYS; - minphys(bp); -} - -static int -scsi_low_poll_xs(slp, cb) - struct scsi_low_softc *slp; - struct slccb *cb; -{ - struct scsipi_xfer *xs = cb->osdep; - int tcount; - - cb->ccb_flags |= CCB_NOSDONE; - tcount = 0; - - while (slp->sl_nio > 0) - { - SCSI_LOW_DELAY((1000 * 1000) / SCSI_LOW_XS_POLL_HZ); - - (*slp->sl_funcs->scsi_low_poll) (slp); - - if ((slp->sl_flags & (HW_INACTIVE | HW_INITIALIZING)) != 0) - { - cb->ccb_flags |= CCB_NORETRY; - cb->ccb_error |= FATALIO; - (void) scsi_low_revoke_ccb(slp, cb, 1); - printf("%s: hardware inactive in poll mode\n", - slp->sl_xname); - } - - if ((xs->flags & ITSDONE) != 0) - break; - - if (tcount ++ < SCSI_LOW_XS_POLL_HZ / SCSI_LOW_TIMEOUT_HZ) - continue; - - tcount = 0; - scsi_low_timeout_check(slp); - } - - xs->flags |= ITSDONE; - scsipi_done(xs); - return COMPLETE; -} - -static int -scsi_low_scsi_cmd_xs(xs) - struct scsipi_xfer *xs; -{ - struct scsipi_link *splp = xs->sc_link; - struct scsi_low_softc *slp = splp->adapter_softc; - struct targ_info *ti; - struct lun_info *li; - struct slccb *cb; - int s, targ, lun, flags, rv; - - if ((cb = SCSI_LOW_ALLOC_CCB(xs->flags & SCSI_NOSLEEP)) == NULL) - return TRY_AGAIN_LATER; - - targ = splp->scsipi_scsi.target, - lun = splp->scsipi_scsi.lun; - ti = slp->sl_ti[targ]; - - cb->osdep = xs; - cb->bp = xs->bp; - - if ((xs->flags & SCSI_POLL) == 0) - flags = CCB_AUTOSENSE; - else - flags = CCB_AUTOSENSE | CCB_POLLED; - - - s = SCSI_LOW_SPLSCSI(); - li = scsi_low_alloc_li(ti, lun, 1); - if ((u_int) splp->quirks != li->li_sloi.sloi_quirks) - { - scsi_low_setup_quirks_xs(ti, li, (u_int) splp->quirks); - } - - if ((xs->flags & SCSI_RESET) != 0) - { - flags |= CCB_NORETRY | CCB_URGENT; - scsi_low_enqueue(slp, ti, li, cb, flags, SCSI_LOW_MSG_RESET); - } - else - { - if (ti->ti_setup_msg != 0) - { - scsi_low_message_enqueue(slp, ti, li, flags); - } - - flags |= CCB_SCSIIO; - scsi_low_enqueue(slp, ti, li, cb, flags, 0); - } - -#ifdef SCSI_LOW_DEBUG - if (SCSI_LOW_DEBUG_TEST_GO(SCSI_LOW_ABORT_CHECK, ti->ti_id) != 0) - { - scsi_low_test_abort(slp, ti, li); - } -#endif /* SCSI_LOW_DEBUG */ - - if ((cb->ccb_flags & CCB_POLLED) != 0) - { - rv = scsi_low_poll_xs(slp, cb); - } - else - { - rv = SUCCESSFULLY_QUEUED; - } - splx(s); - return rv; -} - -static int -scsi_low_attach_xs(slp) - struct scsi_low_softc *slp; -{ - struct scsipi_adapter *sap; - struct scsipi_link *splp; - - strncpy(slp->sl_xname, slp->sl_dev.dv_xname, 16); - - sap = SCSI_LOW_MALLOC(sizeof(*sap)); - if (sap == NULL) - return ENOMEM; - splp = SCSI_LOW_MALLOC(sizeof(*splp)); - if (splp == NULL) - { - SCSI_LOW_FREE(sap); - return ENOMEM; - } - - SCSI_LOW_BZERO(sap, sizeof(*sap)); - SCSI_LOW_BZERO(splp, sizeof(*splp)); - - sap->scsipi_cmd = scsi_low_scsi_cmd_xs; - sap->scsipi_minphys = scsi_low_scsi_minphys_xs; - sap->scsipi_enable = scsi_low_enable_xs; - sap->scsipi_ioctl = scsi_low_ioctl_xs; -#ifdef SCSI_LOW_TARGET_OPEN - sap->open_target_lu = scsi_low_target_open; -#endif /* SCSI_LOW_TARGET_OPEN */ - - splp->adapter_softc = slp; - splp->scsipi_scsi.adapter_target = slp->sl_hostid; - splp->scsipi_scsi.max_target = slp->sl_ntargs - 1; - splp->scsipi_scsi.max_lun = slp->sl_nluns - 1; - splp->scsipi_scsi.channel = SCSI_CHANNEL_ONLY_ONE; - splp->openings = slp->sl_openings; - splp->type = BUS_SCSI; - splp->adapter_softc = slp; - splp->adapter = sap; - splp->device = &scsi_low_dev; - - slp->sl_si.si_splp = splp; - slp->sl_show_result = SHOW_ALL_NEG; - return 0; -} - -static int -scsi_low_world_start_xs(slp) - struct scsi_low_softc *slp; -{ - - return 0; -} - -static int -scsi_low_dettach_xs(slp) - struct scsi_low_softc *slp; -{ - - /* - * scsipi does not have dettach bus fucntion. - * - scsipi_dettach_scsibus(slp->sl_si.si_splp); - */ - return 0; -} - -static int -scsi_low_ccb_setup_xs(slp, cb) - struct scsi_low_softc *slp; - struct slccb *cb; -{ - struct scsipi_xfer *xs = (struct scsipi_xfer *) cb->osdep; - - if ((cb->ccb_flags & CCB_SCSIIO) != 0) - { - cb->ccb_scp.scp_cmd = (u_int8_t *) xs->cmd; - cb->ccb_scp.scp_cmdlen = xs->cmdlen; - cb->ccb_scp.scp_data = xs->data; - cb->ccb_scp.scp_datalen = xs->datalen; - cb->ccb_scp.scp_direction = (xs->flags & SCSI_DATA_OUT) ? - SCSI_LOW_WRITE : SCSI_LOW_READ; - cb->ccb_tcmax = xs->timeout / 1000; - } - else - { - scsi_low_unit_ready_cmd(cb); - } - return SCSI_LOW_START_QTAG; -} - -static int -scsi_low_done_xs(slp, cb) - struct scsi_low_softc *slp; - struct slccb *cb; -{ - struct scsipi_xfer *xs; - - xs = (struct scsipi_xfer *) cb->osdep; - if (cb->ccb_error == 0) - { - xs->error = XS_NOERROR; - xs->resid = 0; - } - else - { - if (cb->ccb_rcnt >= slp->sl_max_retry) - cb->ccb_error |= ABORTIO; - - if ((cb->ccb_flags & CCB_NORETRY) == 0 && - (cb->ccb_error & ABORTIO) == 0) - return EJUSTRETURN; - - if ((cb->ccb_error & SENSEIO) != 0) - { - xs->sense.scsi_sense = cb->ccb_sense; - } - - xs->error = scsi_low_translate_error_code(cb, - &scsi_low_error_code_xs[0]); - -#ifdef SCSI_LOW_DIAGNOSTIC - if ((cb->ccb_flags & CCB_SILENT) == 0 && - cb->ccb_scp.scp_cmdlen > 0 && - (scsi_low_cmd_flags[cb->ccb_scp.scp_cmd[0]] & - SCSI_LOW_CMD_ABORT_WARNING) != 0) - { - printf("%s: WARNING: scsi_low IO abort\n", - slp->sl_xname); - scsi_low_print(slp, NULL); - } -#endif /* SCSI_LOW_DIAGNOSTIC */ - } - - if (cb->ccb_scp.scp_status == ST_UNKNOWN) - xs->status = 0; /* XXX */ - else - xs->status = cb->ccb_scp.scp_status; - - xs->flags |= ITSDONE; - if ((cb->ccb_flags & CCB_NOSDONE) == 0) - scsipi_done(xs); - - return 0; -} - -static void -scsi_low_timeout_xs(slp, ch, action) - struct scsi_low_softc *slp; - int ch; - int action; -{ - - switch (ch) - { - case SCSI_LOW_TIMEOUT_CH_IO: - switch (action) - { - case SCSI_LOW_TIMEOUT_START: - timeout(scsi_low_timeout, slp, - hz / SCSI_LOW_TIMEOUT_HZ); - break; - case SCSI_LOW_TIMEOUT_STOP: - untimeout(scsi_low_timeout, slp); - break; - } - break; - - case SCSI_LOW_TIMEOUT_CH_ENGAGE: - switch (action) - { - case SCSI_LOW_TIMEOUT_START: - timeout(scsi_low_engage, slp, 1); - break; - case SCSI_LOW_TIMEOUT_STOP: - untimeout(scsi_low_engage, slp); - break; - } - break; - - case SCSI_LOW_TIMEOUT_CH_RECOVER: - break; - } -} - -u_int -scsi_low_translate_quirks_xs(quirks) - u_int quirks; -{ - u_int flags; - - flags = SCSI_LOW_DISK_LFLAGS | SCSI_LOW_DISK_TFLAGS; - -#ifdef SDEV_NODISC - if (quirks & SDEV_NODISC) - flags &= ~SCSI_LOW_DISK_DISC; -#endif /* SDEV_NODISC */ -#ifdef SDEV_NOPARITY - if (quirks & SDEV_NOPARITY) - flags &= ~SCSI_LOW_DISK_PARITY; -#endif /* SDEV_NOPARITY */ -#ifdef SDEV_NOCMDLNK - if (quirks & SDEV_NOCMDLNK) - flags &= ~SCSI_LOW_DISK_LINK; -#endif /* SDEV_NOCMDLNK */ -#ifdef SDEV_NOTAG - if (quirks & SDEV_NOTAG) - flags &= ~SCSI_LOW_DISK_QTAG; -#endif /* SDEV_NOTAG */ -#ifdef SDEV_NOSYNC - if (quirks & SDEV_NOSYNC) - flags &= ~SCSI_LOW_DISK_SYNC; -#endif /* SDEV_NOSYNC */ - - return flags; -} - -static void -scsi_low_setup_quirks_xs(ti, li, flags) - struct targ_info *ti; - struct lun_info *li; - u_int flags; -{ - u_int quirks; - - li->li_sloi.sloi_quirks = flags; - quirks = scsi_low_translate_quirks_xs(flags); - ti->ti_quirks = quirks & SCSI_LOW_DISK_TFLAGS; - li->li_quirks = quirks & SCSI_LOW_DISK_LFLAGS; - ti->ti_flags_valid |= SCSI_LOW_TARG_FLAGS_QUIRKS_VALID; - li->li_flags_valid |= SCSI_LOW_LUN_FLAGS_QUIRKS_VALID; - scsi_low_calcf_target(ti); - scsi_low_calcf_lun(li); - scsi_low_calcf_show(li); -} - -#ifdef SCSI_LOW_TARGET_OPEN -static int -scsi_low_target_open(link, cf) - struct scsipi_link *link; - struct cfdata *cf; -{ - u_int target = link->scsipi_scsi.target; - u_int lun = link->scsipi_scsi.lun; - struct scsi_low_softc *slp; - struct targ_info *ti; - struct lun_info *li; - - slp = (struct scsi_low_softc *) link->adapter_softc; - ti = slp->sl_ti[target]; - li = scsi_low_alloc_li(ti, lun, 0); - if (li == NULL) - return 0; - - li->li_cfgflags = cf->cf_flags; - scsi_low_setup_quirks_xs(ti, li, (u_int) link->quirks); - return 0; -} -#endif /* SCSI_LOW_TARGET_OPEN */ - -#endif /* SCSI_LOW_INTERFACE_XS */ - -#ifdef SCSI_LOW_INTERFACE_CAM /************************************************************** *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201209072216.q87MG8Q5072816>