PERFORCE change 118769 for review

Matt Jacob mjacob at FreeBSD.org
Wed Apr 25 04:58:55 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=118769

Change 118769 by mjacob at 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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 .... <THUNK!>" */
-	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 <sys/cdefs.h>
-__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 <sys/param.h>
 
@@ -39,20 +39,13 @@
 #include <sys/taskqueue.h>
 #include <sys/lock.h>
 #include <sys/mutex.h>
-#endif /* _KERNEL */
-
+#include <sys/conf.h>
 #include <sys/devicestat.h>
-#include <sys/conf.h>
 #include <sys/eventhandler.h>
 #include <sys/malloc.h>
 #include <sys/cons.h>
-
-#include <machine/md_var.h>
-
-#include <vm/vm.h>
-#include <vm/pmap.h>
-
 #include <geom/geom_disk.h>
+#endif /* _KERNEL */
 
 #ifndef _KERNEL
 #include <stdio.h>

==== //depot/projects/mjexp/sys/compat/linprocfs/linprocfs.c#11 (text+ko) ====

@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__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 <sys/param.h>
 #include <sys/queue.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/param.h>
 #include <sys/kernel.h>
 #include <sys/libkern.h>
 #include <sys/misc.h>
+#include <sys/sunddi.h>
 
 char hw_serial[11] = "0";
 

==== //depot/projects/mjexp/sys/compat/opensolaris/kern/opensolaris_vfs.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__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 <sys/param.h>
 #include <sys/kernel.h>
@@ -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 <sys/dsl_synctask.h>
 #include <sys/fs/zfs.h>
 #include <sys/callb.h>
+#include <sys/sunddi.h>
 
 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 <sys/vdev_impl.h>
 #include <sys/zfs_ioctl.h>
 #include <sys/utsname.h>
+#include <sys/sunddi.h>
 #ifdef _KERNEL
 #include <sys/kobj.h>
 #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 <sys/refcount.h>
 #include <sys/zap_impl.h>
 #include <sys/zap_leaf.h>
+#include <sys/zfs_znode.h>
 
 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 <sys/unistd.h>
 #include <sys/sdt.h>
 #include <sys/fs/zfs.h>
+#include <sys/policy.h>
 #include <sys/zfs_znode.h>
 #include <sys/zfs_acl.h>
 #include <sys/zfs_dir.h>

==== //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c#2 (text+ko) ====

@@ -41,6 +41,7 @@
 #include <sys/stat.h>
 #include <sys/unistd.h>
 #include <sys/random.h>
+#include <sys/policy.h>
 #include <sys/kcondvar.h>
 #include <sys/callb.h>
 #include <sys/smp.h>

==== //depot/projects/mjexp/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c#4 (text+ko) ====


>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list