svn commit: r254901 - head/sys/arm/arm

Andrew Turner andrew at FreeBSD.org
Mon Aug 26 10:25:00 UTC 2013


Author: andrew
Date: Mon Aug 26 10:24:59 2013
New Revision: 254901
URL: http://svnweb.freebsd.org/changeset/base/254901

Log:
  Revert r251370 as it contains a deadlock.

Modified:
  head/sys/arm/arm/pmap-v6.c

Modified: head/sys/arm/arm/pmap-v6.c
==============================================================================
--- head/sys/arm/arm/pmap-v6.c	Mon Aug 26 09:52:05 2013	(r254900)
+++ head/sys/arm/arm/pmap-v6.c	Mon Aug 26 10:24:59 2013	(r254901)
@@ -2944,126 +2944,6 @@ void
 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr,
     vm_size_t len, vm_offset_t src_addr)
 {
-	struct l2_bucket *l2b_src, *l2b_dst;
-	struct pv_entry *pve;
-	vm_offset_t addr;
-	vm_offset_t end_addr;
-	vm_offset_t next_bucket;
-	u_int flags;
-	boolean_t l2b_alloc;
-
-	CTR4(KTR_PMAP, "%s: VA = 0x%08x, len = 0x%08x. Will %s\n", __func__,
-	    src_addr, len, (dst_addr != src_addr) ? "exit" : "copy");
-
-	if (dst_addr != src_addr)
-		return;
-
-	rw_wlock(&pvh_global_lock);
-	if (dst_pmap < src_pmap) {
-		PMAP_LOCK(dst_pmap);
-		PMAP_LOCK(src_pmap);
-	} else {
-		PMAP_LOCK(src_pmap);
-		PMAP_LOCK(dst_pmap);
-	}
-
-	end_addr = src_addr + len;
-	addr = src_addr;
-	/*
-	 * Iterate through all used l2_buckets in a given range.
-	 */
-	while (addr < end_addr) {
-		pt_entry_t *src_ptep, *dst_ptep;
-		pt_entry_t src_pte;
-
-		next_bucket = L2_NEXT_BUCKET(addr);
-		/*
-		 * If the next bucket VA is out of the
-		 * copy range then set it to end_addr in order
-		 * to copy all mappings until the given limit.
-		 */ 
-		if (next_bucket > end_addr)
-			next_bucket = end_addr;
-
-		l2b_src = pmap_get_l2_bucket(src_pmap, addr);
-		if (l2b_src == NULL) {
-			addr = next_bucket;
-			continue;
-		}
-		src_ptep = &l2b_src->l2b_kva[l2pte_index(addr)];
-
-		while (addr < next_bucket) {
-			vm_page_t srcmpte;
-
-			src_pte = *src_ptep;
-			srcmpte = PHYS_TO_VM_PAGE(l2pte_pa(src_pte));
-			/*
-			 * We only virtual copy managed pages
-			 */
-			if (srcmpte && (srcmpte->oflags & VPO_UNMANAGED) == 0) {
-				l2b_alloc = FALSE;
-				l2b_dst = pmap_get_l2_bucket(dst_pmap, addr);
-				/*
-				 * Check if the allocation of another
-				 * l2_bucket is necessary.
-				 */
-				if (l2b_dst == NULL) {
-					l2b_dst = pmap_alloc_l2_bucket(dst_pmap,
-					    addr);
-					l2b_alloc = TRUE;
-				}
-				if (l2b_dst == NULL)
-					goto out;
-
-				dst_ptep = &l2b_dst->l2b_kva[l2pte_index(addr)];
-
-				if (*dst_ptep == 0 &&
-				    (pve = pmap_get_pv_entry(dst_pmap, TRUE))) {
-					/*
-					 * Check whether the source mapping is
-					 * writable and set the proper flag
-					 * for a copied mapping so that right
-					 * permissions could be set on the
-					 * access fault.
-					 */
-					flags = 0;
-					if ((src_pte & L2_APX) == 0)
-						flags = PVF_WRITE;
-					pmap_enter_pv(srcmpte, pve, dst_pmap,
-					    addr, flags);
-					/*
-					 * Clear the modified and
-					 * accessed (referenced) flags
-					 * and don't set the wired flag
-					 * during the copy.
-					 */
-					*dst_ptep = src_pte;
-					*dst_ptep &= ~L2_S_REF;
-					*dst_ptep |= L2_APX;
-					/*
-					 * Update stats
-					 */
-					l2b_dst->l2b_occupancy++;
-					dst_pmap->pm_stats.resident_count++;
-				} else {
-					/*
-					 * If the l2_bucket was acquired as
-					 * a result of allocation then free it.
-					 */
-					if (l2b_alloc)
-						pmap_free_l2_bucket(dst_pmap,
-						    l2b_dst, 1);
-					goto out;
-				}
-			}
-			addr += PAGE_SIZE;
-			src_ptep++;
-		}
-	}
-out:
-	rw_wunlock(&pvh_global_lock);
-	PMAP_UNLOCK(src_pmap);
-	PMAP_UNLOCK(dst_pmap);
 }
 
 


More information about the svn-src-head mailing list