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