From owner-p4-projects@FreeBSD.ORG Fri Aug 26 17:48:21 2005 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8882C16A421; Fri, 26 Aug 2005 17:48:20 +0000 (GMT) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 5F72416A41F for ; Fri, 26 Aug 2005 17:48:20 +0000 (GMT) (envelope-from jhb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id EE46B43D46 for ; Fri, 26 Aug 2005 17:48:19 +0000 (GMT) (envelope-from jhb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j7QHmJ9F069923 for ; Fri, 26 Aug 2005 17:48:19 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j7QHmJfL069920 for perforce@freebsd.org; Fri, 26 Aug 2005 17:48:19 GMT (envelope-from jhb@freebsd.org) Date: Fri, 26 Aug 2005 17:48:19 GMT Message-Id: <200508261748.j7QHmJfL069920@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Cc: Subject: PERFORCE change 82629 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 26 Aug 2005 17:48:21 -0000 http://perforce.freebsd.org/chv.cgi?CH=82629 Change 82629 by jhb@jhb_slimer on 2005/08/26 17:47:26 IFC @82625. Affected files ... .. //depot/projects/smpng/sys/alpha/include/_limits.h#8 integrate .. //depot/projects/smpng/sys/alpha/include/signal.h#8 integrate .. //depot/projects/smpng/sys/amd64/amd64/exception.S#15 integrate .. //depot/projects/smpng/sys/amd64/amd64/mp_machdep.c#24 integrate .. //depot/projects/smpng/sys/amd64/amd64/pmap.c#44 integrate .. //depot/projects/smpng/sys/amd64/include/_limits.h#6 integrate .. //depot/projects/smpng/sys/amd64/include/signal.h#7 integrate .. //depot/projects/smpng/sys/arm/include/_limits.h#7 integrate .. //depot/projects/smpng/sys/arm/include/signal.h#7 integrate .. //depot/projects/smpng/sys/conf/files#147 integrate .. //depot/projects/smpng/sys/conf/files.i386#86 integrate .. //depot/projects/smpng/sys/conf/newvers.sh#19 integrate .. //depot/projects/smpng/sys/dev/acpica/acpi_thermal.c#34 integrate .. //depot/projects/smpng/sys/dev/ata/ata-all.c#72 integrate .. //depot/projects/smpng/sys/dev/ata/ata-chipset.c#55 integrate .. //depot/projects/smpng/sys/dev/ata/ata-pci.h#33 integrate .. //depot/projects/smpng/sys/dev/hme/if_hme.c#25 integrate .. //depot/projects/smpng/sys/dev/hwpmc/hwpmc_amd.c#5 integrate .. //depot/projects/smpng/sys/dev/hwpmc/hwpmc_mod.c#9 integrate .. //depot/projects/smpng/sys/dev/hwpmc/hwpmc_x86.c#3 integrate .. //depot/projects/smpng/sys/dev/ipw/if_ipw.c#7 integrate .. //depot/projects/smpng/sys/dev/iwi/if_iwi.c#9 integrate .. //depot/projects/smpng/sys/dev/iwi/if_iwireg.h#2 integrate .. //depot/projects/smpng/sys/dev/iwi/if_iwivar.h#3 integrate .. //depot/projects/smpng/sys/dev/pci/pci_user.c#16 integrate .. //depot/projects/smpng/sys/dev/ral/if_ral.c#9 integrate .. //depot/projects/smpng/sys/dev/ral/if_ral_pccard.c#3 integrate .. //depot/projects/smpng/sys/dev/usb/if_ural.c#8 integrate .. //depot/projects/smpng/sys/dev/usb/uhub.c#26 integrate .. //depot/projects/smpng/sys/geom/eli/g_eli.c#3 integrate .. //depot/projects/smpng/sys/geom/eli/g_eli.h#3 integrate .. //depot/projects/smpng/sys/geom/eli/g_eli_ctl.c#2 integrate .. //depot/projects/smpng/sys/geom/label/g_label.c#10 integrate .. //depot/projects/smpng/sys/geom/label/g_label.h#6 integrate .. //depot/projects/smpng/sys/geom/label/g_label_ext2fs.c#2 integrate .. //depot/projects/smpng/sys/geom/label/g_label_iso9660.c#2 integrate .. //depot/projects/smpng/sys/geom/label/g_label_ntfs.c#1 branch .. //depot/projects/smpng/sys/geom/label/g_label_reiserfs.c#2 integrate .. //depot/projects/smpng/sys/geom/stripe/g_stripe.c#13 integrate .. //depot/projects/smpng/sys/geom/stripe/g_stripe.h#6 integrate .. //depot/projects/smpng/sys/geom/vinum/geom_vinum_drive.c#13 integrate .. //depot/projects/smpng/sys/geom/vinum/geom_vinum_volume.c#8 integrate .. //depot/projects/smpng/sys/i386/conf/NOTES#105 integrate .. //depot/projects/smpng/sys/i386/i386/mp_machdep.c#85 integrate .. //depot/projects/smpng/sys/i386/include/_limits.h#7 integrate .. //depot/projects/smpng/sys/i386/include/signal.h#11 integrate .. //depot/projects/smpng/sys/i386/isa/if_el.c#15 delete .. //depot/projects/smpng/sys/i386/isa/if_elreg.h#3 delete .. //depot/projects/smpng/sys/ia64/include/_limits.h#7 integrate .. //depot/projects/smpng/sys/ia64/include/signal.h#10 integrate .. //depot/projects/smpng/sys/kern/kern_conf.c#40 integrate .. //depot/projects/smpng/sys/kern/kern_descrip.c#82 integrate .. //depot/projects/smpng/sys/kern/kern_kse.c#23 integrate .. //depot/projects/smpng/sys/kern/kern_mib.c#28 integrate .. //depot/projects/smpng/sys/kern/sched_ule.c#61 integrate .. //depot/projects/smpng/sys/kern/subr_witness.c#134 integrate .. //depot/projects/smpng/sys/kern/sys_process.c#45 integrate .. //depot/projects/smpng/sys/kern/vfs_subr.c#108 integrate .. //depot/projects/smpng/sys/libkern/iconv.c#10 integrate .. //depot/projects/smpng/sys/modules/Makefile#103 integrate .. //depot/projects/smpng/sys/modules/el/Makefile#2 delete .. //depot/projects/smpng/sys/modules/geom/geom_label/Makefile#3 integrate .. //depot/projects/smpng/sys/modules/geom/geom_vinum/Makefile#2 integrate .. //depot/projects/smpng/sys/net/bpf.c#55 integrate .. //depot/projects/smpng/sys/net/bpf.h#16 integrate .. //depot/projects/smpng/sys/net/bpfdesc.h#13 integrate .. //depot/projects/smpng/sys/net/if_bridge.c#8 integrate .. //depot/projects/smpng/sys/net/if_ethersubr.c#62 integrate .. //depot/projects/smpng/sys/net/rtsock.c#48 integrate .. //depot/projects/smpng/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.c#10 integrate .. //depot/projects/smpng/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.h#6 integrate .. //depot/projects/smpng/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c#14 integrate .. //depot/projects/smpng/sys/netgraph/ng_base.c#38 integrate .. //depot/projects/smpng/sys/netgraph/ng_fec.c#16 integrate .. //depot/projects/smpng/sys/netgraph/ng_ksocket.c#27 integrate .. //depot/projects/smpng/sys/netinet/if_atm.c#10 integrate .. //depot/projects/smpng/sys/netinet/if_ether.c#37 integrate .. //depot/projects/smpng/sys/netinet/in.h#31 integrate .. //depot/projects/smpng/sys/netinet/in_pcb.h#37 integrate .. //depot/projects/smpng/sys/netinet/ip_fastfwd.c#20 integrate .. //depot/projects/smpng/sys/netinet/ip_icmp.c#35 integrate .. //depot/projects/smpng/sys/netinet/ip_output.c#75 integrate .. //depot/projects/smpng/sys/netinet/raw_ip.c#51 integrate .. //depot/projects/smpng/sys/netinet/tcp.h#13 integrate .. //depot/projects/smpng/sys/netinet/tcp_input.c#75 integrate .. //depot/projects/smpng/sys/netinet/tcp_sack.c#14 integrate .. //depot/projects/smpng/sys/netinet/tcp_syncache.c#40 integrate .. //depot/projects/smpng/sys/netinet/tcp_usrreq.c#44 integrate .. //depot/projects/smpng/sys/netinet/udp_usrreq.c#58 integrate .. //depot/projects/smpng/sys/netkey/key.c#32 integrate .. //depot/projects/smpng/sys/pci/if_de.c#28 integrate .. //depot/projects/smpng/sys/pci/if_devar.h#11 integrate .. //depot/projects/smpng/sys/powerpc/include/_limits.h#7 integrate .. //depot/projects/smpng/sys/powerpc/include/signal.h#6 integrate .. //depot/projects/smpng/sys/sparc64/include/_limits.h#6 integrate .. //depot/projects/smpng/sys/sparc64/include/signal.h#10 integrate .. //depot/projects/smpng/sys/sys/malloc.h#23 integrate .. //depot/projects/smpng/sys/sys/param.h#86 integrate .. //depot/projects/smpng/sys/sys/signal.h#16 integrate .. //depot/projects/smpng/sys/sys/systm.h#67 integrate .. //depot/projects/smpng/sys/ufs/ffs/ffs_softdep.c#47 integrate .. //depot/projects/smpng/sys/ufs/ffs/ffs_vfsops.c#74 integrate Differences ... ==== //depot/projects/smpng/sys/alpha/include/_limits.h#8 (text+ko) ==== @@ -28,7 +28,7 @@ * * @(#)limits.h 8.3 (Berkeley) 1/4/94 * From: NetBSD: limits.h,v 1.3 1997/04/06 08:47:31 cgd Exp - * $FreeBSD: src/sys/alpha/include/_limits.h,v 1.16 2005/01/05 20:05:50 imp Exp $ + * $FreeBSD: src/sys/alpha/include/_limits.h,v 1.17 2005/08/20 16:44:40 stefanf Exp $ */ #ifndef _MACHINE__LIMITS_H_ @@ -87,4 +87,10 @@ #define __LONG_BIT 64 #define __WORD_BIT 32 +/* + * Minimum signal stack size. The current signal frame + * for Alpha is 808 bytes large. + */ +#define __MINSIGSTKSZ (1024 * 4) + #endif /* !_MACHINE__LIMITS_H_ */ ==== //depot/projects/smpng/sys/alpha/include/signal.h#8 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/alpha/include/signal.h,v 1.12 2005/01/05 20:05:50 imp Exp $ */ +/* $FreeBSD: src/sys/alpha/include/signal.h,v 1.13 2005/08/20 16:44:40 stefanf Exp $ */ /* From: NetBSD: signal.h,v 1.3 1997/04/06 08:47:43 cgd Exp */ /*- @@ -36,14 +36,6 @@ typedef long sig_atomic_t; -#if __XSI_VISIBLE -/* - * Minimum signal stack size. The current signal frame - * for Alpha is 808 bytes large. - */ -#define MINSIGSTKSZ (1024 * 4) -#endif - /* * Only the kernel should need these old type definitions. */ ==== //depot/projects/smpng/sys/amd64/amd64/exception.S#15 (text+ko) ==== @@ -27,7 +27,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/amd64/amd64/exception.S,v 1.125 2005/06/30 00:26:54 peter Exp $ + * $FreeBSD: src/sys/amd64/amd64/exception.S,v 1.126 2005/08/25 20:33:43 ups Exp $ */ #include "opt_atpic.h" @@ -94,7 +94,7 @@ IDTVEC(div) TRAP(T_DIVIDE) IDTVEC(nmi) - TRAP(T_NMI) + TRAP_NOEN(T_NMI) IDTVEC(ofl) TRAP(T_OFLOW) IDTVEC(bnd) ==== //depot/projects/smpng/sys/amd64/amd64/mp_machdep.c#24 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/mp_machdep.c,v 1.261 2005/07/21 21:46:09 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/mp_machdep.c,v 1.262 2005/08/19 22:10:19 pjd Exp $"); #include "opt_cpu.h" #include "opt_kdb.h" @@ -812,58 +812,6 @@ ia32_pause(); } -/* - * This is about as magic as it gets. fortune(1) has got similar code - * for reversing bits in a word. Who thinks up this stuff?? - * - * Yes, it does appear to be consistently faster than: - * while (i = ffs(m)) { - * m >>= i; - * bits++; - * } - * and - * while (lsb = (m & -m)) { // This is magic too - * m &= ~lsb; // or: m ^= lsb - * bits++; - * } - * Both of these latter forms do some very strange things on gcc-3.1 with - * -mcpu=pentiumpro and/or -march=pentiumpro and/or -O or -O2. - * There is probably an SSE or MMX popcnt instruction. - * - * I wonder if this should be in libkern? - * - * XXX Stop the presses! Another one: - * static __inline u_int32_t - * popcnt1(u_int32_t v) - * { - * v -= ((v >> 1) & 0x55555555); - * v = (v & 0x33333333) + ((v >> 2) & 0x33333333); - * v = (v + (v >> 4)) & 0x0F0F0F0F; - * return (v * 0x01010101) >> 24; - * } - * The downside is that it has a multiply. With a pentium3 with - * -mcpu=pentiumpro and -march=pentiumpro then gcc-3.1 will use - * an imull, and in that case it is faster. In most other cases - * it appears slightly slower. - * - * Another variant (also from fortune): - * #define BITCOUNT(x) (((BX_(x)+(BX_(x)>>4)) & 0x0F0F0F0F) % 255) - * #define BX_(x) ((x) - (((x)>>1)&0x77777777) \ - * - (((x)>>2)&0x33333333) \ - * - (((x)>>3)&0x11111111)) - */ -static __inline u_int32_t -popcnt(u_int32_t m) -{ - - m = (m & 0x55555555) + ((m & 0xaaaaaaaa) >> 1); - m = (m & 0x33333333) + ((m & 0xcccccccc) >> 2); - m = (m & 0x0f0f0f0f) + ((m & 0xf0f0f0f0) >> 4); - m = (m & 0x00ff00ff) + ((m & 0xff00ff00) >> 8); - m = (m & 0x0000ffff) + ((m & 0xffff0000) >> 16); - return m; -} - static void smp_targeted_tlb_shootdown(u_int mask, u_int vector, vm_offset_t addr1, vm_offset_t addr2) { @@ -878,7 +826,7 @@ mask &= ~PCPU_GET(cpumask); if (mask == 0) return; - ncpu = popcnt(mask); + ncpu = bitcount32(mask); if (ncpu > othercpus) { /* XXX this should be a panic offence */ printf("SMP: tlb shootdown to %d other cpus (only have %d)\n", ==== //depot/projects/smpng/sys/amd64/amd64/pmap.c#44 (text+ko) ==== @@ -7,6 +7,8 @@ * All rights reserved. * Copyright (c) 2003 Peter Wemm * All rights reserved. + * Copyright (c) 2005 Alan L. Cox + * All rights reserved. * * This code is derived from software contributed to Berkeley by * the Systems Programming Group of the University of Utah Computer @@ -75,7 +77,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.521 2005/08/14 20:02:49 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.526 2005/08/26 05:18:46 alc Exp $"); /* * Manages physical address maps. @@ -205,11 +207,12 @@ static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva, pd_entry_t ptepde); -static void pmap_remove_page(struct pmap *pmap, vm_offset_t va); +static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde); static void pmap_remove_entry(struct pmap *pmap, vm_page_t m, vm_offset_t va); static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m); +static vm_page_t pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags); static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags); static vm_page_t _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags); @@ -288,16 +291,34 @@ /* Return a pointer to the PDP slot that corresponds to a VA */ static __inline pdp_entry_t * +pmap_pml4e_to_pdpe(pml4_entry_t *pml4e, vm_offset_t va) +{ + pdp_entry_t *pdpe; + + pdpe = (pdp_entry_t *)PHYS_TO_DMAP(*pml4e & PG_FRAME); + return (&pdpe[pmap_pdpe_index(va)]); +} + +/* Return a pointer to the PDP slot that corresponds to a VA */ +static __inline pdp_entry_t * pmap_pdpe(pmap_t pmap, vm_offset_t va) { pml4_entry_t *pml4e; - pdp_entry_t *pdpe; pml4e = pmap_pml4e(pmap, va); if (pml4e == NULL || (*pml4e & PG_V) == 0) return NULL; - pdpe = (pdp_entry_t *)PHYS_TO_DMAP(*pml4e & PG_FRAME); - return (&pdpe[pmap_pdpe_index(va)]); + return (pmap_pml4e_to_pdpe(pml4e, va)); +} + +/* Return a pointer to the PD slot that corresponds to a VA */ +static __inline pd_entry_t * +pmap_pdpe_to_pde(pdp_entry_t *pdpe, vm_offset_t va) +{ + pd_entry_t *pde; + + pde = (pd_entry_t *)PHYS_TO_DMAP(*pdpe & PG_FRAME); + return (&pde[pmap_pde_index(va)]); } /* Return a pointer to the PD slot that corresponds to a VA */ @@ -305,13 +326,11 @@ pmap_pde(pmap_t pmap, vm_offset_t va) { pdp_entry_t *pdpe; - pd_entry_t *pde; pdpe = pmap_pdpe(pmap, va); if (pdpe == NULL || (*pdpe & PG_V) == 0) return NULL; - pde = (pd_entry_t *)PHYS_TO_DMAP(*pdpe & PG_FRAME); - return (&pde[pmap_pde_index(va)]); + return (pmap_pdpe_to_pde(pdpe, va)); } /* Return a pointer to the PT slot that corresponds to a VA */ @@ -786,7 +805,9 @@ pde = *pdep; if (pde) { if ((pde & PG_PS) != 0) { - rtval = (pde & ~PDRMASK) | (va & PDRMASK); + KASSERT((pde & PG_FRAME & PDRMASK) == 0, + ("pmap_extract: bad pde")); + rtval = (pde & PG_FRAME) | (va & PDRMASK); PMAP_UNLOCK(pmap); return rtval; } @@ -819,7 +840,9 @@ if (pdep != NULL && (pde = *pdep)) { if (pde & PG_PS) { if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) { - m = PHYS_TO_VM_PAGE((pde & ~PDRMASK) | + KASSERT((pde & PG_FRAME & PDRMASK) == 0, + ("pmap_extract_and_hold: bad pde")); + m = PHYS_TO_VM_PAGE((pde & PG_FRAME) | (va & PDRMASK)); vm_page_hold(m); } @@ -1222,6 +1245,33 @@ } static vm_page_t +pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags) +{ + vm_pindex_t pdpindex, ptepindex; + pdp_entry_t *pdpe; + vm_page_t pdpg; + + KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT || + (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK, + ("pmap_allocpde: flags is neither M_NOWAIT nor M_WAITOK")); +retry: + pdpe = pmap_pdpe(pmap, va); + if (pdpe != NULL && (*pdpe & PG_V) != 0) { + /* Add a reference to the pd page. */ + pdpg = PHYS_TO_VM_PAGE(*pdpe & PG_FRAME); + pdpg->wire_count++; + } else { + /* Allocate a pd page. */ + ptepindex = pmap_pde_pindex(va); + pdpindex = ptepindex >> NPDPEPGSHIFT; + pdpg = _pmap_allocpte(pmap, NUPDE + pdpindex, flags); + if (pdpg == NULL && (flags & M_WAITOK)) + goto retry; + } + return (pdpg); +} + +static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags) { vm_pindex_t ptepindex; @@ -1249,6 +1299,8 @@ if (pd != 0 && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) { *pd = 0; pd = 0; + pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; + pmap_unuse_pt(pmap, va, *pmap_pdpe(pmap, va)); pmap_invalidate_all(kernel_pmap); } @@ -1510,16 +1562,17 @@ * Remove a single page from a process address space */ static void -pmap_remove_page(pmap_t pmap, vm_offset_t va) +pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde) { - pd_entry_t ptepde; pt_entry_t *pte; PMAP_LOCK_ASSERT(pmap, MA_OWNED); - pte = pmap_pte_pde(pmap, va, &ptepde); - if (pte == NULL || (*pte & PG_V) == 0) + if ((*pde & PG_V) == 0) + return; + pte = pmap_pde_to_pte(pde, va); + if ((*pte & PG_V) == 0) return; - pmap_remove_pte(pmap, pte, va, ptepde); + pmap_remove_pte(pmap, pte, va, *pde); pmap_invalidate_page(pmap, va); } @@ -1558,7 +1611,7 @@ if (sva + PAGE_SIZE == eva) { pde = pmap_pde(pmap, sva); if (pde && (*pde & PG_PS) == 0) { - pmap_remove_page(pmap, sva); + pmap_remove_page(pmap, sva, pde); goto out; } } @@ -1569,13 +1622,13 @@ break; pml4e = pmap_pml4e(pmap, sva); - if (pml4e == 0) { + if ((*pml4e & PG_V) == 0) { va_next = (sva + NBPML4) & ~PML4MASK; continue; } - pdpe = pmap_pdpe(pmap, sva); - if (pdpe == 0) { + pdpe = pmap_pml4e_to_pdpe(pml4e, sva); + if ((*pdpe & PG_V) == 0) { va_next = (sva + NBPDP) & ~PDPMASK; continue; } @@ -1585,9 +1638,7 @@ */ va_next = (sva + NBPDR) & ~PDRMASK; - pde = pmap_pde(pmap, sva); - if (pde == 0) - continue; + pde = pmap_pdpe_to_pde(pdpe, sva); ptpaddr = *pde; /* @@ -1602,6 +1653,7 @@ if ((ptpaddr & PG_PS) != 0) { *pde = 0; pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; + pmap_unuse_pt(pmap, sva, *pdpe); anyvalid = 1; continue; } @@ -1724,22 +1776,20 @@ for (; sva < eva; sva = va_next) { pml4e = pmap_pml4e(pmap, sva); - if (pml4e == 0) { + if ((*pml4e & PG_V) == 0) { va_next = (sva + NBPML4) & ~PML4MASK; continue; } - pdpe = pmap_pdpe(pmap, sva); - if (pdpe == 0) { + pdpe = pmap_pml4e_to_pdpe(pml4e, sva); + if ((*pdpe & PG_V) == 0) { va_next = (sva + NBPDP) & ~PDPMASK; continue; } va_next = (sva + NBPDR) & ~PDRMASK; - pde = pmap_pde(pmap, sva); - if (pde == NULL) - continue; + pde = pmap_pdpe_to_pde(pdpe, sva); ptpaddr = *pde; /* @@ -2118,15 +2168,14 @@ vm_object_t object, vm_pindex_t pindex, vm_size_t size) { - vm_page_t p; + vm_offset_t va; + vm_page_t p, pdpg; VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); KASSERT(object->type == OBJT_DEVICE, ("pmap_object_init_pt: non-device object")); if (((addr & (NBPDR - 1)) == 0) && ((size & (NBPDR - 1)) == 0)) { - int i; vm_page_t m[1]; - int npdes; pd_entry_t ptepa, *pde; PMAP_LOCK(pmap); @@ -2166,12 +2215,35 @@ p->valid = VM_PAGE_BITS_ALL; PMAP_LOCK(pmap); - pmap->pm_stats.resident_count += size >> PAGE_SHIFT; - npdes = size >> PDRSHIFT; - for(i = 0; i < npdes; i++) { - pde_store(pde, ptepa | PG_U | PG_RW | PG_V | PG_PS); + for (va = addr; va < addr + size; va += NBPDR) { + while ((pdpg = + pmap_allocpde(pmap, va, M_NOWAIT)) == NULL) { + PMAP_UNLOCK(pmap); + vm_page_lock_queues(); + vm_page_busy(p); + vm_page_unlock_queues(); + VM_OBJECT_UNLOCK(object); + VM_WAIT; + VM_OBJECT_LOCK(object); + vm_page_lock_queues(); + vm_page_wakeup(p); + vm_page_unlock_queues(); + PMAP_LOCK(pmap); + } + pde = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pdpg)); + pde = &pde[pmap_pde_index(va)]; + if ((*pde & PG_V) == 0) { + pde_store(pde, ptepa | PG_PS | PG_M | PG_A | + PG_U | PG_RW | PG_V); + pmap->pm_stats.resident_count += + NBPDR / PAGE_SIZE; + } else { + pdpg->wire_count--; + KASSERT(pdpg->wire_count > 0, + ("pmap_object_init_pt: missing reference " + "to page directory page, va: 0x%lx", va)); + } ptepa += NBPDR; - pde++; } pmap_invalidate_all(pmap); out: @@ -2245,7 +2317,7 @@ } for (addr = src_addr; addr < end_addr; addr = va_next) { pt_entry_t *src_pte, *dst_pte; - vm_page_t dstmpte, srcmpte; + vm_page_t dstmpde, dstmpte, srcmpte; pml4_entry_t *pml4e; pdp_entry_t *pdpe; pd_entry_t srcptepaddr, *pde; @@ -2263,41 +2335,37 @@ break; pml4e = pmap_pml4e(src_pmap, addr); - if (pml4e == 0) { + if ((*pml4e & PG_V) == 0) { va_next = (addr + NBPML4) & ~PML4MASK; continue; } - pdpe = pmap_pdpe(src_pmap, addr); - if (pdpe == 0) { + pdpe = pmap_pml4e_to_pdpe(pml4e, addr); + if ((*pdpe & PG_V) == 0) { va_next = (addr + NBPDP) & ~PDPMASK; continue; } va_next = (addr + NBPDR) & ~PDRMASK; - pde = pmap_pde(src_pmap, addr); - if (pde) - srcptepaddr = *pde; - else - continue; + pde = pmap_pdpe_to_pde(pdpe, addr); + srcptepaddr = *pde; if (srcptepaddr == 0) continue; if (srcptepaddr & PG_PS) { - pde = pmap_pde(dst_pmap, addr); - if (pde == 0) { - /* - * XXX should do an allocpte here to - * instantiate the pde - */ - continue; - } + dstmpde = pmap_allocpde(dst_pmap, addr, M_NOWAIT); + if (dstmpde == NULL) + break; + pde = (pd_entry_t *) + PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpde)); + pde = &pde[pmap_pde_index(addr)]; if (*pde == 0) { *pde = srcptepaddr; dst_pmap->pm_stats.resident_count += NBPDR / PAGE_SIZE; - } + } else + pmap_unwire_pte_hold(dst_pmap, addr, dstmpde); continue; } ==== //depot/projects/smpng/sys/amd64/include/_limits.h#6 (text+ko) ==== @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * @(#)limits.h 8.3 (Berkeley) 1/4/94 - * $FreeBSD: src/sys/amd64/include/_limits.h,v 1.10 2005/01/05 20:17:20 imp Exp $ + * $FreeBSD: src/sys/amd64/include/_limits.h,v 1.11 2005/08/20 16:44:40 stefanf Exp $ */ #ifndef _MACHINE__LIMITS_H_ @@ -83,4 +83,10 @@ #define __LONG_BIT 64 #define __WORD_BIT 32 +/* + * Minimum signal stack size. The current signal frame + * for i386 is 408 bytes large. + */ +#define __MINSIGSTKSZ (512 * 4) + #endif /* !_MACHINE__LIMITS_H_ */ ==== //depot/projects/smpng/sys/amd64/include/signal.h#7 (text+ko) ==== @@ -28,7 +28,7 @@ * SUCH DAMAGE. * * @(#)signal.h 8.1 (Berkeley) 6/11/93 - * $FreeBSD: src/sys/amd64/include/signal.h,v 1.28 2005/01/05 20:17:20 imp Exp $ + * $FreeBSD: src/sys/amd64/include/signal.h,v 1.29 2005/08/20 16:44:40 stefanf Exp $ */ #ifndef _MACHINE_SIGNAL_H_ @@ -43,14 +43,6 @@ typedef long sig_atomic_t; -#if __XSI_VISIBLE -/* - * Minimum signal stack size. The current signal frame - * for i386 is 408 bytes large. - */ -#define MINSIGSTKSZ (512 * 4) -#endif - #if __BSD_VISIBLE #include /* codes for SIGILL, SIGFPE */ ==== //depot/projects/smpng/sys/arm/include/_limits.h#7 (text+ko) ==== @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * @(#)limits.h 8.3 (Berkeley) 1/4/94 - * $FreeBSD: src/sys/arm/include/_limits.h,v 1.8 2005/01/05 21:58:48 imp Exp $ + * $FreeBSD: src/sys/arm/include/_limits.h,v 1.9 2005/08/20 16:44:40 stefanf Exp $ */ #ifndef _MACHINE__LIMITS_H_ @@ -94,4 +94,7 @@ #endif #define __WORD_BIT 32 +/* Minimum signal stack size. */ +#define __MINSIGSTKSZ (1024 * 4) + #endif /* !_MACHINE__LIMITS_H_ */ ==== //depot/projects/smpng/sys/arm/include/signal.h#7 (text+ko) ==== @@ -29,7 +29,7 @@ * @(#)signal.h 8.1 (Berkeley) 6/11/93 * from: FreeBSD: src/sys/i386/include/signal.h,v 1.13 2000/11/09 * from: FreeBSD: src/sys/sparc64/include/signal.h,v 1.6 2001/09/30 18:52:17 - * $FreeBSD: src/sys/arm/include/signal.h,v 1.6 2005/01/05 21:58:48 imp Exp $ + * $FreeBSD: src/sys/arm/include/signal.h,v 1.7 2005/08/20 16:44:40 stefanf Exp $ */ #ifndef _MACHINE_SIGNAL_H_ @@ -39,10 +39,6 @@ typedef long sig_atomic_t; -#if __XSI_VISIBLE -#define MINSIGSTKSZ (1024 * 4) -#endif - #if __BSD_VISIBLE struct sigcontext { ==== //depot/projects/smpng/sys/conf/files#147 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/files,v 1.1041 2005/08/12 00:27:44 pjd Exp $ +# $FreeBSD: src/sys/conf/files,v 1.1042 2005/08/26 12:48:34 takawata Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -1063,6 +1063,7 @@ geom/label/g_label_ext2fs.c optional geom_label geom/label/g_label_iso9660.c optional geom_label geom/label/g_label_msdosfs.c optional geom_label +geom/label/g_label_ntfs.c optional geom_label geom/label/g_label_reiserfs.c optional geom_label geom/label/g_label_ufs.c optional geom_label geom/mirror/g_mirror.c optional geom_mirror ==== //depot/projects/smpng/sys/conf/files.i386#86 (text+ko) ==== @@ -1,7 +1,7 @@ # This file tells config what files go into building a kernel, # files marked standard are always included. # -# $FreeBSD: src/sys/conf/files.i386,v 1.539 2005/08/18 00:30:22 pjd Exp $ +# $FreeBSD: src/sys/conf/files.i386,v 1.540 2005/08/26 13:42:03 jhb Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -321,7 +321,6 @@ i386/isa/elcr.c standard i386/isa/elink.c optional ep i386/isa/elink.c optional ie -i386/isa/if_el.c optional el i386/isa/isa.c optional isa i386/isa/isa_dma.c optional isa i386/isa/nmi.c standard ==== //depot/projects/smpng/sys/conf/newvers.sh#19 (text+ko) ==== @@ -28,11 +28,14 @@ # SUCH DAMAGE. # # @(#)newvers.sh 8.1 (Berkeley) 4/20/94 -# $FreeBSD: src/sys/conf/newvers.sh,v 1.70 2005/07/11 08:34:49 scottl Exp $ +# $FreeBSD: src/sys/conf/newvers.sh,v 1.72 2005/08/19 03:56:45 cperciva Exp $ TYPE="FreeBSD" REVISION="7.0" BRANCH="CURRENT" +if [ "X${BRANCH_OVERRIDE}" != "X" ]; then + BRANCH=${BRANCH_OVERRIDE} +fi RELEASE="${REVISION}-${BRANCH}" VERSION="${TYPE} ${RELEASE}" @@ -85,10 +88,14 @@ i=`${MAKE:-make} -V KERN_IDENT` cat << EOF > vers.c $COPYRIGHT -char sccs[] = "@(#)${VERSION} #${v}: ${t}"; -char version[] = "${VERSION} #${v}: ${t}\\n ${u}@${h}:${d}\\n"; +#define SCCSSTR "@(#)${VERSION} #${v}: ${t}" +#define VERSTR "${VERSION} #${v}: ${t}\\n ${u}@${h}:${d}\\n" +#define RELSTR "${RELEASE}" + +char sccs[sizeof(SCCSSTR) > 128 ? sizeof(SCCSSTR) : 128] = SCCSSTR; +char version[sizeof(VERSTR) > 256 ? sizeof(VERSTR) : 256] = VERSTR; char ostype[] = "${TYPE}"; -char osrelease[] = "${RELEASE}"; +char osrelease[sizeof(RELSTR) > 32 ? sizeof(RELSTR) : 32] = RELSTR; int osreldate = ${RELDATE}; char kern_ident[] = "${i}"; EOF ==== //depot/projects/smpng/sys/dev/acpica/acpi_thermal.c#34 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.56 2005/08/17 17:01:25 ume Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.59 2005/08/26 02:21:02 kan Exp $"); #include "opt_acpi.h" #include @@ -347,7 +347,14 @@ AcpiOsFree(sc->tz_zone.al[i].Pointer); if (sc->tz_zone.psl.Pointer != NULL) AcpiOsFree(sc->tz_zone.psl.Pointer); - bzero(&sc->tz_zone, sizeof(sc->tz_zone)); + + /* + * XXX: We initialize only ACPI_BUFFER to avoid race condition + * with passive cooling thread which refers psv, tc1, tc2 and tsp. + */ + bzero(sc->tz_zone.ac, sizeof(sc->tz_zone.ac)); + bzero(sc->tz_zone.al, sizeof(sc->tz_zone.al)); + bzero(&sc->tz_zone.psl, sizeof(sc->tz_zone.psl)); /* Evaluate thermal zone parameters. */ for (i = 0; i < TZ_NUMLEVELS; i++) { @@ -408,6 +415,30 @@ } /* + * Get the current temperature. + */ +static int +acpi_tz_get_temperature(struct acpi_tz_softc *sc) +{ + int temp; + ACPI_STATUS status; + + ACPI_FUNCTION_NAME ("acpi_tz_get_temperature"); + + status = acpi_GetInteger(sc->tz_handle, "_TMP", &temp); + if (ACPI_FAILURE(status)) { + ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev), + "error fetching current temperature -- %s\n", + AcpiFormatException(status)); + return (FALSE); + } + + ACPI_DEBUG_PRINT((ACPI_DB_VALUES, "got %d.%dC\n", TZ_KELVTOC(temp))); + sc->tz_temperature = temp; + return (TRUE); +} + +/* * Evaluate the condition of a thermal zone, take appropriate actions. */ static void @@ -418,24 +449,17 @@ int temp; int i; int newactive, newflags; - ACPI_STATUS status; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); sc = (struct acpi_tz_softc *)Context; /* Get the current temperature. */ - status = acpi_GetInteger(sc->tz_handle, "_TMP", &temp); - if (ACPI_FAILURE(status)) { - ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev), - "error fetching current temperature -- %s\n", - AcpiFormatException(status)); + if (!acpi_tz_get_temperature(sc)) { /* XXX disable zone? go to max cooling? */ return_VOID; } - - ACPI_DEBUG_PRINT((ACPI_DB_VALUES, "got %d.%dC\n", TZ_KELVTOC(temp))); - sc->tz_temperature = temp; + temp = sc->tz_temperature; /* * Work out what we ought to be doing right now. @@ -972,19 +996,22 @@ acpi_tz_cooling_thread(void *arg) { struct acpi_tz_softc *sc; - int error, perf, temperature; + int error, perf, curr_temp, prev_temp; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); sc = (struct acpi_tz_softc *)arg; - temperature = sc->tz_temperature; + prev_temp = sc->tz_temperature; while (sc->tz_cooling_enabled) { - if (sc->tz_temperature >= sc->tz_zone.psv) + if (sc->tz_cooling_active) + (void)acpi_tz_get_temperature(sc); + curr_temp = sc->tz_temperature; + if (curr_temp >= sc->tz_zone.psv) sc->tz_cooling_active = TRUE; if (sc->tz_cooling_active) { - perf = sc->tz_zone.tc1 * (sc->tz_temperature - temperature) + - sc->tz_zone.tc2 * (sc->tz_temperature - sc->tz_zone.psv); + perf = sc->tz_zone.tc1 * (curr_temp - prev_temp) + + sc->tz_zone.tc2 * (curr_temp - sc->tz_zone.psv); perf /= 10; if (perf != 0) { @@ -1001,7 +1028,7 @@ } } } - temperature = sc->tz_temperature; + prev_temp = curr_temp; tsleep(&sc->tz_cooling_proc, PZERO, "cooling", hz * sc->tz_zone.tsp / 10); } ==== //depot/projects/smpng/sys/dev/ata/ata-all.c#72 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.254 2005/08/17 15:00:33 sos Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.255 2005/08/25 15:45:03 sos Exp $"); #include "opt_ata.h" #include @@ -615,7 +615,9 @@ atadev->mode = ATA_DMA_MAX; } else { - if (ata_dma && ch->dma) + if (ata_dma && ch->dma && + (ata_umode(&atadev->param) > 0 || + ata_wmode(&atadev->param) > 0)) atadev->mode = ATA_DMA_MAX; } } ==== //depot/projects/smpng/sys/dev/ata/ata-chipset.c#55 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.129 2005/08/17 15:00:33 sos Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.131 2005/08/23 08:53:01 sos Exp $"); #include "opt_ata.h" #include @@ -75,6 +75,7 @@ static int ata_ali_chipinit(device_t dev); static int ata_ali_allocate(device_t dev); static int ata_ali_sata_allocate(device_t dev); +static void ata_ali_reset(device_t dev); static void ata_ali_setmode(device_t dev, int mode); static int ata_amd_chipinit(device_t dev); static int ata_cyrix_chipinit(device_t dev); @@ -878,26 +879,28 @@ break; case ALINEW: - /* deactivate the ATAPI FIFO and enable ATAPI UDMA */ - pci_write_config(dev, 0x53, - pci_read_config(dev, 0x53, 1) | 0x01, 1); + /* use device interrupt as byte count end */ + pci_write_config(dev, 0x4a, pci_read_config(dev, 0x4a, 1) | 0x20, 1); /* enable cable detection and UDMA support on newer chips */ pci_write_config(dev, 0x4b, pci_read_config(dev, 0x4b, 1) | 0x09, 1); + /* enable ATAPI UDMA mode */ + pci_write_config(dev, 0x53, pci_read_config(dev, 0x53, 1) | 0x01, 1); + /* only chips with revision > 0xc4 can do 48bit DMA */ if (ctlr->chip->chiprev <= 0xc4) device_printf(dev, "using PIO transfers above 137GB as workaround for " "48bit DMA access bug, expect reduced performance\n"); + ctlr->reset = ata_ali_reset; ctlr->allocate = ata_ali_allocate; ctlr->setmode = ata_ali_setmode; break; case ALIOLD: /* deactivate the ATAPI FIFO and enable ATAPI UDMA */ - pci_write_config(dev, 0x53, - (pci_read_config(dev, 0x53, 1) & ~0x02) | 0x03, 1); + pci_write_config(dev, 0x53, pci_read_config(dev, 0x53, 1) | 0x03, 1); ctlr->setmode = ata_ali_setmode; break; } @@ -963,6 +966,39 @@ } static void >>> TRUNCATED FOR MAIL (1000 lines) <<<