svn commit: r334400 - head/sys/i386/i386
Konstantin Belousov
kib at FreeBSD.org
Wed May 30 20:43:49 UTC 2018
Author: kib
Date: Wed May 30 20:43:48 2018
New Revision: 334400
URL: https://svnweb.freebsd.org/changeset/base/334400
Log:
Extract code for fast mapping of pte from pmap_extract_and_hold()
into the helper function pmap_pte_ufast().
Benchmarked by: bde
Tested by: pho
Sponsored by: The FreeBSD Foundation
Modified:
head/sys/i386/i386/pmap.c
Modified: head/sys/i386/i386/pmap.c
==============================================================================
--- head/sys/i386/i386/pmap.c Wed May 30 20:39:22 2018 (r334399)
+++ head/sys/i386/i386/pmap.c Wed May 30 20:43:48 2018 (r334400)
@@ -1598,6 +1598,26 @@ pmap_pte_quick3(pmap_t pmap, vm_offset_t va)
return (0);
}
+static pt_entry_t
+pmap_pte_ufast(pmap_t pmap, vm_offset_t va, pd_entry_t pde)
+{
+ pt_entry_t *eh_ptep, pte, *ptep;
+
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+ pde &= PG_FRAME;
+ critical_enter();
+ eh_ptep = (pt_entry_t *)PCPU_GET(pmap_eh_ptep);
+ if ((*eh_ptep & PG_FRAME) != pde) {
+ *eh_ptep = pde | PG_RW | PG_V | PG_A | PG_M;
+ invlcaddr((void *)PCPU_GET(pmap_eh_va));
+ }
+ ptep = (pt_entry_t *)PCPU_GET(pmap_eh_va) + (i386_btop(va) &
+ (NPTEPG - 1));
+ pte = *ptep;
+ critical_exit();
+ return (pte);
+}
+
/*
* Routine: pmap_extract
* Function:
@@ -1637,8 +1657,8 @@ pmap_extract(pmap_t pmap, vm_offset_t va)
vm_page_t
pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
{
- pd_entry_t pde, newpf;
- pt_entry_t *eh_ptep, pte, *ptep;
+ pd_entry_t pde;
+ pt_entry_t pte;
vm_page_t m;
vm_paddr_t pa;
@@ -1658,17 +1678,7 @@ retry:
vm_page_hold(m);
}
} else {
- newpf = pde & PG_FRAME;
- critical_enter();
- eh_ptep = (pt_entry_t *)PCPU_GET(pmap_eh_ptep);
- if ((*eh_ptep & PG_FRAME) != newpf) {
- *eh_ptep = newpf | PG_RW | PG_V | PG_A | PG_M;
- invlcaddr((void *)PCPU_GET(pmap_eh_va));
- }
- ptep = (pt_entry_t *)PCPU_GET(pmap_eh_va) +
- (i386_btop(va) & (NPTEPG - 1));
- pte = *ptep;
- critical_exit();
+ pte = pmap_pte_ufast(pmap, va, pde);
if (pte != 0 &&
((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) {
if (vm_page_pa_tryrelock(pmap, pte & PG_FRAME,
More information about the svn-src-head
mailing list