Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 May 2006 05:22:00 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 97665 for review
Message-ID:  <200605230522.k4N5M00L003805@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=97665

Change 97665 by kmacy@kmacy_storage:sun4v_work on 2006/05/23 05:21:02

	don't lose track of the referenced bit in pmap_enter
	only invalidate in pmap_remove if a page is referenced or modified

Affected files ...

.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/pmap.c#56 edit

Differences ...

==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/pmap.c#56 (text+ko) ====

@@ -169,7 +169,7 @@
 #ifdef PMAP_DEBUG
 #define KDPRINTF if (pmap_debug) printf
 #define DPRINTF \
-	if ((PCPU_GET(curpmap)->pm_context != 0) && ((PCPU_GET(cpumask) & PCPU_GET(curpmap)->pm_active)) == 0) \
+	if (PCPU_GET(curpmap) && (PCPU_GET(curpmap)->pm_context != 0) && ((PCPU_GET(cpumask) & PCPU_GET(curpmap)->pm_active)) == 0) \
    	panic("cpumask(0x%x) & active (0x%x) == 0 pid == %d\n",  \
 	      PCPU_GET(cpumask), PCPU_GET(curpmap)->pm_active, curthread->td_proc->p_pid); \
 if (pmap_debug) printf
@@ -960,8 +960,8 @@
 		tte_data |= TTE_KERNEL_MINFLAGS;
 
 
-	tte_hash_insert(pmap->pm_hash, va, tte_data | TTE_MINFLAGS);
-	tsb_set_tte(&pmap->pm_tsb, va, tte_data|TTE_MINFLAGS, pmap->pm_context);
+	tte_hash_insert(pmap->pm_hash, va, tte_data|TTE_MINFLAGS|VTD_REF);
+	tsb_set_tte(&pmap->pm_tsb, va, tte_data|TTE_MINFLAGS|VTD_REF, pmap->pm_context);
 	
 	invlva = FALSE;
 	if ((otte_data & ~(VTD_W|VTD_REF)) != tte_data) {
@@ -983,7 +983,6 @@
 			}
 		}
 	} 
-
 	if (invlva)
 		pmap_invalidate_page(pmap, va, TRUE);
 
@@ -1167,7 +1166,7 @@
 		      cpumask, (1 << curcpu));
 
 #endif
-#if 0
+#ifdef notyet
 	if ((active_total = (pmap->pm_tlbactive & ~cpumask)) == 0)
 		goto done;
 
@@ -1216,6 +1215,7 @@
 
 	if (cleartsb == TRUE)
 		tsb_clear_tte(&pmap->pm_tsb, va);
+
 	DPRINTF("pmap_invalidate_page(va=0x%lx)\n", va);
 	spinlock_enter();
 	invlpg(va, pmap->pm_context);
@@ -1234,11 +1234,11 @@
 	cpumask_t active;
 #endif
 
-
 	if ((eva - sva) == PAGE_SIZE) {
 		pmap_invalidate_page(pmap, sva, cleartsb);
 		return;
 	}
+	
 
 	if (sva >= eva) 
 		panic("invalidating negative or zero range sva=0x%lx eva=0x%lx", sva, eva);
@@ -1490,7 +1490,8 @@
 		uint64_t otte_data;
 		vm_page_t m;
 
-		if ((otte_data = tte_hash_clear_bits(pmap->pm_hash, tva, (VTD_SW_W | VTD_W | VTD_REF))) == 0)
+		if ((otte_data = tte_hash_clear_bits(pmap->pm_hash, tva, 
+						     (VTD_SW_W|VTD_W|VTD_REF))) == 0)
 			continue;
 
 		if (otte_data & (VTD_SW_W | VTD_W | VTD_REF)) 
@@ -1509,7 +1510,6 @@
 			}
 		} 
 	}
-
 	if (anychanged)
 		pmap_invalidate_range(pmap, sva, eva, TRUE);
 
@@ -1534,7 +1534,6 @@
 		va += PAGE_SIZE;
 		m++;
 	}
-	
 	pmap_invalidate_range(kernel_pmap, sva, va, FALSE);
 }
 
@@ -1557,9 +1556,7 @@
 		pmap_kremove(va);
 		va += PAGE_SIZE;
 	}
-
 	pmap_invalidate_range(kernel_pmap, sva, va, TRUE);
-
 }
 
 /*
@@ -1605,13 +1602,15 @@
 		if ((tte_data = tte_hash_delete(pmap->pm_hash, tva)) == 0)
 			continue;
 		pmap_remove_tte(pmap, tte_data, tva);
-		invlva = 1;
+		if (!invlva && (tte_data & (VTD_REF|VTD_W)))
+			invlva = 1;
 	}
-	sched_unpin();
 	vm_page_unlock_queues();
-	if (invlva) 
+
+	if (invlva)
 		pmap_invalidate_range(pmap, start, end, TRUE);
 
+	sched_unpin();
 	PMAP_UNLOCK(pmap);
 
 }
@@ -1749,8 +1748,8 @@
 	}
 	tte_hash_reset(pmap->pm_hash);
 
+	pmap_invalidate_all(pmap);
 	sched_unpin();
-	pmap_invalidate_all(pmap);
 	PMAP_UNLOCK(pmap);
 	vm_page_unlock_queues();
 }
@@ -1815,7 +1814,8 @@
 	int rv;
 	pv_entry_t pv, pvf, pvn;
 	pmap_t pmap;
-	
+	tte_t otte_data;
+
 	rv = 0;
 	if (m->flags & PG_FICTITIOUS)
 		return (rv);
@@ -1835,7 +1835,8 @@
 			
                         pmap = pv->pv_pmap;
                         PMAP_LOCK(pmap);
-			if ((tte_hash_clear_bits(pmap->pm_hash, pv->pv_va, VTD_REF) & VTD_REF) != 0) {
+			otte_data = tte_hash_clear_bits(pmap->pm_hash, pv->pv_va, VTD_REF);
+			if ((otte_data & VTD_REF) != 0) {
                                 pmap_invalidate_page(pmap, pv->pv_va, TRUE);
 				
                                 rv++;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200605230522.k4N5M00L003805>