Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Aug 2012 16:55:39 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r239681 - in head/sys/mips: include mips
Message-ID:  <201208251655.q7PGtdn4067300@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: alc
Date: Sat Aug 25 16:55:38 2012
New Revision: 239681
URL: http://svn.freebsd.org/changeset/base/239681

Log:
  Retire PV_TABLE_MOD.  When we destroy or write protect a dirty mapping,
  we call vm_page_dirty().  Maintaining the PV_TABLE_MOD flag, in addition,
  serves no useful purpose.

Modified:
  head/sys/mips/include/pmap.h
  head/sys/mips/mips/pmap.c

Modified: head/sys/mips/include/pmap.h
==============================================================================
--- head/sys/mips/include/pmap.h	Sat Aug 25 13:15:44 2012	(r239680)
+++ head/sys/mips/include/pmap.h	Sat Aug 25 16:55:38 2012	(r239681)
@@ -73,7 +73,6 @@ struct md_page {
 	TAILQ_HEAD(, pv_entry) pv_list;
 };
 
-#define	PV_TABLE_MOD		0x01	/* modified */
 #define	PV_TABLE_REF		0x02	/* referenced */
 
 #define	ASID_BITS		8

Modified: head/sys/mips/mips/pmap.c
==============================================================================
--- head/sys/mips/mips/pmap.c	Sat Aug 25 13:15:44 2012	(r239680)
+++ head/sys/mips/mips/pmap.c	Sat Aug 25 16:55:38 2012	(r239681)
@@ -195,7 +195,7 @@ static int _pmap_unwire_pte_hold(pmap_t 
 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags);
 static vm_page_t _pmap_allocpte(pmap_t pmap, unsigned ptepindex, int flags);
 static int pmap_unuse_pt(pmap_t, vm_offset_t, pd_entry_t);
-static pt_entry_t init_pte_prot(vm_page_t m, vm_prot_t prot);
+static pt_entry_t init_pte_prot(vm_page_t m, vm_prot_t access, vm_prot_t prot);
 
 #ifdef SMP
 static void pmap_invalidate_page_action(void *arg);
@@ -1431,12 +1431,10 @@ pmap_pv_reclaim(pmap_t locked_pmap)
 					vm_page_dirty(m);
 				if (m->md.pv_flags & PV_TABLE_REF)
 					vm_page_aflag_set(m, PGA_REFERENCED);
+				m->md.pv_flags &= ~PV_TABLE_REF;
 				TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
-				if (TAILQ_EMPTY(&m->md.pv_list)) {
+				if (TAILQ_EMPTY(&m->md.pv_list))
 					vm_page_aflag_clear(m, PGA_WRITEABLE);
-					m->md.pv_flags &= ~(PV_TABLE_REF |
-					    PV_TABLE_MOD);
-				}
 				pc->pc_map[field] |= 1UL << bit;
 				pmap_unuse_pt(pmap, va, *pde);
 				freed++;
@@ -1705,7 +1703,7 @@ pmap_remove_pte(struct pmap *pmap, pt_en
 		}
 		if (m->md.pv_flags & PV_TABLE_REF)
 			vm_page_aflag_set(m, PGA_REFERENCED);
-		m->md.pv_flags &= ~(PV_TABLE_REF | PV_TABLE_MOD);
+		m->md.pv_flags &= ~PV_TABLE_REF;
 
 		pmap_remove_entry(pmap, m, va);
 	}
@@ -1877,7 +1875,7 @@ pmap_remove_all(vm_page_t m)
 	}
 
 	vm_page_aflag_clear(m, PGA_WRITEABLE);
-	m->md.pv_flags &= ~(PV_TABLE_REF | PV_TABLE_MOD);
+	m->md.pv_flags &= ~PV_TABLE_REF;
 	rw_wunlock(&pvh_global_lock);
 }
 
