From owner-p4-projects@FreeBSD.ORG Wed Apr 25 04:58:55 2007 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 BFD9416A404; Wed, 25 Apr 2007 04:58:54 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 195BE16A402 for ; Wed, 25 Apr 2007 04:58:54 +0000 (UTC) (envelope-from mjacob@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 0694B13C448 for ; Wed, 25 Apr 2007 04:58:54 +0000 (UTC) (envelope-from mjacob@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l3P4wrQp024023 for ; Wed, 25 Apr 2007 04:58:53 GMT (envelope-from mjacob@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l3P4wosN024020 for perforce@freebsd.org; Wed, 25 Apr 2007 04:58:50 GMT (envelope-from mjacob@freebsd.org) Date: Wed, 25 Apr 2007 04:58:50 GMT Message-Id: <200704250458.l3P4wosN024020@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to mjacob@freebsd.org using -f From: Matt Jacob To: Perforce Change Reviews Cc: Subject: PERFORCE change 118769 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: Wed, 25 Apr 2007 04:58:55 -0000 http://perforce.freebsd.org/chv.cgi?CH=118769 Change 118769 by mjacob@mjexp on 2007/04/25 04:57:59 IFC Affected files ... .. //depot/projects/mjexp/sys/amd64/amd64/pmap.c#9 integrate .. //depot/projects/mjexp/sys/amd64/amd64/vm_machdep.c#2 integrate .. //depot/projects/mjexp/sys/amd64/include/vmparam.h#2 integrate .. //depot/projects/mjexp/sys/cam/scsi/scsi_da.c#9 integrate .. //depot/projects/mjexp/sys/compat/linprocfs/linprocfs.c#11 integrate .. //depot/projects/mjexp/sys/compat/opensolaris/kern/opensolaris_misc.c#2 integrate .. //depot/projects/mjexp/sys/compat/opensolaris/kern/opensolaris_vfs.c#3 integrate .. //depot/projects/mjexp/sys/compat/opensolaris/sys/misc.h#2 integrate .. //depot/projects/mjexp/sys/compat/opensolaris/sys/sunddi.h#1 branch .. //depot/projects/mjexp/sys/compat/opensolaris/sys/types.h#2 integrate .. //depot/projects/mjexp/sys/compat/opensolaris/sys/vnode.h#2 integrate .. //depot/projects/mjexp/sys/conf/files#21 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/dnlc.c#5 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/arc.c#4 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/spa.c#5 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/spa_config.c#4 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/vdev.c#2 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zap.c#3 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c#2 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c#2 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c#4 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_log.c#2 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c#4 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c#3 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c#3 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zil.c#2 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zio.c#2 integrate .. //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zvol.c#2 integrate .. //depot/projects/mjexp/sys/dev/acpi_support/acpi_ibm.c#3 integrate .. //depot/projects/mjexp/sys/dev/ath/if_ath.c#9 integrate .. //depot/projects/mjexp/sys/dev/firewire/firewire.h#2 integrate .. //depot/projects/mjexp/sys/dev/firewire/fwdev.c#4 integrate .. //depot/projects/mjexp/sys/dev/led/led.c#2 integrate .. //depot/projects/mjexp/sys/dev/led/led.h#2 integrate .. //depot/projects/mjexp/sys/dev/msk/if_msk.c#8 integrate .. //depot/projects/mjexp/sys/dev/msk/if_mskreg.h#2 integrate .. //depot/projects/mjexp/sys/dev/usb/if_ural.c#8 integrate .. //depot/projects/mjexp/sys/fs/devfs/devfs_devs.c#4 integrate .. //depot/projects/mjexp/sys/fs/devfs/devfs_vnops.c#8 integrate .. //depot/projects/mjexp/sys/fs/procfs/procfs_map.c#3 integrate .. //depot/projects/mjexp/sys/fs/pseudofs/pseudofs_vncache.c#6 integrate .. //depot/projects/mjexp/sys/geom/uzip/g_uzip.c#3 integrate .. //depot/projects/mjexp/sys/i386/i386/pmap.c#10 integrate .. //depot/projects/mjexp/sys/i386/i386/sys_machdep.c#4 integrate .. //depot/projects/mjexp/sys/i386/i386/vm_machdep.c#4 integrate .. //depot/projects/mjexp/sys/i386/include/vmparam.h#3 integrate .. //depot/projects/mjexp/sys/ia64/include/vmparam.h#2 integrate .. //depot/projects/mjexp/sys/kern/kern_linker.c#7 integrate .. //depot/projects/mjexp/sys/kern/kern_malloc.c#3 integrate .. //depot/projects/mjexp/sys/kern/kern_time.c#7 integrate .. //depot/projects/mjexp/sys/kern/kern_uuid.c#3 integrate .. //depot/projects/mjexp/sys/kern/vfs_bio.c#10 integrate .. //depot/projects/mjexp/sys/modules/zfs/Makefile#3 integrate .. //depot/projects/mjexp/sys/netgraph/ng_l2tp.c#2 integrate .. //depot/projects/mjexp/sys/netinet/sctp.h#3 integrate .. //depot/projects/mjexp/sys/netinet/sctp_indata.c#10 integrate .. //depot/projects/mjexp/sys/netinet/sctp_indata.h#3 integrate .. //depot/projects/mjexp/sys/netinet/sctp_input.c#10 integrate .. //depot/projects/mjexp/sys/netinet/sctp_output.c#11 integrate .. //depot/projects/mjexp/sys/netinet/sctp_pcb.c#10 integrate .. //depot/projects/mjexp/sys/netinet/sctp_pcb.h#7 integrate .. //depot/projects/mjexp/sys/netinet/sctp_structs.h#10 integrate .. //depot/projects/mjexp/sys/netinet/sctp_uio.h#10 integrate .. //depot/projects/mjexp/sys/netinet/sctp_usrreq.c#10 integrate .. //depot/projects/mjexp/sys/netinet/sctputil.c#10 integrate .. //depot/projects/mjexp/sys/netinet/sctputil.h#8 integrate .. //depot/projects/mjexp/sys/netinet/tcp_input.c#12 integrate .. //depot/projects/mjexp/sys/netinet6/in6_pcb.c#3 integrate .. //depot/projects/mjexp/sys/netinet6/route6.c#2 integrate .. //depot/projects/mjexp/sys/nfsclient/nfs_lock.c#2 integrate .. //depot/projects/mjexp/sys/nfsserver/nfs_syscalls.c#7 integrate .. //depot/projects/mjexp/sys/pci/if_vr.c#4 integrate .. //depot/projects/mjexp/sys/pci/if_vrreg.h#3 integrate .. //depot/projects/mjexp/sys/security/audit/audit_syscalls.c#7 integrate .. //depot/projects/mjexp/sys/security/mac/mac_audit.c#1 branch .. //depot/projects/mjexp/sys/security/mac/mac_framework.h#6 integrate .. //depot/projects/mjexp/sys/security/mac/mac_inet.c#5 integrate .. //depot/projects/mjexp/sys/security/mac/mac_net.c#5 integrate .. //depot/projects/mjexp/sys/security/mac/mac_pipe.c#5 integrate .. //depot/projects/mjexp/sys/security/mac/mac_policy.h#3 integrate .. //depot/projects/mjexp/sys/security/mac/mac_process.c#4 integrate .. //depot/projects/mjexp/sys/security/mac/mac_socket.c#4 integrate .. //depot/projects/mjexp/sys/security/mac/mac_system.c#6 integrate .. //depot/projects/mjexp/sys/security/mac/mac_vfs.c#5 integrate .. //depot/projects/mjexp/sys/security/mac_biba/mac_biba.c#7 integrate .. //depot/projects/mjexp/sys/security/mac_bsdextended/mac_bsdextended.c#7 integrate .. //depot/projects/mjexp/sys/security/mac_ifoff/mac_ifoff.c#5 integrate .. //depot/projects/mjexp/sys/security/mac_lomac/mac_lomac.c#6 integrate .. //depot/projects/mjexp/sys/security/mac_mls/mac_mls.c#5 integrate .. //depot/projects/mjexp/sys/security/mac_partition/mac_partition.c#6 integrate .. //depot/projects/mjexp/sys/security/mac_portacl/mac_portacl.c#7 integrate .. //depot/projects/mjexp/sys/security/mac_seeotheruids/mac_seeotheruids.c#7 integrate .. //depot/projects/mjexp/sys/security/mac_stub/mac_stub.c#6 integrate .. //depot/projects/mjexp/sys/security/mac_test/mac_test.c#6 integrate .. //depot/projects/mjexp/sys/sparc64/include/vmparam.h#2 integrate .. //depot/projects/mjexp/sys/sun4v/include/vmparam.h#2 integrate .. //depot/projects/mjexp/sys/sys/mount.h#11 integrate .. //depot/projects/mjexp/sys/sys/priv.h#7 integrate .. //depot/projects/mjexp/sys/sys/proc.h#13 integrate .. //depot/projects/mjexp/sys/vm/swap_pager.c#7 integrate Differences ... ==== //depot/projects/mjexp/sys/amd64/amd64/pmap.c#9 (text+ko) ==== @@ -77,7 +77,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.582 2007/04/13 16:07:29 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.583 2007/04/21 14:17:29 ups Exp $"); /* * Manages physical address maps. @@ -209,7 +209,7 @@ static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, vm_page_t mpte); static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, - vm_offset_t sva, pd_entry_t ptepde); + vm_offset_t sva, pd_entry_t ptepde, vm_page_t *free); 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); @@ -221,8 +221,9 @@ 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); -static int _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m); -static int pmap_unuse_pt(pmap_t, vm_offset_t, pd_entry_t); +static int _pmap_unwire_pte_hold(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); CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t)); @@ -1065,24 +1066,36 @@ /*************************************************** * Page table page management routines..... ***************************************************/ +static PMAP_INLINE void +pmap_free_zero_pages(vm_page_t free) +{ + vm_page_t m; + while (free != NULL) { + m = free; + free = m->right; + vm_page_free_zero(m); + } +} + /* * This routine unholds page table pages, and if the hold count * drops to zero, then it decrements the wire count. */ static PMAP_INLINE int -pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m) +pmap_unwire_pte_hold(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); + return _pmap_unwire_pte_hold(pmap, va, m, free); else return 0; } static int -_pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m) +_pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m, + vm_page_t *free) { vm_offset_t pteva; @@ -1114,14 +1127,14 @@ vm_page_t pdpg; pdpg = PHYS_TO_VM_PAGE(*pmap_pdpe(pmap, va) & PG_FRAME); - pmap_unwire_pte_hold(pmap, va, pdpg); + pmap_unwire_pte_hold(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); + pmap_unwire_pte_hold(pmap, va, pdppg, free); } /* @@ -1130,7 +1143,13 @@ */ pmap_invalidate_page(pmap, pteva); - vm_page_free_zero(m); + /* + * Put page on a list so that it is released after + * *ALL* TLB shootdown is done + */ + m->right = *free; + *free = m; + atomic_subtract_int(&cnt.v_wire_count, 1); return 1; } @@ -1140,7 +1159,7 @@ * conditionally free the page, and manage the hold/wire counts. */ static int -pmap_unuse_pt(pmap_t pmap, vm_offset_t va, pd_entry_t ptepde) +pmap_unuse_pt(pmap_t pmap, vm_offset_t va, pd_entry_t ptepde, vm_page_t *free) { vm_page_t mpte; @@ -1148,7 +1167,7 @@ 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); + return pmap_unwire_pte_hold(pmap, va, mpte, free); } void @@ -1366,7 +1385,7 @@ { vm_pindex_t ptepindex; pd_entry_t *pd; - vm_page_t m; + vm_page_t m, free; KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT || (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK, @@ -1390,8 +1409,10 @@ *pd = 0; pd = 0; pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; - pmap_unuse_pt(pmap, va, *pmap_pdpe(pmap, va)); + free = NULL; + pmap_unuse_pt(pmap, va, *pmap_pdpe(pmap, va), &free); pmap_invalidate_all(kernel_pmap); + pmap_free_zero_pages(free); } /* @@ -1609,7 +1630,7 @@ pt_entry_t *pte, tpte; pv_entry_t next_pv, pv; vm_offset_t va; - vm_page_t m; + vm_page_t m, free; TAILQ_FOREACH(m, &vpq->pl, pageq) { if (m->hold_count || m->busy) @@ -1635,12 +1656,14 @@ va, tpte)); vm_page_dirty(m); } + free = NULL; + pmap_unuse_pt(pmap, va, ptepde, &free); pmap_invalidate_page(pmap, va); + pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); if (TAILQ_EMPTY(&m->md.pv_list)) vm_page_flag_clear(m, PG_WRITEABLE); m->md.pv_list_count--; - pmap_unuse_pt(pmap, va, ptepde); free_pv_entry(pmap, pv); if (pmap != locked_pmap) PMAP_UNLOCK(pmap); @@ -1833,7 +1856,8 @@ * pmap_remove_pte: do the things to unmap a page in a process */ static int -pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, pd_entry_t ptepde) +pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, + pd_entry_t ptepde, vm_page_t *free) { pt_entry_t oldpte; vm_page_t m; @@ -1861,7 +1885,7 @@ vm_page_flag_set(m, PG_REFERENCED); pmap_remove_entry(pmap, m, va); } - return (pmap_unuse_pt(pmap, va, ptepde)); + return (pmap_unuse_pt(pmap, va, ptepde, free)); } /* @@ -1871,6 +1895,7 @@ pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde) { pt_entry_t *pte; + vm_page_t free = NULL; PMAP_LOCK_ASSERT(pmap, MA_OWNED); if ((*pde & PG_V) == 0) @@ -1878,8 +1903,9 @@ pte = pmap_pde_to_pte(pde, va); if ((*pte & PG_V) == 0) return; - pmap_remove_pte(pmap, pte, va, *pde); + pmap_remove_pte(pmap, pte, va, *pde, &free); pmap_invalidate_page(pmap, va); + pmap_free_zero_pages(free); } /* @@ -1896,6 +1922,7 @@ pdp_entry_t *pdpe; pd_entry_t ptpaddr, *pde; pt_entry_t *pte; + vm_page_t free = NULL; int anyvalid; /* @@ -1959,7 +1986,7 @@ if ((ptpaddr & PG_PS) != 0) { *pde = 0; pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; - pmap_unuse_pt(pmap, sva, *pdpe); + pmap_unuse_pt(pmap, sva, *pdpe, &free); anyvalid = 1; continue; } @@ -1983,14 +2010,16 @@ */ if ((*pte & PG_G) == 0) anyvalid = 1; - if (pmap_remove_pte(pmap, pte, sva, ptpaddr)) + if (pmap_remove_pte(pmap, pte, sva, ptpaddr, &free)) break; } } out: - vm_page_unlock_queues(); - if (anyvalid) + if (anyvalid) { pmap_invalidate_all(pmap); + pmap_free_zero_pages(free); + } + vm_page_unlock_queues(); PMAP_UNLOCK(pmap); } @@ -2014,6 +2043,7 @@ pmap_t pmap; pt_entry_t *pte, tpte; pd_entry_t ptepde; + vm_page_t free; #if defined(PMAP_DIAGNOSTIC) /* @@ -2045,10 +2075,12 @@ pv->pv_va, tpte)); vm_page_dirty(m); } + free = NULL; + pmap_unuse_pt(pmap, pv->pv_va, ptepde, &free); pmap_invalidate_page(pmap, pv->pv_va); + pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); m->md.pv_list_count--; - pmap_unuse_pt(pmap, pv->pv_va, ptepde); free_pv_entry(pmap, pv); PMAP_UNLOCK(pmap); } @@ -2161,9 +2193,9 @@ } } } - vm_page_unlock_queues(); if (anychanged) pmap_invalidate_all(pmap); + vm_page_unlock_queues(); PMAP_UNLOCK(pmap); } @@ -2413,6 +2445,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, vm_page_t mpte) { + vm_page_t free; pt_entry_t *pte; vm_paddr_t pa; @@ -2471,7 +2504,7 @@ pte = vtopte(va); if (*pte) { if (mpte != NULL) { - pmap_unwire_pte_hold(pmap, va, mpte); + mpte->wire_count--; mpte = NULL; } return (mpte); @@ -2483,7 +2516,11 @@ if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0 && !pmap_try_insert_pv_entry(pmap, va, m)) { if (mpte != NULL) { - pmap_unwire_pte_hold(pmap, va, mpte); + free = NULL; + if (pmap_unwire_pte_hold(pmap, va, mpte, &free)) { + pmap_invalidate_page(pmap, va); + pmap_free_zero_pages(free); + } mpte = NULL; } return (mpte); @@ -2657,6 +2694,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len, vm_offset_t src_addr) { + vm_page_t free; vm_offset_t addr; vm_offset_t end_addr = src_addr + len; vm_offset_t va_next; @@ -2716,7 +2754,7 @@ dst_pmap->pm_stats.resident_count += NBPDR / PAGE_SIZE; } else - pmap_unwire_pte_hold(dst_pmap, addr, dstmpde); + dstmpde->wire_count--; continue; } @@ -2753,9 +2791,15 @@ *dst_pte = ptetemp & ~(PG_W | PG_M | PG_A); dst_pmap->pm_stats.resident_count++; - } else - pmap_unwire_pte_hold(dst_pmap, addr, - dstmpte); + } else { + free = NULL; + if (pmap_unwire_pte_hold(dst_pmap, + addr, dstmpte, &free)) { + pmap_invalidate_page(dst_pmap, + addr); + pmap_free_zero_pages(free); + } + } if (dstmpte->wire_count >= srcmpte->wire_count) break; } @@ -2866,7 +2910,7 @@ pmap_remove_pages(pmap_t pmap) { pt_entry_t *pte, tpte; - vm_page_t m; + vm_page_t m, free = NULL; pv_entry_t pv; struct pv_chunk *pc, *npc; int field, idx; @@ -2939,7 +2983,7 @@ if (TAILQ_EMPTY(&m->md.pv_list)) vm_page_flag_clear(m, PG_WRITEABLE); pmap_unuse_pt(pmap, pv->pv_va, - *vtopde(pv->pv_va)); + *vtopde(pv->pv_va), &free); } } if (allfree) { @@ -2952,8 +2996,9 @@ vm_page_free(m); } } + pmap_invalidate_all(pmap); + pmap_free_zero_pages(free); vm_page_unlock_queues(); - pmap_invalidate_all(pmap); PMAP_UNLOCK(pmap); } ==== //depot/projects/mjexp/sys/amd64/amd64/vm_machdep.c#2 (text+ko) ==== @@ -41,7 +41,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/vm_machdep.c,v 1.252 2006/09/17 14:54:14 davidxu Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/vm_machdep.c,v 1.254 2007/04/24 21:17:45 jhb Exp $"); #include "opt_isa.h" #include "opt_cpu.h" @@ -457,6 +457,10 @@ static void cpu_reset_real() { + struct region_descriptor null_idt; + int b; + + disable_intr(); /* * Attempt to do a CPU reset via the keyboard controller, @@ -465,14 +469,44 @@ */ outb(IO_KBD + 4, 0xFE); DELAY(500000); /* wait 0.5 sec to see if that did it */ - printf("Keyboard reset did not work, attempting CPU shutdown\n"); + + /* + * Attempt to force a reset via the Reset Control register at + * I/O port 0xcf9. Bit 2 forces a system reset when it is + * written as 1. Bit 1 selects the type of reset to attempt: + * 0 selects a "soft" reset, and 1 selects a "hard" reset. We + * try to do a "soft" reset first, and then a "hard" reset. + */ + outb(0xcf9, 0x2); + outb(0xcf9, 0x6); + DELAY(500000); /* wait 0.5 sec to see if that did it */ + + /* + * Attempt to force a reset via the Fast A20 and Init register + * at I/O port 0x92. Bit 1 serves as an alternate A20 gate. + * Bit 0 asserts INIT# when set to 1. We are careful to only + * preserve bit 1 while setting bit 0. We also must clear bit + * 0 before setting it if it isn't already clear. + */ + b = inb(0x92); + if (b != 0xff) { + if ((b & 0x1) != 0) + outb(0x92, b & 0xfe); + outb(0x92, b | 0x1); + DELAY(500000); /* wait 0.5 sec to see if that did it */ + } + + printf("No known reset method worked, attempting CPU shutdown\n"); DELAY(1000000); /* wait 1 sec for printf to complete */ - /* Force a shutdown by unmapping entire address space. */ - bzero((caddr_t)PML4map, PAGE_SIZE); + /* Wipe the IDT. */ + null_idt.rd_limit = 0; + null_idt.rd_base = 0; + lidt(&null_idt); /* "good night, sweet prince .... " */ - invltlb(); + breakpoint(); + /* NOTREACHED */ while(1); } ==== //depot/projects/mjexp/sys/amd64/include/vmparam.h#2 (text+ko) ==== @@ -38,7 +38,7 @@ * SUCH DAMAGE. * * from: @(#)vmparam.h 5.9 (Berkeley) 5/12/91 - * $FreeBSD: src/sys/amd64/include/vmparam.h,v 1.45 2004/10/27 17:21:15 peter Exp $ + * $FreeBSD: src/sys/amd64/include/vmparam.h,v 1.46 2007/04/21 01:14:47 sepotvin Exp $ */ @@ -122,7 +122,8 @@ /* * How many physical pages per KVA page allocated. - * min(max(VM_KMEM_SIZE, Physical memory/VM_KMEM_SIZE_SCALE), VM_KMEM_SIZE_MAX) + * min(max(max(VM_KMEM_SIZE, Physical memory/VM_KMEM_SIZE_SCALE), + * VM_KMEM_SIZE_MIN), VM_KMEM_SIZE_MAX) * is the total KVA space allocated for kmem_map. */ #ifndef VM_KMEM_SIZE_SCALE ==== //depot/projects/mjexp/sys/cam/scsi/scsi_da.c#9 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/cam/scsi/scsi_da.c,v 1.207 2007/04/19 22:18:15 scottl Exp $"); +__FBSDID("$FreeBSD: src/sys/cam/scsi/scsi_da.c,v 1.208 2007/04/23 18:01:44 scottl Exp $"); #include @@ -39,20 +39,13 @@ #include #include #include -#endif /* _KERNEL */ - +#include #include -#include #include #include #include - -#include - -#include -#include - #include +#endif /* _KERNEL */ #ifndef _KERNEL #include ==== //depot/projects/mjexp/sys/compat/linprocfs/linprocfs.c#11 (text+ko) ==== @@ -40,7 +40,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/compat/linprocfs/linprocfs.c,v 1.110 2007/04/15 17:02:03 des Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linprocfs/linprocfs.c,v 1.111 2007/04/22 08:41:52 des Exp $"); #include #include @@ -312,9 +312,11 @@ int error; /* resolve symlinks etc. in the emulation tree prefix */ - NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, linux_emul_path, td); + NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, linux_emul_path, td); flep = NULL; - if (namei(&nd) != 0 || vn_fullpath(td, nd.ni_vp, &dlep, &flep) != 0) + error = namei(&nd); + VFS_UNLOCK_GIANT(NDHASGIANT(&nd)); + if (error != 0 || vn_fullpath(td, nd.ni_vp, &dlep, &flep) != 0) lep = linux_emul_path; else lep = dlep; ==== //depot/projects/mjexp/sys/compat/opensolaris/kern/opensolaris_misc.c#2 (text+ko) ==== @@ -25,12 +25,13 @@ */ #include -__FBSDID("$FreeBSD: src/sys/compat/opensolaris/kern/opensolaris_misc.c,v 1.1 2007/04/08 16:29:23 pjd Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/opensolaris/kern/opensolaris_misc.c,v 1.2 2007/04/23 00:52:06 pjd Exp $"); #include #include #include #include +#include char hw_serial[11] = "0"; ==== //depot/projects/mjexp/sys/compat/opensolaris/kern/opensolaris_vfs.c#3 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/compat/opensolaris/kern/opensolaris_vfs.c,v 1.3 2007/04/18 15:24:48 pjd Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/opensolaris/kern/opensolaris_vfs.c,v 1.4 2007/04/21 12:02:57 pjd Exp $"); #include #include @@ -206,7 +206,7 @@ mp->mnt_flag |= fsflags & (MNT_UPDATEMASK | MNT_FORCE | MNT_ROOTFS); /* * Unprivileged user can trigger mounting a snapshot, but we don't want - * him to unmount it, so we switch to privileged credential. + * him to unmount it, so we switch to privileged credentials. */ crfree(mp->mnt_cred); mp->mnt_cred = crdup(kcred); ==== //depot/projects/mjexp/sys/compat/opensolaris/sys/misc.h#2 (text+ko) ==== @@ -23,18 +23,23 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/compat/opensolaris/sys/misc.h,v 1.1 2007/04/08 16:29:24 pjd Exp $ + * $FreeBSD: src/sys/compat/opensolaris/sys/misc.h,v 1.2 2007/04/23 00:52:06 pjd Exp $ */ #ifndef _OPENSOLARIS_SYS_MISC_H_ #define _OPENSOLARIS_SYS_MISC_H_ +#define _FIOFFS (INT_MIN) +#define _FIOGDIO (INT_MIN+1) +#define _FIOSDIO (INT_MIN+2) + +#define _FIO_SEEK_DATA FIOSEEKDATA +#define _FIO_SEEK_HOLE FIOSEEKHOLE + struct opensolaris_utsname { char *nodename; }; extern char hw_serial[11]; extern struct opensolaris_utsname utsname; - -int ddi_strtoul(const char *str, char **nptr, int base, unsigned long *result); #endif /* _OPENSOLARIS_SYS_MISC_H_ */ ==== //depot/projects/mjexp/sys/compat/opensolaris/sys/types.h#2 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/compat/opensolaris/sys/types.h,v 1.1 2007/04/06 01:09:06 pjd Exp $ + * $FreeBSD: src/sys/compat/opensolaris/sys/types.h,v 1.2 2007/04/23 00:52:06 pjd Exp $ */ #ifndef _OPENSOLARIS_SYS_TYPES_H_ @@ -49,6 +49,7 @@ typedef off_t offset_t; typedef long ptrdiff_t; /* pointer difference */ typedef void pathname_t; +typedef int64_t rlim64_t; #else ==== //depot/projects/mjexp/sys/compat/opensolaris/sys/vnode.h#2 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/compat/opensolaris/sys/vnode.h,v 1.1 2007/04/06 01:09:06 pjd Exp $ + * $FreeBSD: src/sys/compat/opensolaris/sys/vnode.h,v 1.2 2007/04/23 00:52:06 pjd Exp $ */ #ifndef _OPENSOLARIS_SYS_VNODE_H_ @@ -40,6 +40,7 @@ typedef struct vnode vnode_t; typedef struct vattr vattr_t; +typedef void caller_context_t; typedef struct vop_vector vnodeops_t; #define vop_fid vop_vptofh @@ -63,11 +64,25 @@ #define VN_RELE(v) vrele(v) #define VN_URELE(v) vput(v) +#define VOP_REALVP(vp, vpp) (*(vpp) = (vp), 0) + +#define vnevent_remove(vp) do { } while (0) +#define vnevent_rmdir(vp) do { } while (0) +#define vnevent_rename_src(vp) do { } while (0) +#define vnevent_rename_dest(vp) do { } while (0) + + #define IS_DEVVP(vp) \ ((vp)->v_type == VCHR || (vp)->v_type == VBLK || (vp)->v_type == VFIFO) #define MODEMASK ALLPERMS +#define specvp(vp, rdev, type, cr) (VN_HOLD(vp), (vp)) +#define MANDMODE(mode) (0) +#define chklock(vp, op, offset, size, mode, ct) (0) +#define cleanlocks(vp, pid, foo) do { } while (0) +#define cleanshares(vp, pid) do { } while (0) + /* * We will use va_spare is place of Solaris' va_mask. * This field is initialized in zfs_setattr(). @@ -80,6 +95,9 @@ #define va_blksize va_blocksize #define va_seq va_gen +#define MAXOFFSET_T OFF_MAX +#define EXCL 0 + #define AT_TYPE 0x0001 #define AT_MODE 0x0002 #define AT_UID 0x0004 @@ -95,6 +113,8 @@ #define AT_BLKSIZE 0x1000 #define AT_NBLOCKS 0x2000 #define AT_SEQ 0x4000 +#define AT_NOSET (AT_NLINK|AT_RDEV|AT_FSID|AT_NODEID|AT_TYPE|\ + AT_BLKSIZE|AT_NBLOCKS|AT_SEQ) #define ACCESSED (AT_ATIME) #define STATE_CHANGED (AT_CTIME) @@ -122,10 +142,15 @@ vap->va_mask |= AT_MODE; } -enum create { CRCREAT }; #define FCREAT O_CREAT #define FTRUNC O_TRUNC +#define FDSYNC FFSYNC +#define FRSYNC FFSYNC +#define FSYNC FFSYNC #define FOFFMAX 0x00 + +enum create { CRCREAT }; + static __inline int zfs_vn_open(char *pnamep, enum uio_seg seg, int filemode, int createmode, vnode_t **vpp, enum create crwhy, mode_t umask) @@ -185,7 +210,6 @@ #define vn_rdwr(rw, vp, base, len, offset, seg, ioflag, ulimit, cr, residp) \ zfs_vn_rdwr((rw), (vp), (base), (len), (offset), (seg), (ioflag), (ulimit), (cr), (residp)) -#define FSYNC MNT_WAIT static __inline int zfs_vop_fsync(vnode_t *vp, int flag, cred_t *cr) { @@ -199,7 +223,7 @@ if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) goto drop; vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); - error = VOP_FSYNC(vp, flag, td); + error = VOP_FSYNC(vp, MNT_WAIT, td); VOP_UNLOCK(vp, 0, td); vn_finished_write(mp); drop: ==== //depot/projects/mjexp/sys/conf/files#21 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/files,v 1.1196 2007/04/17 00:35:10 thompsa Exp $ +# $FreeBSD: src/sys/conf/files,v 1.1197 2007/04/21 22:08:47 rwatson Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -1957,6 +1957,7 @@ security/audit/audit_syscalls.c standard security/audit/audit_trigger.c optional audit security/audit/audit_worker.c optional audit +security/mac/mac_audit.c optional mac audit security/mac/mac_framework.c optional mac security/mac/mac_inet.c optional mac inet security/mac/mac_label.c optional mac ==== //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/dnlc.c#5 (text+ko) ==== @@ -203,7 +203,11 @@ { "pick_last", KSTAT_DATA_UINT64 }, }; +#ifdef FREEBSD_NAMECACHE +static int doingcache = 0; +#else static int doingcache = 1; +#endif TUNABLE_INT("vfs.zfs.dnlc.enable", &doingcache); SYSCTL_INT(_vfs_zfs_dnlc, OID_AUTO, enable, CTLFLAG_RDTUN, &doingcache, 0, "Enable/disable name cache"); ==== //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/arc.c#4 (text+ko) ==== @@ -2802,13 +2802,14 @@ #ifdef _KERNEL /* Warn about ZFS memory requirements. */ if (((uint64_t)physmem * PAGESIZE) < (256 + 128 + 64) * (1 << 20)) { - printf("ZFS WARNING: Recomended minimum of RAM size is 512MB, " - "expect unstable behaviour.\n"); + printf("ZFS WARNING: Recommended minimum RAM size is 512MB; " + "expect unstable behavior.\n"); } else if (kmem_size() < 256 * (1 << 20)) { - printf("ZFS WARNING: Recomended minimum of kmem_map size is " - "256MB, expect unstable behaviour.\n"); - printf(" Consider tunning vm.kmem_size and " - "vm.kmem_size_max in /boot/loader.conf.\n"); + printf("ZFS WARNING: Recommended minimum kmem_size is 256MB; " + "expect unstable behavior.\n"); + printf(" Consider tuning vm.kmem_size or " + "vm.kmem_size_min\n"); + printf(" in /boot/loader.conf.\n"); } #endif } ==== //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/spa.c#5 (text+ko) ==== @@ -57,6 +57,7 @@ #include #include #include +#include int zio_taskq_threads = 0; SYSCTL_DECL(_vfs_zfs); @@ -499,10 +500,9 @@ /* * Try to open all vdevs, loading each label in the process. */ - if (vdev_open(rvd) != 0) { - error = ENXIO; + error = vdev_open(rvd); + if (error != 0) goto out; - } /* * Validate the labels for all leaf vdevs. We need to grab the config @@ -513,10 +513,8 @@ error = vdev_validate(rvd); spa_config_exit(spa, FTAG); - if (error != 0) { - error = EBADF; + if (error != 0) goto out; - } if (rvd->vdev_state <= VDEV_STATE_CANT_OPEN) { error = ENXIO; ==== //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/spa_config.c#4 (text+ko) ==== @@ -35,6 +35,7 @@ #include #include #include +#include #ifdef _KERNEL #include #endif ==== //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/vdev.c#2 (text+ko) ==== @@ -931,7 +931,7 @@ for (c = 0; c < vd->vdev_children; c++) if (vdev_validate(vd->vdev_child[c]) != 0) - return (-1); + return (EBADF); /* * If the device has already failed, or was marked offline, don't do @@ -974,7 +974,7 @@ if (spa->spa_load_state == SPA_LOAD_OPEN && state != POOL_STATE_ACTIVE) - return (-1); + return (EBADF); } /* @@ -1262,7 +1262,6 @@ vdev_config_dirty(vd->vdev_top); } - bzero(&smlock, sizeof(smlock)); mutex_init(&smlock, NULL, MUTEX_DEFAULT, NULL); space_map_create(&smsync, sm->sm_start, sm->sm_size, sm->sm_shift, ==== //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zap.c#3 (text+ko) ==== @@ -48,6 +48,7 @@ #include #include #include +#include int fzap_default_block_shift = 14; /* 16k blocksize */ @@ -907,7 +908,7 @@ for (zap_cursor_init(&zc, os, zapobj); (err = zap_cursor_retrieve(&zc, za)) == 0; zap_cursor_advance(&zc)) { - if (za->za_first_integer == value) { + if (ZFS_DIRENT_OBJ(za->za_first_integer) == value) { (void) strcpy(name, za->za_name); break; } ==== //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c#2 (text+ko) ==== @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include ==== //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c#2 (text+ko) ==== @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include ==== //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c#4 (text+ko) ==== >>> TRUNCATED FOR MAIL (1000 lines) <<<