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
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D31161
This commit is contained in:
Alan Cox 2021-07-12 18:25:37 -05:00
parent 4a9a41650c
commit d411b285bc
2 changed files with 20 additions and 13 deletions

View File

@ -8201,6 +8201,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
@ -8217,8 +8227,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.
*/
@ -8232,8 +8240,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);

View File

@ -4951,6 +4951,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);
@ -4964,13 +4974,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.
*/
@ -4988,8 +4991,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,