@@ -1936,7 +1934,6 @@ pmap_protect(pmap_t pmap, vm_offset_t sv
 			if (page_is_managed(pa) && pte_test(&pbits, PTE_D)) {
 				m = PHYS_TO_VM_PAGE(pa);
 				vm_page_dirty(m);
-				m->md.pv_flags &= ~PV_TABLE_MOD;
 			}
 			pte_clear(&pbits, PTE_D);
 			pte_set(&pbits, PTE_RO);
@@ -2082,8 +2079,8 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 
 validate:
 	if ((access & VM_PROT_WRITE) != 0)
-		m->md.pv_flags |= PV_TABLE_MOD | PV_TABLE_REF;
-	rw = init_pte_prot(m, prot);
+		m->md.pv_flags |= PV_TABLE_REF;
+	rw = init_pte_prot(m, access, prot);
 
 #ifdef PMAP_DEBUG
 	printf("pmap_enter:  va: %p -> pa: %p\n", (void *)va, (void *)pa);
@@ -2114,8 +2111,7 @@ validate:
 			if (page_is_managed(opa) && (opa != pa)) {
 				if (om->md.pv_flags & PV_TABLE_REF)
 					vm_page_aflag_set(om, PGA_REFERENCED);
-				om->md.pv_flags &=
-				    ~(PV_TABLE_REF | PV_TABLE_MOD);
+				om->md.pv_flags &= ~PV_TABLE_REF;
 			}
 			if (pte_test(&origpte, PTE_D)) {
 				KASSERT(!pte_test(&origpte, PTE_RO),
@@ -2751,7 +2747,6 @@ pmap_remove_write(vm_page_t m)
 		if (pte_test(&pbits, PTE_D)) {
 			pte_clear(&pbits, PTE_D);
 			vm_page_dirty(m);
-			m->md.pv_flags &= ~PV_TABLE_MOD;
 		}
 		pte_set(&pbits, PTE_RO);
 		if (pbits != *pte) {
@@ -2808,10 +2803,7 @@ pmap_is_modified(vm_page_t m)
 	    (m->aflags & PGA_WRITEABLE) == 0)
 		return (FALSE);
 	rw_wlock(&pvh_global_lock);
-	if (m->md.pv_flags & PV_TABLE_MOD)
-		rv = TRUE;
-	else
-		rv = pmap_testbit(m, PTE_D);
+	rv = pmap_testbit(m, PTE_D);
 	rw_wunlock(&pvh_global_lock);
 	return (rv);
 }
@@ -2876,7 +2868,6 @@ pmap_clear_modify(vm_page_t m)
 		}
 		PMAP_UNLOCK(pmap);
 	}
-	m->md.pv_flags &= ~PV_TABLE_MOD;
 	rw_wunlock(&pvh_global_lock);
 }
 
@@ -3259,14 +3250,14 @@ page_is_managed(vm_paddr_t pa)
 }
 
 static pt_entry_t
-init_pte_prot(vm_page_t m, vm_prot_t prot)
+init_pte_prot(vm_page_t m, vm_prot_t access, vm_prot_t prot)
 {
 	pt_entry_t rw;
 
 	if (!(prot & VM_PROT_WRITE))
 		rw = PTE_V | PTE_RO;
 	else if ((m->oflags & VPO_UNMANAGED) == 0) {
-		if ((m->md.pv_flags & PV_TABLE_MOD) != 0)
+		if ((access & VM_PROT_WRITE) != 0)
 			rw = PTE_V | PTE_D;
 		else
 			rw = PTE_V;
@@ -3318,7 +3309,7 @@ pmap_emulate_modified(pmap_t pmap, vm_of
 	if (!page_is_managed(pa))
 		panic("pmap_emulate_modified: unmanaged page");
 	m = PHYS_TO_VM_PAGE(pa);
-	m->md.pv_flags |= (PV_TABLE_REF | PV_TABLE_MOD);
+	m->md.pv_flags |= PV_TABLE_REF;
 	PMAP_UNLOCK(pmap);
 	return (0);
 }



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