Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Mar 2013 13:10:51 +0000 (UTC)
From:      "Cherry G. Mathew" <cherry@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r248202 - projects/amd64_xen_pv/sys/amd64/xen
Message-ID:  <201303121310.r2CDApiT085314@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cherry
Date: Tue Mar 12 13:10:51 2013
New Revision: 248202
URL: http://svnweb.freebsd.org/changeset/base/248202

Log:
  Add two functions to free and to find existing PV entries.
  Do not use the DMAP va for pc allocation - it is read-only.
  
  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 Mar 12 13:03:31 2013	(r248201)
+++ projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.c	Tue Mar 12 13:10:51 2013	(r248202)
@@ -87,7 +87,7 @@ __FBSDID("$FreeBSD$");
 /*
  * This file contains the amd64 physical->virtual mapping management code.
  * This code used to reside in pmap.c previously and has been excised
- * out to make things a bit more modularised.
+ * to make things a bit more modularised.
  */
 
 #include <sys/param.h>
@@ -135,6 +135,8 @@ static TAILQ_HEAD(pch, pv_chunk) pv_chun
 static struct mtx pv_chunks_mutex;
 static struct rwlock pv_list_locks[NPV_LIST_LOCKS];
 
+vm_map_t	pv_map; /* Kernel submap for pc chunk alloc */
+
 /***************************************************
  * page management routines.
  ***************************************************/
@@ -164,6 +166,8 @@ pv_to_chunk(pv_entry_t pv)
  *
  */
 
+#include <vm/vm_extern.h>
+#include <vm/vm_kern.h>
 pv_entry_t
 pmap_get_pv_entry(pmap_t pmap)
 {
@@ -210,7 +214,15 @@ pmap_get_pv_entry(pmap_t pmap)
 	PV_STAT(atomic_add_int(&pc_chunk_allocs, 1));
 	dump_add_page(VM_PAGE_TO_PHYS(m));
 
-	pc = (void *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
+	if (!gdtset) {
+		/* pmap_init() has not been run yet - use the kernel_map */
+		pc = (void *) kmem_alloc_nofault(kernel_map, PAGE_SIZE);
+	}
+	else {
+		pc = (void *) kmem_alloc_nofault(pv_map, PAGE_SIZE);
+	}
+
+	KASSERT(pc != NULL, ("Failed to allocate VA for pv chunk\n"));
 
 	/* 
 	 * DMAP entries are kernel only, and don't need tracking, so
@@ -218,6 +230,7 @@ pmap_get_pv_entry(pmap_t pmap)
 	 */
 	pmap_kenter_ma((vm_offset_t)pc, xpmap_ptom(VM_PAGE_TO_PHYS(m)));
 
+
 	pc->pc_pmap = pmap;
 	pc->pc_map[0] = PC_FREE0 & ~1ul;	/* preallocated bit 0 */
 	pc->pc_map[1] = PC_FREE1;
@@ -240,7 +253,7 @@ pmap_put_pv_entry(pmap_t pmap, vm_offset
 	pv_entry_t pv;
 
 	KASSERT(m != NULL, ("Invalid page"));
-	pa = VM_PAGE_TO_PHYS(m);
+	pa = VM_PAGE_TO_PHYS(m); /* XXX: What's this for ? */
 
 //	if ((m->oflags & VPO_UNMANAGED) == 0) { /* XXX: exclude
 //	unmanaged */
@@ -255,6 +268,51 @@ pmap_put_pv_entry(pmap_t pmap, vm_offset
 //	}
 }
 
+
+bool
+pmap_free_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
+{
+	bool found = false;
+	pv_entry_t pv;
+
+	PMAP_LOCK(pmap);
+	rw_rlock(&pvh_global_lock);
+
+	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
+		if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
+			TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
+			found = true;
+			break;
+		}
+	}
+
+	rw_runlock(&pvh_global_lock);
+	PMAP_UNLOCK(pmap);
+	return found;
+}
+
+/* Find an existing p->v mapping. Returns NULL if nonexistent */
+pv_entry_t
+pmap_find_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
+{
+	pv_entry_t pv = NULL;
+
+	PMAP_LOCK(pmap);
+	rw_rlock(&pvh_global_lock);
+
+	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
+		if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
+			break;
+		}
+	}
+
+	rw_runlock(&pvh_global_lock);
+	PMAP_UNLOCK(pmap);
+	return pv;
+
+}
+
+
 /* This function may be called after pmap_pv_pmap_init() */
 void
 pmap_pv_init(void)

Modified: projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.h
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.h	Tue Mar 12 13:03:31 2013	(r248201)
+++ projects/amd64_xen_pv/sys/amd64/xen/pmap_pv.h	Tue Mar 12 13:10:51 2013	(r248202)
@@ -43,5 +43,7 @@ vm_offset_t pmap_pv_vm_page_to_v(pmap_t 
 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_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);
 
 #endif /* !_MACHINE_PMAP_PV_H_ */



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