Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Apr 2013 07:45:27 +0000 (UTC)
From:      "Cherry G. Mathew" <cherry@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r249539 - projects/amd64_xen_pv/sys/amd64/xen
Message-ID:  <201304160745.r3G7jRZA054489@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cherry
Date: Tue Apr 16 07:45:27 2013
New Revision: 249539
URL: http://svnweb.freebsd.org/changeset/base/249539

Log:
  	- change pmap_put_pv_entry() to return false on duplicates.
  	- Do not track kernel pv entries.
  
  Approved by: gibbs(implicit)

Modified:
  projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.c
  projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.h

Modified: projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.c
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.c	Tue Apr 16 07:11:52 2013	(r249538)
+++ projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.c	Tue Apr 16 07:45:27 2013	(r249539)
@@ -239,6 +239,8 @@ pmap_get_pv_entry(pmap_t pmap)
 	struct pv_chunk *pc;
 	vm_page_t m;
 
+	KASSERT(pmap != kernel_pmap,
+		("Trying to track kernel va"));
 	rw_assert(&pvh_global_lock, RA_LOCKED);
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 	PV_STAT(atomic_add_long(&pv_entry_allocs, 1));
@@ -310,7 +312,7 @@ pmap_get_pv_entry(pmap_t pmap)
 	return (pv);
 }
 
-void
+bool
 pmap_put_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
 {
 	pv_entry_t pv;
@@ -320,11 +322,18 @@ pmap_put_pv_entry(pmap_t pmap, vm_offset
 		("Tried to manage an unmanaged page!"));
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 
+	if (pmap_find_pv_entry(pmap, va, m)) {
+		return false; /* Duplicate */
+	}
+
 	rw_rlock(&pvh_global_lock);
-	pv = pmap_get_pv_entry(pmap);
-	pv->pv_va = va;
-	TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
+	if (pmap != kernel_pmap) {
+		pv = pmap_get_pv_entry(pmap);
+		pv->pv_va = va;
+		TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
+	}
 	rw_runlock(&pvh_global_lock);
+	return true;
 }
 
 
@@ -335,6 +344,8 @@ pmap_free_pv_entry(pmap_t pmap, vm_offse
 	pv_entry_t pv;
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+	if (pmap == kernel_pmap) return true;
+
 	rw_rlock(&pvh_global_lock);
 
 	TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
@@ -357,6 +368,7 @@ pmap_find_pv_entry(pmap_t pmap, vm_offse
 	pv_entry_t pv = NULL;
 
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+	if (pmap == kernel_pmap) return NULL;
 	rw_rlock(&pvh_global_lock);
 
 	TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
@@ -439,6 +451,7 @@ pmap_pv_vm_page_to_v(pmap_t pmap, vm_pag
 bool
 pmap_pv_vm_page_mapped(pmap_t pmap, vm_page_t m)
 {
+	if (pmap == kernel_pmap) return true;
 	return (pmap_pv_vm_page_to_v(pmap, m) == 
 		(VM_MAX_KERNEL_ADDRESS + 1)) ? false : true;
 

Modified: projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.h
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.h	Tue Apr 16 07:11:52 2013	(r249538)
+++ projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.h	Tue Apr 16 07:45:27 2013	(r249539)
@@ -48,7 +48,7 @@ void pmap_pv_vm_page_init(vm_page_t m);
 vm_offset_t pmap_pv_vm_page_to_v(pmap_t pmap, vm_page_t m);
 bool pmap_pv_vm_page_mapped(pmap_t pmap, vm_page_t m);
 pv_entry_t pmap_get_pv_entry(pmap_t pmap);
-void pmap_put_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
+bool pmap_put_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
 bool pmap_free_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
 pv_entry_t pmap_find_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
 int pmap_pv_iterate(vm_page_t m, pv_cb_t cb);



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