Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 May 2003 01:13:37 -0700 (PDT)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 31056 for review
Message-ID:  <200305130813.h4D8Dbd4086318@repoman.freebsd.org>

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

Change 31056 by marcel@marcel_nfs on 2003/05/13 01:13:09

	Do not lazily allocate region IDs. It creates a race for SMP
	kernels and adds needless tests on the critial path. Allocate
	all RIDs when the pmap is created.

Affected files ...

.. //depot/projects/ia64_epc/sys/ia64/ia64/pmap.c#11 edit

Differences ...

==== //depot/projects/ia64_epc/sys/ia64/ia64/pmap.c#11 (text+ko) ====

@@ -640,6 +640,7 @@
 {
 	int rid;
 
+	mtx_lock(&pmap_ridmutex);
 	if (pmap_ridcount == pmap_ridmax)
 		panic("pmap_allocate_rid: All Region IDs used");
 
@@ -648,6 +649,7 @@
 	} while (pmap_ridbusy[rid / 64] & (1L << (rid & 63)));
 	pmap_ridbusy[rid / 64] |= (1L << (rid & 63));
 	pmap_ridcount++;
+	mtx_unlock(&pmap_ridmutex);
 
 	return rid;
 }
@@ -661,33 +663,6 @@
 	mtx_unlock(&pmap_ridmutex);
 }
 
-static void
-pmap_ensure_rid(pmap_t pmap, vm_offset_t va)
-{
-	int rr;
-
-	rr = va >> 61;
-
-	/*
-	 * We get called for virtual addresses that may just as well be
-	 * kernel addresses (ie region 5, 6 or 7). Since the pm_rid field
-	 * only holds region IDs for user regions, we have to make sure
-	 * the region is within bounds.
-	 */
-	if (rr >= 5)
-		return;
-
-	if (pmap->pm_rid[rr])
-		return;
-
-	mtx_lock(&pmap_ridmutex);
-	pmap->pm_rid[rr] = pmap_allocate_rid();
-	if (pmap == PCPU_GET(current_pmap))
-		ia64_set_rr(IA64_RR_BASE(rr),
-			    (pmap->pm_rid[rr] << 8)|(PAGE_SHIFT << 2)|1);
-	mtx_unlock(&pmap_ridmutex);
-}
-
 /***************************************************
  * Low level helper routines.....
  ***************************************************/
@@ -847,6 +822,10 @@
 void
 pmap_pinit2(struct pmap *pmap)
 {
+	int i;
+
+	for (i = 0; i < 5; i++)
+		pmap->pm_rid[i] = pmap_allocate_rid();
 }
 
 /***************************************************
@@ -1642,8 +1621,6 @@
 	if (pmap == NULL)
 		return;
 
-	pmap_ensure_rid(pmap, va);
-
 	oldpmap = pmap_install(pmap);
 
 	va &= ~PAGE_MASK;
@@ -1760,8 +1737,6 @@
 	struct ia64_lpte *pte;
 	pmap_t oldpmap;
 
-	pmap_ensure_rid(pmap, va);
-
 	oldpmap = pmap_install(pmap);
 
 	pte = pmap_find_pte(va);



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