Date: Sun, 5 Aug 2007 21:11:08 GMT From: Roman Divacky <rdivacky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 124751 for review Message-ID: <200708052111.l75LB8Uh065827@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=124751 Change 124751 by rdivacky@rdivacky_witten on 2007/08/05 21:10:54 IFC Affected files ... .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/conf/NOTES#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/conf/options#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/dev/adlink/adlink.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/dev/dc/if_dc.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/dev/dc/if_dcreg.h#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/dev/re/if_re.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/fs/msdosfs/msdosfs_fat.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/fs/msdosfs/msdosfs_vfsops.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/ia64/ia64/clock.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/ia64/ia64/machdep.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/ia64/ia64/mp_machdep.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/ia64/ia64/pmap.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/ia64/include/ia64_cpu.h#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/kern/kern_switch.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/kern/sched_ule.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/net/bridgestp.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/net/bridgestp.h#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/netinet/ip_input.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/netinet/ip_ipsec.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/netinet/ip_ipsec.h#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/netinet6/ip6_ipsec.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/netinet6/ip6_ipsec.h#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/sparc64/include/iommureg.h#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/sparc64/include/iommuvar.h#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/sparc64/pci/psycho.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/sparc64/pci/psychoreg.h#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/sparc64/sbus/sbus.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/sparc64/sbus/sbusreg.h#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/sparc64/sparc64/iommu.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/vm/device_pager.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/vm/phys_pager.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/vm/swap_pager.c#2 integrate .. //depot/projects/soc2007/rdivacky/linux_fixes/sys/vm/vm_pager.c#2 integrate Differences ... ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/conf/NOTES#2 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/NOTES,v 1.1447 2007/07/24 15:35:01 scottl Exp $ +# $FreeBSD: src/sys/conf/NOTES,v 1.1448 2007/08/05 16:16:15 bz Exp $ # # NOTES -- Lines that can be cut/pasted into kernel and hints configs. # @@ -501,15 +501,15 @@ options IPSEC #IP security (requires device crypto) #options IPSEC_DEBUG #debug for IP security # -# Set IPSEC_FILTERGIF to force packets coming through a gif tunnel -# to be processed by any configured packet filtering (ipfw, ipf). -# The default is that packets coming from a tunnel are _not_ processed; +# Set IPSEC_FILTERTUNNEL to force packets coming through a tunnel +# to be processed by any configured packet filtering twice. +# The default is that packets coming out of a tunnel are _not_ processed; # they are assumed trusted. # # IPSEC history is preserved for such packets, and can be filtered # using ipfw(8)'s 'ipsec' keyword, when this option is enabled. # -#options IPSEC_FILTERGIF #filter ipsec packets from a tunnel +#options IPSEC_FILTERTUNNEL #filter ipsec packets from a tunnel options IPX #IPX/SPX communications protocols ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/conf/options#2 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/options,v 1.603 2007/07/24 15:35:01 scottl Exp $ +# $FreeBSD: src/sys/conf/options,v 1.604 2007/08/05 16:16:15 bz Exp $ # # On the handling of kernel options # @@ -362,7 +362,7 @@ INET6 opt_inet6.h IPSEC opt_ipsec.h IPSEC_DEBUG opt_ipsec.h -IPSEC_FILTERGIF opt_ipsec.h +IPSEC_FILTERTUNNEL opt_ipsec.h IPDIVERT DUMMYNET opt_ipdn.h IPFILTER opt_ipfilter.h ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/dev/adlink/adlink.c#2 (text+ko) ==== @@ -43,7 +43,7 @@ #ifdef _KERNEL #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/adlink/adlink.c,v 1.16 2007/02/23 12:18:29 piso Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/adlink/adlink.c,v 1.17 2007/08/04 17:43:11 kib Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -119,6 +119,7 @@ static struct cdevsw adlink_cdevsw = { .d_version = D_VERSION, + .d_flags = D_NEEDGIANT, .d_ioctl = adlink_ioctl, .d_mmap = adlink_mmap, .d_name = "adlink", ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/dev/dc/if_dc.c#2 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/dc/if_dc.c,v 1.191 2007/02/23 12:18:37 piso Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/dc/if_dc.c,v 1.192 2007/08/05 11:28:19 marius Exp $"); /* * DEC "tulip" clone ethernet driver. Supports the DEC/Intel 21143 @@ -294,7 +294,6 @@ static void dc_apply_fixup(struct dc_softc *, int); static void dc_dma_map_txbuf(void *, bus_dma_segment_t *, int, bus_size_t, int); -static void dc_dma_map_rxbuf(void *, bus_dma_segment_t *, int, bus_size_t, int); #ifdef DC_USEIOSPACE #define DC_RES SYS_RES_IOPORT @@ -2424,29 +2423,6 @@ return (0); } -static void -dc_dma_map_rxbuf(arg, segs, nseg, mapsize, error) - void *arg; - bus_dma_segment_t *segs; - int nseg; - bus_size_t mapsize; - int error; -{ - struct dc_softc *sc; - struct dc_desc *c; - - sc = arg; - c = &sc->dc_ldata->dc_rx_list[sc->dc_cdata.dc_rx_cur]; - if (error) { - sc->dc_cdata.dc_rx_err = error; - return; - } - - KASSERT(nseg == 1, ("wrong number of segments, should be 1")); - sc->dc_cdata.dc_rx_err = 0; - c->dc_data = htole32(segs->ds_addr); -} - /* * Initialize an RX descriptor and attach an MBUF cluster. */ @@ -2455,7 +2431,8 @@ { struct mbuf *m_new; bus_dmamap_t tmp; - int error; + bus_dma_segment_t segs[1]; + int error, nseg; if (alloc) { m_new = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); @@ -2478,17 +2455,14 @@ /* No need to remap the mbuf if we're reusing it. */ if (alloc) { - sc->dc_cdata.dc_rx_cur = i; - error = bus_dmamap_load_mbuf(sc->dc_mtag, sc->dc_sparemap, - m_new, dc_dma_map_rxbuf, sc, 0); + error = bus_dmamap_load_mbuf_sg(sc->dc_mtag, sc->dc_sparemap, + m_new, segs, &nseg, 0); + KASSERT(nseg == 1, ("wrong number of segments, should be 1")); if (error) { m_freem(m_new); return (error); } - if (sc->dc_cdata.dc_rx_err != 0) { - m_freem(m_new); - return (sc->dc_cdata.dc_rx_err); - } + sc->dc_ldata->dc_rx_list[i].dc_data = htole32(segs->ds_addr); bus_dmamap_unload(sc->dc_mtag, sc->dc_cdata.dc_rx_map[i]); tmp = sc->dc_cdata.dc_rx_map[i]; sc->dc_cdata.dc_rx_map[i] = sc->dc_sparemap; @@ -2865,12 +2839,11 @@ sc->dc_cdata.dc_tx_cnt--; DC_INC(idx, DC_TX_LIST_CNT); } + sc->dc_cdata.dc_tx_cons = idx; - if (idx != sc->dc_cdata.dc_tx_cons) { - /* Some buffers have been freed. */ - sc->dc_cdata.dc_tx_cons = idx; + if (DC_TX_LIST_CNT - sc->dc_cdata.dc_tx_cnt > DC_TX_LIST_RSVD) ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - } + if (sc->dc_cdata.dc_tx_cnt == 0) sc->dc_wdog_timer = 0; } @@ -3161,10 +3134,8 @@ int cur, first, frag, i; sc = arg; - if (error) { - sc->dc_cdata.dc_tx_err = error; + if (error) return; - } first = cur = frag = sc->dc_cdata.dc_tx_prod; for (i = 0; i < nseg; i++) { @@ -3217,7 +3188,7 @@ /* * If there's no way we can send any packets, return now. */ - if (DC_TX_LIST_CNT - sc->dc_cdata.dc_tx_cnt < 6) + if (DC_TX_LIST_CNT - sc->dc_cdata.dc_tx_cnt <= DC_TX_LIST_RSVD) return (ENOBUFS); /* @@ -3229,27 +3200,30 @@ for (m = *m_head; m != NULL; m = m->m_next) chainlen++; - if ((chainlen > DC_TX_LIST_CNT / 4) || - ((DC_TX_LIST_CNT - (chainlen + sc->dc_cdata.dc_tx_cnt)) < 6)) { + m = NULL; + if ((sc->dc_flags & DC_TX_COALESCE && ((*m_head)->m_next != NULL || + sc->dc_flags & DC_TX_ALIGN)) || (chainlen > DC_TX_LIST_CNT / 4) || + (DC_TX_LIST_CNT - (chainlen + sc->dc_cdata.dc_tx_cnt) <= + DC_TX_LIST_RSVD)) { m = m_defrag(*m_head, M_DONTWAIT); - if (m == NULL) + if (m == NULL) { + m_freem(*m_head); + *m_head = NULL; return (ENOBUFS); + } *m_head = m; } - - /* - * Start packing the mbufs in this chain into - * the fragment pointers. Stop when we run out - * of fragments or hit the end of the mbuf chain. - */ idx = sc->dc_cdata.dc_tx_prod; sc->dc_cdata.dc_tx_mapping = *m_head; error = bus_dmamap_load_mbuf(sc->dc_mtag, sc->dc_cdata.dc_tx_map[idx], *m_head, dc_dma_map_txbuf, sc, 0); - if (error) - return (error); - if (sc->dc_cdata.dc_tx_err != 0) - return (sc->dc_cdata.dc_tx_err); + if (error != 0 || sc->dc_cdata.dc_tx_err != 0) { + if (m != NULL) { + m_freem(m); + *m_head = NULL; + } + return (error != 0 ? error : sc->dc_cdata.dc_tx_err); + } bus_dmamap_sync(sc->dc_mtag, sc->dc_cdata.dc_tx_map[idx], BUS_DMASYNC_PREWRITE); bus_dmamap_sync(sc->dc_ltag, sc->dc_lmap, @@ -3279,7 +3253,7 @@ dc_start_locked(struct ifnet *ifp) { struct dc_softc *sc; - struct mbuf *m_head = NULL, *m; + struct mbuf *m_head = NULL; unsigned int queued = 0; int idx; @@ -3300,20 +3274,9 @@ if (m_head == NULL) break; - if (sc->dc_flags & DC_TX_COALESCE && - (m_head->m_next != NULL || - sc->dc_flags & DC_TX_ALIGN)) { - m = m_defrag(m_head, M_DONTWAIT); - if (m == NULL) { - IFQ_DRV_PREPEND(&ifp->if_snd, m_head); - ifp->if_drv_flags |= IFF_DRV_OACTIVE; + if (dc_encap(sc, &m_head)) { + if (m_head == NULL) break; - } else { - m_head = m; - } - } - - if (dc_encap(sc, &m_head)) { IFQ_DRV_PREPEND(&ifp->if_snd, m_head); ifp->if_drv_flags |= IFF_DRV_OACTIVE; break; ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/dev/dc/if_dcreg.h#2 (text+ko) ==== @@ -29,7 +29,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/dc/if_dcreg.h,v 1.53 2006/12/06 01:56:38 marius Exp $ + * $FreeBSD: src/sys/dev/dc/if_dcreg.h,v 1.54 2007/08/05 11:28:19 marius Exp $ */ /* @@ -461,6 +461,7 @@ #define DC_RX_LIST_CNT 64 #endif #define DC_TX_LIST_CNT 256 +#define DC_TX_LIST_RSVD 5 #define DC_MIN_FRAMELEN 60 #define DC_RXLEN 1536 @@ -496,8 +497,6 @@ int dc_tx_prod; int dc_tx_cons; int dc_tx_cnt; - int dc_rx_err; - int dc_rx_cur; int dc_rx_prod; }; ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/dev/re/if_re.c#2 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/re/if_re.c,v 1.93 2007/07/27 00:43:12 yongari Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/re/if_re.c,v 1.94 2007/08/05 11:20:33 marius Exp $"); /* * RealTek 8139C+/8169/8169S/8110S/8168/8111/8101E PCI NIC driver @@ -1005,6 +1005,7 @@ } cmdstat = segs[i].ds_len; totlen += segs[i].ds_len; + d->rl_vlanctl = 0; d->rl_bufaddr_lo = htole32(RL_ADDR_LO(segs[i].ds_addr)); d->rl_bufaddr_hi = htole32(RL_ADDR_HI(segs[i].ds_addr)); if (i == 0) ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/fs/msdosfs/msdosfs_fat.c#2 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_fat.c,v 1.42 2007/07/20 16:21:47 bde Exp $ */ +/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_fat.c,v 1.43 2007/08/03 23:13:50 bde Exp $ */ /* $NetBSD: msdosfs_fat.c,v 1.28 1997/11/17 15:36:49 ws Exp $ */ /*- @@ -376,7 +376,7 @@ + ffs(pmp->pm_inusemap[cn / N_INUSEBITS] ^ (u_int)-1) - 1; } - if (bread(pmp->pm_devvp, pmp->pm_fsinfo, pmp->pm_bpcluster, + if (bread(pmp->pm_devvp, pmp->pm_fsinfo, pmp->pm_BytesPerSec, NOCRED, &bpn) != 0) { /* * Ignore the error, but turn off FSInfo update for the future. ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/fs/msdosfs/msdosfs_vfsops.c#2 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vfsops.c,v 1.167 2007/07/23 07:10:17 bde Exp $ */ +/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vfsops.c,v 1.169 2007/08/05 12:58:34 bde Exp $ */ /* $NetBSD: msdosfs_vfsops.c,v 1.51 1997/11/17 15:36:58 ws Exp $ */ /*- @@ -649,12 +649,15 @@ bp = NULL; /* - * Check FSInfo. + * Check the fsinfo sector if we have one. Silently fix up our + * in-core copy of fp->fsinxtfree if it is unknown (0xffffffff) + * or too large. Ignore fp->fsinfree for now, since we need to + * read the entire FAT anyway to fill the inuse map. */ if (pmp->pm_fsinfo) { struct fsinfo *fp; - if ((error = bread(devvp, pmp->pm_fsinfo, pmp->pm_bpcluster, + if ((error = bread(devvp, pmp->pm_fsinfo, pmp->pm_BytesPerSec, NOCRED, &bp)) != 0) goto error_exit; fp = (struct fsinfo *)bp->b_data; @@ -662,7 +665,7 @@ && !bcmp(fp->fsisig2, "rrAa", 4) && !bcmp(fp->fsisig3, "\0\0\125\252", 4)) { pmp->pm_nxtfree = getulong(fp->fsinxtfree); - if (pmp->pm_nxtfree == 0xffffffff) + if (pmp->pm_nxtfree > pmp->pm_maxcluster) pmp->pm_nxtfree = CLUST_FIRST; } else pmp->pm_fsinfo = 0; @@ -671,15 +674,14 @@ } /* - * Check and validate (or perhaps invalidate?) the fsinfo structure? + * Finish initializing pmp->pm_nxtfree (just in case the first few + * sectors aren't properly reserved in the FAT). This completes + * the fixup for fp->fsinxtfree, and fixes up the zero-initialized + * value if there is no fsinfo. We will use pmp->pm_nxtfree + * internally even if there is no fsinfo. */ - if (pmp->pm_fsinfo && pmp->pm_nxtfree > pmp->pm_maxcluster) { - printf( - "Next free cluster in FSInfo (%lu) exceeds maxcluster (%lu)\n", - pmp->pm_nxtfree, pmp->pm_maxcluster); - error = EINVAL; - goto error_exit; - } + if (pmp->pm_nxtfree < CLUST_FIRST) + pmp->pm_nxtfree = CLUST_FIRST; /* * Allocate memory for the bitmap of allocated clusters, and then ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/ia64/ia64/clock.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/ia64/ia64/clock.c,v 1.31 2007/07/23 09:42:31 dwmalone Exp $"); +__FBSDID("$FreeBSD: src/sys/ia64/ia64/clock.c,v 1.32 2007/08/04 19:28:19 marcel Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -72,6 +72,7 @@ PCPU_SET(clock, ia64_get_itc()); ia64_set_itm(PCPU_GET(clock) + ia64_clock_reload); ia64_set_itv(CLOCK_VECTOR); /* highest priority class */ + ia64_srlz_d(); } /* ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/ia64/ia64/machdep.c#2 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/ia64/ia64/machdep.c,v 1.224 2007/07/30 22:12:53 marcel Exp $"); +__FBSDID("$FreeBSD: src/sys/ia64/ia64/machdep.c,v 1.225 2007/08/04 19:33:27 marcel Exp $"); #include "opt_compat.h" #include "opt_ddb.h" @@ -449,13 +449,13 @@ __asm __volatile("mov %0=psr" : "=r"(psr)); __asm __volatile("rsm psr.ic|psr.i"); - __asm __volatile("srlz.i"); - __asm __volatile("mov cr.ifa=%0" :: "r"(vhpt)); - __asm __volatile("mov cr.itir=%0" :: "r"(IA64_ID_PAGE_SHIFT << 2)); + ia64_srlz_i(); + ia64_set_ifa(vhpt); + ia64_set_itir(IA64_ID_PAGE_SHIFT << 2); + ia64_srlz_d(); __asm __volatile("itr.d dtr[%0]=%1" :: "r"(2), "r"(pte)); - __asm __volatile("srlz.d"); /* XXX not needed. */ __asm __volatile("mov psr.l=%0" :: "r" (psr)); - __asm __volatile("srlz.i"); + ia64_srlz_i(); } void @@ -476,15 +476,15 @@ __asm __volatile("mov %0=psr" : "=r"(psr)); __asm __volatile("rsm psr.ic|psr.i"); - __asm __volatile("srlz.i"); - __asm __volatile("mov cr.ifa=%0" :: - "r"(IA64_PHYS_TO_RR7(ia64_pal_base))); - __asm __volatile("mov cr.itir=%0" :: "r"(IA64_ID_PAGE_SHIFT << 2)); + ia64_srlz_i(); + ia64_set_ifa(IA64_PHYS_TO_RR7(ia64_pal_base)); + ia64_set_itir(IA64_ID_PAGE_SHIFT << 2); + ia64_srlz_d(); __asm __volatile("itr.d dtr[%0]=%1" :: "r"(1), "r"(pte)); - __asm __volatile("srlz.d"); /* XXX not needed. */ + ia64_srlz_d(); __asm __volatile("itr.i itr[%0]=%1" :: "r"(1), "r"(pte)); __asm __volatile("mov psr.l=%0" :: "r" (psr)); - __asm __volatile("srlz.i"); + ia64_srlz_i(); } void @@ -502,14 +502,15 @@ __asm __volatile("mov %0=psr" : "=r"(psr)); __asm __volatile("rsm psr.ic|psr.i"); - __asm __volatile("srlz.i"); - __asm __volatile("mov cr.ifa=%0" :: "r"(VM_MAX_ADDRESS)); - __asm __volatile("mov cr.itir=%0" :: "r"(PAGE_SHIFT << 2)); + ia64_srlz_i(); + ia64_set_ifa(VM_MAX_ADDRESS); + ia64_set_itir(PAGE_SHIFT << 2); + ia64_srlz_d(); __asm __volatile("itr.d dtr[%0]=%1" :: "r"(3), "r"(pte)); - __asm __volatile("srlz.d"); /* XXX not needed. */ + ia64_srlz_d(); __asm __volatile("itr.i itr[%0]=%1" :: "r"(3), "r"(pte)); __asm __volatile("mov psr.l=%0" :: "r" (psr)); - __asm __volatile("srlz.i"); + ia64_srlz_i(); /* Expose the mapping to userland in ar.k5 */ ia64_set_k5(VM_MAX_ADDRESS); @@ -827,6 +828,7 @@ #endif ia64_set_tpr(0); + ia64_srlz_d(); /* * Save our current context so that we have a known (maybe even ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/ia64/ia64/mp_machdep.c#2 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/ia64/ia64/mp_machdep.c,v 1.65 2007/07/30 22:12:53 marcel Exp $"); +__FBSDID("$FreeBSD: src/sys/ia64/ia64/mp_machdep.c,v 1.66 2007/08/04 19:52:10 marcel Exp $"); #include "opt_kstack_pages.h" @@ -91,8 +91,8 @@ ia64_set_k4((intptr_t)pcpup); map_vhpt(ap_vhpt); - __asm __volatile("mov cr.pta=%0;; srlz.i;;" :: - "r" (ap_vhpt + (1<<8) + (pmap_vhpt_log2size<<2) + 1)); + ia64_set_pta(ap_vhpt + (1 << 8) + (pmap_vhpt_log2size << 2) + 1); + ia64_srlz_i(); ap_awake = 1; ap_delay = 0; @@ -106,8 +106,6 @@ while (ap_spin) DELAY(0); - __asm __volatile("ssm psr.i;; srlz.d;;"); - /* Initialize curthread. */ KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread")); PCPU_SET(curthread, PCPU_GET(idlethread)); @@ -125,11 +123,13 @@ CTR1(KTR_SMP, "SMP: cpu%d launched", PCPU_GET(cpuid)); - ia64_set_tpr(0); - /* kick off the clock on this AP */ pcpu_initclock(); + ia64_set_tpr(0); + ia64_srlz_d(); + enable_intr(); + sched_throw(NULL); /* NOTREACHED */ } ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/ia64/ia64/pmap.c#2 (text+ko) ==== @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/ia64/ia64/pmap.c,v 1.190 2007/07/30 22:12:53 marcel Exp $"); +__FBSDID("$FreeBSD: src/sys/ia64/ia64/pmap.c,v 1.191 2007/08/04 19:36:14 marcel Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -450,8 +450,9 @@ } map_vhpt(pmap_vhpt_base[0]); - __asm __volatile("mov cr.pta=%0;; srlz.i;;" :: - "r" (pmap_vhpt_base[0] + (1<<8) + (pmap_vhpt_log2size<<2) + 1)); + ia64_set_pta(pmap_vhpt_base[0] + (1 << 8) + + (pmap_vhpt_log2size << 2) + 1); + ia64_srlz_i(); virtual_avail = VM_MIN_KERNEL_ADDRESS; virtual_end = VM_MAX_KERNEL_ADDRESS; @@ -480,6 +481,7 @@ */ ia64_set_rr(IA64_RR_BASE(6), (6 << 8) | (IA64_ID_PAGE_SHIFT << 2)); ia64_set_rr(IA64_RR_BASE(7), (7 << 8) | (IA64_ID_PAGE_SHIFT << 2)); + ia64_srlz_d(); /* * Clear out any random TLB entries left over from booting. @@ -2254,7 +2256,7 @@ atomic_set_32(&pm->pm_active, PCPU_GET(cpumask)); } PCPU_SET(current_pmap, pm); - __asm __volatile("srlz.d"); + ia64_srlz_d(); out: critical_exit(); ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/ia64/include/ia64_cpu.h#2 (text+ko) ==== @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/ia64/include/ia64_cpu.h,v 1.21 2007/05/27 19:02:47 marcel Exp $ + * $FreeBSD: src/sys/ia64/include/ia64_cpu.h,v 1.23 2007/08/05 18:19:38 marcel Exp $ */ #ifndef _MACHINE_IA64_CPU_H_ @@ -400,7 +400,7 @@ static __inline void ia64_set_rr(u_int64_t rrbase, u_int64_t v) { - __asm __volatile("mov rr[%0]=%1;; srlz.d;;" + __asm __volatile("mov rr[%0]=%1" :: "r"(rrbase), "r"(v) : "memory"); } @@ -428,6 +428,18 @@ __asm __volatile("rsm psr.dfh;; srlz.d"); } +static __inline void +ia64_srlz_d(void) +{ + __asm __volatile("srlz.d"); +} + +static __inline void +ia64_srlz_i(void) +{ + __asm __volatile("srlz.i;;"); +} + #endif /* !LOCORE */ #endif /* _MACHINE_IA64_CPU_H_ */ ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/kern/kern_switch.c#2 (text+ko) ==== @@ -26,7 +26,7 @@ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/kern/kern_switch.c,v 1.132 2007/07/19 08:58:40 jeff Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/kern_switch.c,v 1.133 2007/08/03 23:35:35 jeff Exp $"); #include "opt_sched.h" @@ -192,7 +192,7 @@ thread_lock(td); td->td_critnest--; SCHED_STAT_INC(switch_owepreempt); - mi_switch(SW_INVOL, NULL); + mi_switch(SW_INVOL|SW_PREEMPT, NULL); thread_unlock(td); } } else ==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/kern/sched_ule.c#2 (text+ko) ==== @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/kern/sched_ule.c,v 1.202 2007/07/19 20:03:15 jeff Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/sched_ule.c,v 1.204 2007/08/04 01:21:28 jeff Exp $"); #include "opt_hwpmc_hooks.h" #include "opt_sched.h" @@ -183,7 +183,7 @@ * locking in sched_pickcpu(); */ struct tdq { - struct mtx tdq_lock; /* Protects all fields below. */ + struct mtx *tdq_lock; /* Pointer to group lock. */ struct runq tdq_realtime; /* real-time run queue. */ struct runq tdq_timeshare; /* timeshare run queue. */ struct runq tdq_idle; /* Queue of IDLE threads. */ @@ -198,7 +198,6 @@ #else int tdq_sysload; /* For loadavg, !ITHD load. */ #endif - char tdq_name[16]; /* lock name. */ } __aligned(64); @@ -212,13 +211,15 @@ * load balancer. */ struct tdq_group { - int tdg_cpus; /* Count of CPUs in this tdq group. */ - cpumask_t tdg_cpumask; /* Mask of cpus in this group. */ - cpumask_t tdg_idlemask; /* Idle cpus in this group. */ - cpumask_t tdg_mask; /* Bit mask for first cpu. */ - int tdg_load; /* Total load of this group. */ + struct mtx tdg_lock; /* Protects all fields below. */ + int tdg_cpus; /* Count of CPUs in this tdq group. */ + cpumask_t tdg_cpumask; /* Mask of cpus in this group. */ + cpumask_t tdg_idlemask; /* Idle cpus in this group. */ + cpumask_t tdg_mask; /* Bit mask for first cpu. */ + int tdg_load; /* Total load of this group. */ int tdg_transferable; /* Transferable load of this group. */ LIST_HEAD(, tdq) tdg_members; /* Linked list of all members. */ + char tdg_name[16]; /* lock name. */ } __aligned(64); #define SCHED_AFFINITY_DEFAULT (max(1, hz / 300)) @@ -249,10 +250,12 @@ #define TDQ_SELF() (&tdq_cpu[PCPU_GET(cpuid)]) #define TDQ_CPU(x) (&tdq_cpu[(x)]) -#define TDQ_ID(x) ((x) - tdq_cpu) +#define TDQ_ID(x) ((int)((x) - tdq_cpu)) #define TDQ_GROUP(x) (&tdq_groups[(x)]) +#define TDG_ID(x) ((int)((x) - tdq_groups)) #else /* !SMP */ static struct tdq tdq_cpu; +static struct mtx tdq_lock; #define TDQ_ID(x) (0) #define TDQ_SELF() (&tdq_cpu) @@ -263,7 +266,7 @@ #define TDQ_LOCK(t) mtx_lock_spin(TDQ_LOCKPTR((t))) #define TDQ_LOCK_FLAGS(t, f) mtx_lock_spin_flags(TDQ_LOCKPTR((t)), (f)) #define TDQ_UNLOCK(t) mtx_unlock_spin(TDQ_LOCKPTR((t))) -#define TDQ_LOCKPTR(t) (&(t)->tdq_lock) +#define TDQ_LOCKPTR(t) ((t)->tdq_lock) static void sched_priority(struct thread *); static void sched_thread_priority(struct thread *, u_char); @@ -296,6 +299,7 @@ static inline struct tdq *sched_setcpu(struct td_sched *, int, int); static inline struct mtx *thread_block_switch(struct thread *); static inline void thread_unblock_switch(struct thread *, struct mtx *); +static struct mtx *sched_switch_migrate(struct tdq *, struct thread *, int); #define THREAD_CAN_MIGRATE(td) ((td)->td_pinned == 0) #endif @@ -343,9 +347,8 @@ tdq = TDQ_CPU(cpu); - printf("tdq:\n"); + printf("tdq %d:\n", TDQ_ID(tdq)); printf("\tlockptr %p\n", TDQ_LOCKPTR(tdq)); - printf("\tlock name %s\n", tdq->tdq_name); printf("\tload: %d\n", tdq->tdq_load); printf("\ttimeshare idx: %d\n", tdq->tdq_idx); printf("\ttimeshare ridx: %d\n", tdq->tdq_ridx); @@ -357,7 +360,9 @@ runq_print(&tdq->tdq_idle); #ifdef SMP printf("\tload transferable: %d\n", tdq->tdq_transferable); - printf("\tlowest priority: %d\n", tdq->tdq_lowpri); + printf("\tlowest priority: %d\n", tdq->tdq_lowpri); + printf("\tgroup: %d\n", TDG_ID(tdq->tdq_group)); + printf("\tLock name: %s\n", tdq->tdq_group->tdg_name); #endif } @@ -389,7 +394,7 @@ * This queue contains only priorities between MIN and MAX * realtime. Use the whole queue to represent these values. */ - if ((flags & SRQ_BORROWING) == 0) { + if ((flags & (SRQ_BORROWING|SRQ_PREEMPTED)) == 0) { pri = (pri - PRI_MIN_TIMESHARE) / TS_RQ_PPQ; pri = (pri + tdq->tdq_idx) % RQ_NQS; /* @@ -454,7 +459,7 @@ THREAD_LOCK_ASSERT(ts->ts_thread, MA_OWNED); class = PRI_BASE(ts->ts_thread->td_pri_class); tdq->tdq_load++; - CTR2(KTR_SCHED, "cpu %jd load: %d", TDQ_ID(tdq), tdq->tdq_load); + CTR2(KTR_SCHED, "cpu %d load: %d", TDQ_ID(tdq), tdq->tdq_load); if (class != PRI_ITHD && (ts->ts_thread->td_proc->p_flag & P_NOLOAD) == 0) #ifdef SMP @@ -484,7 +489,7 @@ tdq->tdq_sysload--; #endif KASSERT(tdq->tdq_load != 0, - ("tdq_load_rem: Removing with 0 load on queue %d", (int)TDQ_ID(tdq))); + ("tdq_load_rem: Removing with 0 load on queue %d", TDQ_ID(tdq))); tdq->tdq_load--; CTR1(KTR_SCHED, "load: %d", tdq->tdq_load); ts->ts_runq = NULL; @@ -916,6 +921,8 @@ tdq = TDQ_CPU(cpu); td = ts->ts_thread; ts->ts_cpu = cpu; + + /* If the lock matches just return the queue. */ if (td->td_lock == TDQ_LOCKPTR(tdq)) return (tdq); #ifdef notyet @@ -936,9 +943,7 @@ */ thread_lock_block(td); TDQ_LOCK(tdq); - /* Return to sched_switch() with the lock still blocked */ - if ((flags & SRQ_OURSELF) == 0) - thread_lock_unblock(td, TDQ_LOCKPTR(tdq)); + thread_lock_unblock(td, TDQ_LOCKPTR(tdq)); return (tdq); } @@ -1129,107 +1134,159 @@ tdq_setup(struct tdq *tdq) { - snprintf(tdq->tdq_name, sizeof(tdq->tdq_name), - "sched lock %d", (int)TDQ_ID(tdq)); - mtx_init(&tdq->tdq_lock, tdq->tdq_name, "sched lock", - MTX_SPIN | MTX_RECURSE); + if (bootverbose) + printf("ULE: setup cpu %d\n", TDQ_ID(tdq)); runq_init(&tdq->tdq_realtime); runq_init(&tdq->tdq_timeshare); runq_init(&tdq->tdq_idle); tdq->tdq_load = 0; } -/* - * Setup the thread queues and initialize the topology based on MD - * information. - */ +#ifdef SMP +static void +tdg_setup(struct tdq_group *tdg) +{ + if (bootverbose) + printf("ULE: setup cpu group %d\n", TDG_ID(tdg)); + snprintf(tdg->tdg_name, sizeof(tdg->tdg_name), + "sched lock %d", (int)TDG_ID(tdg)); + mtx_init(&tdg->tdg_lock, tdg->tdg_name, "sched lock", + MTX_SPIN | MTX_RECURSE); + LIST_INIT(&tdg->tdg_members); + tdg->tdg_load = 0; + tdg->tdg_transferable = 0; + tdg->tdg_cpus = 0; + tdg->tdg_mask = 0; + tdg->tdg_cpumask = 0; + tdg->tdg_idlemask = 0; +} + +static void +tdg_add(struct tdq_group *tdg, struct tdq *tdq) +{ + if (tdg->tdg_mask == 0) + tdg->tdg_mask |= 1 << TDQ_ID(tdq); + tdg->tdg_cpumask |= 1 << TDQ_ID(tdq); + tdg->tdg_cpus++; + tdq->tdq_group = tdg; + tdq->tdq_lock = &tdg->tdg_lock; + LIST_INSERT_HEAD(&tdg->tdg_members, tdq, tdq_siblings); + if (bootverbose) + printf("ULE: adding cpu %d to group %d: cpus %d mask 0x%X\n", + TDQ_ID(tdq), TDG_ID(tdg), tdg->tdg_cpus, tdg->tdg_cpumask); +} + static void -sched_setup(void *dummy) +sched_setup_topology(void) { + struct tdq_group *tdg; + struct cpu_group *cg; + int balance_groups; struct tdq *tdq; -#ifdef SMP - int balance_groups; int i; + int j; + topology = 1; balance_groups = 0; - /* - * Initialize the tdqs. - */ - for (i = 0; i < MAXCPU; i++) { + for (i = 0; i < smp_topology->ct_count; i++) { + cg = &smp_topology->ct_group[i]; + tdg = &tdq_groups[i]; + /* + * Initialize the group. + */ + tdg_setup(tdg); + /* + * Find all of the group members and add them. + */ + for (j = 0; j < MAXCPU; j++) { + if ((cg->cg_mask & (1 << j)) != 0) { + tdq = TDQ_CPU(j); + tdq_setup(tdq); + tdg_add(tdg, tdq); + } + } + if (tdg->tdg_cpus > 1) + balance_groups = 1; + } + tdg_maxid = smp_topology->ct_count - 1; + if (balance_groups) + sched_balance_groups(NULL); +} + +static void +sched_setup_smp(void) +{ + struct tdq_group *tdg; + struct tdq *tdq; + int cpus; + int i; + + for (cpus = 0, i = 0; i < MAXCPU; i++) { + if (CPU_ABSENT(i)) + continue; tdq = &tdq_cpu[i]; - tdq_setup(&tdq_cpu[i]); + tdg = &tdq_groups[i]; + /* + * Setup a tdq group with one member. + */ + tdg_setup(tdg); + tdq_setup(tdq); + tdg_add(tdg, tdq); + cpus++; } - if (smp_topology == NULL) { - struct tdq_group *tdg; - int cpus; + tdg_maxid = cpus - 1; +} + +/* + * Fake a topology with one group containing all CPUs. + */ +static void +sched_fake_topo(void) +{ +#ifdef SCHED_FAKE_TOPOLOGY + static struct cpu_top top; + static struct cpu_group group; + + top.ct_count = 1; + top.ct_group = &group; + group.cg_mask = all_cpus; + group.cg_count = mp_ncpus; + group.cg_children = 0; + smp_topology = ⊤ +#endif +} +#endif - for (cpus = 0, i = 0; i < MAXCPU; i++) { - if (CPU_ABSENT(i)) - continue; - tdq = &tdq_cpu[i]; - tdg = &tdq_groups[cpus]; - /* - * Setup a tdq group with one member. - */ - tdq->tdq_transferable = 0; - tdq->tdq_group = tdg; - tdg->tdg_cpus = 1; - tdg->tdg_idlemask = 0; - tdg->tdg_cpumask = tdg->tdg_mask = 1 << i; - tdg->tdg_load = 0; - tdg->tdg_transferable = 0; - LIST_INIT(&tdg->tdg_members); - LIST_INSERT_HEAD(&tdg->tdg_members, tdq, tdq_siblings); - cpus++; - } - tdg_maxid = cpus - 1; - } else { - struct tdq_group *tdg; - struct cpu_group *cg; >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200708052111.l75LB8Uh065827>