Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 3 Apr 2006 20:06:25 GMT
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 94554 for review
Message-ID:  <200604032006.k33K6Pai046923@repoman.freebsd.org>

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

Change 94554 by peter@peter_daintree on 2006/04/03 20:05:29

	Reimplement alc@'s changes for soft-failing pv entry allocation in
	things like pmap_copy().  Add a 'try' arg to get_pv_entry() so that
	it will quietly fail (instead of panicing) and won't call
	pmap_collect() either.

Affected files ...

.. //depot/projects/hammer/sys/amd64/amd64/pmap.c#149 edit

Differences ...

==== //depot/projects/hammer/sys/amd64/amd64/pmap.c#149 (text+ko) ====

@@ -205,7 +205,7 @@
 static caddr_t crashdumpmap;
 
 static void	free_pv_entry(pmap_t pmap, pv_entry_t pv);
-static pv_entry_t get_pv_entry(pmap_t locked_pmap);
+static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try);
 static void	pmap_clear_ptes(vm_page_t m, long bit);
 
 static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq,
@@ -1463,7 +1463,7 @@
 static uint64_t pc_freemask[3] = { PC_FREE0, PC_FREE1, PC_FREE2 };
 
 #ifdef PV_STATS
-static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees;
+static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
 
 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
 	"Current number of pv entry chunks");
@@ -1471,6 +1471,8 @@
 	"Current number of pv entry chunks allocated");
 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
 	"Current number of pv entry chunks frees");
+SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
+	"Number of times tried to get a chunk page but failed.");
 
 static int pv_entry_frees, pv_entry_allocs, pv_entry_spare;
 
@@ -1586,7 +1588,7 @@
  * when needed.
  */
 static pv_entry_t
-get_pv_entry(pmap_t pmap)
+get_pv_entry(pmap_t pmap, int try)
 {
 	static const struct timeval printinterval = { 60, 0 };
 	static struct timeval lastprint;
@@ -1626,6 +1628,10 @@
 	/* No free items, allocate another chunk */
 	m = vm_page_alloc(NULL, colour, VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ);
 	if (m == NULL) {
+		if (try) {
+			PV_STAT(pc_chunk_tryfail++);
+			return (NULL);
+		}
 		/*
 		 * Reclaim pv entries: At first, destroy mappings to inactive
 		 * pages.  After that, if a pv chunk entry is still needed,
@@ -1690,11 +1696,10 @@
 {
 	pv_entry_t pv;
 
-	pv = get_pv_entry(pmap);
-	pv->pv_va = va;
-
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	pv = get_pv_entry(pmap, FALSE);
+	pv->pv_va = va;
 	TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
 	m->md.pv_list_count++;
 }
@@ -1710,11 +1715,8 @@
 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
 	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
 	if (pv_entry_count < pv_entry_high_water && 
-	    (pv = uma_zalloc(pvzone, M_NOWAIT)) != NULL) {
-		pv_entry_count++;
+	    (pv = get_pv_entry(pmap, TRUE)) != NULL) {
 		pv->pv_va = va;
-		pv->pv_pmap = pmap;
-		TAILQ_INSERT_TAIL(&pmap->pm_pvlist, pv, pv_plist);
 		TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
 		m->md.pv_list_count++;
 		return (TRUE);



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