git: 026f9acc3831 - stable/13 - pmap: Micro-optimize pmap_remove_pages() on amd64 and arm64

Mark Johnston markj at FreeBSD.org
Wed Sep 1 13:31:12 UTC 2021


The branch stable/13 has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=026f9acc383102202b42e411f594f1bc7889ac04

commit 026f9acc383102202b42e411f594f1bc7889ac04
Author:     Alan Cox <alc at FreeBSD.org>
AuthorDate: 2021-07-12 23:25:37 +0000
Commit:     Mark Johnston <markj at FreeBSD.org>
CommitDate: 2021-09-01 13:29:01 +0000

    pmap: Micro-optimize pmap_remove_pages() on amd64 and arm64
    
    Reduce the live ranges for three variables so that they do not span the
    call to PHYS_TO_VM_PAGE().  This enables the compiler to generate
    slightly smaller machine code.
    
    Reviewed by:    kib, markj
    
    (cherry picked from commit d411b285bc293a37e062d8fb15b85212ce16abab)
---
 sys/amd64/amd64/pmap.c | 14 ++++++++++----
 sys/arm64/arm64/pmap.c | 19 ++++++++++---------
 2 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index b920426e6996..b9a83cd8bbad 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -8158,6 +8158,16 @@ pmap_remove_pages(pmap_t pmap)
 					continue;
 				}
 
+				/* Mark free */
+				pc->pc_map[field] |= bitmask;
+
+				/*
+				 * Because this pmap is not active on other
+				 * processors, the dirty bit cannot have
+				 * changed state since we last loaded pte.
+				 */
+				pte_clear(pte);
+
 				if (superpage)
 					pa = tpte & PG_PS_FRAME;
 				else
@@ -8174,8 +8184,6 @@ pmap_remove_pages(pmap_t pmap)
 				    ("pmap_remove_pages: bad tpte %#jx",
 				    (uintmax_t)tpte));
 
-				pte_clear(pte);
-
 				/*
 				 * Update the vm_page_t clean/reference bits.
 				 */
@@ -8189,8 +8197,6 @@ pmap_remove_pages(pmap_t pmap)
 
 				CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m);
 
-				/* Mark free */
-				pc->pc_map[field] |= bitmask;
 				if (superpage) {
 					pmap_resident_count_adj(pmap, -NBPDR / PAGE_SIZE);
 					pvh = pa_to_pvh(tpte & PG_PS_FRAME);
diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c
index f0419beace37..1ae6d87dee51 100644
--- a/sys/arm64/arm64/pmap.c
+++ b/sys/arm64/arm64/pmap.c
@@ -5182,6 +5182,16 @@ pmap_remove_pages(pmap_t pmap)
 					continue;
 				}
 
+				/* Mark free */
+				pc->pc_map[field] |= bitmask;
+
+				/*
+				 * Because this pmap is not active on other
+				 * processors, the dirty bit cannot have
+				 * changed state since we last loaded pte.
+				 */
+				pmap_clear(pte);
+
 				pa = tpte & ~ATTR_MASK;
 
 				m = PHYS_TO_VM_PAGE(pa);
@@ -5195,13 +5205,6 @@ pmap_remove_pages(pmap_t pmap)
 				    ("pmap_remove_pages: bad pte %#jx",
 				    (uintmax_t)tpte));
 
-				/*
-				 * Because this pmap is not active on other
-				 * processors, the dirty bit cannot have
-				 * changed state since we last loaded pte.
-				 */
-				pmap_clear(pte);
-
 				/*
 				 * Update the vm_page_t clean/reference bits.
 				 */
@@ -5219,8 +5222,6 @@ pmap_remove_pages(pmap_t pmap)
 
 				CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m);
 
-				/* Mark free */
-				pc->pc_map[field] |= bitmask;
 				switch (lvl) {
 				case 1:
 					pmap_resident_count_dec(pmap,


More information about the dev-commits-src-all mailing list