Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 22 Feb 2020 01:31:06 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r358234 - head/sys/powerpc/booke
Message-ID:  <202002220131.01M1V6pv031841@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhibbits
Date: Sat Feb 22 01:31:06 2020
New Revision: 358234
URL: https://svnweb.freebsd.org/changeset/base/358234

Log:
  powerpc/booke: Fix handling of pvh_global_lock and pmap lock
  
  ptbl_alloc() is expected to return with the pvh_global_lock and pmap
  lock held.  However, it will return with them unlocked if nosleep is
  specified.
  
  Along with this, fix lock ordering of pvh_global_lock with respect to
  the pmap lock in other places.
  
  Differential Revision: https://reviews.freebsd.org/D23692

Modified:
  head/sys/powerpc/booke/pmap.c

Modified: head/sys/powerpc/booke/pmap.c
==============================================================================
--- head/sys/powerpc/booke/pmap.c	Fri Feb 21 22:44:22 2020	(r358233)
+++ head/sys/powerpc/booke/pmap.c	Sat Feb 22 01:31:06 2020	(r358234)
@@ -705,11 +705,10 @@ ptbl_alloc(mmu_t mmu, pmap_t pmap, pte_t ** pdir, unsi
 
 	req = VM_ALLOC_NOOBJ | VM_ALLOC_WIRED;
 	while ((m = vm_page_alloc(NULL, pdir_idx, req)) == NULL) {
+		if (nosleep)
+			return (NULL);
 		PMAP_UNLOCK(pmap);
 		rw_wunlock(&pvh_global_lock);
-		if (nosleep) {
-			return (NULL);
-		}
 		vm_wait(NULL);
 		rw_wlock(&pvh_global_lock);
 		PMAP_LOCK(pmap);
@@ -905,8 +904,6 @@ ptbl_alloc(mmu_t mmu, pmap_t pmap, unsigned int pdir_i
 		pidx = (PTBL_PAGES * pdir_idx) + i;
 		while ((m = vm_page_alloc(NULL, pidx,
 		    VM_ALLOC_NOOBJ | VM_ALLOC_WIRED)) == NULL) {
-			PMAP_UNLOCK(pmap);
-			rw_wunlock(&pvh_global_lock);
 			if (nosleep) {
 				ptbl_free_pmap_ptbl(pmap, ptbl);
 				for (j = 0; j < i; j++)
@@ -914,6 +911,8 @@ ptbl_alloc(mmu_t mmu, pmap_t pmap, unsigned int pdir_i
 				vm_wire_sub(i);
 				return (NULL);
 			}
+			PMAP_UNLOCK(pmap);
+			rw_wunlock(&pvh_global_lock);
 			vm_wait(NULL);
 			rw_wlock(&pvh_global_lock);
 			PMAP_LOCK(pmap);
@@ -2481,8 +2480,8 @@ mmu_booke_enter_object(mmu_t mmu, pmap_t pmap, vm_offs
 		    PMAP_ENTER_NOSLEEP | PMAP_ENTER_QUICK_LOCKED, 0);
 		m = TAILQ_NEXT(m, listq);
 	}
-	rw_wunlock(&pvh_global_lock);
 	PMAP_UNLOCK(pmap);
+	rw_wunlock(&pvh_global_lock);
 }
 
 static void
@@ -2495,8 +2494,8 @@ mmu_booke_enter_quick(mmu_t mmu, pmap_t pmap, vm_offse
 	mmu_booke_enter_locked(mmu, pmap, va, m,
 	    prot & (VM_PROT_READ | VM_PROT_EXECUTE), PMAP_ENTER_NOSLEEP |
 	    PMAP_ENTER_QUICK_LOCKED, 0);
-	rw_wunlock(&pvh_global_lock);
 	PMAP_UNLOCK(pmap);
+	rw_wunlock(&pvh_global_lock);
 }
 
 /*



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