aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2018-05-25 16:29:22 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2018-05-25 16:29:22 +0000
commitded29bd9a578b11b61e9d1d9ddd71f77e44d9aca (patch)
tree4f5e4ac77a96ec03eb5d56f37d4f9cdb313eed4c /sys
parentfeac1d48082921a353a292f5bb9965facfbe1b20 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/i386/i386/pmap.c20
-rw-r--r--sys/i386/include/pcpu.h4
2 files changed, 19 insertions, 5 deletions
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index fd31f456b2db..a95d847cc122 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -692,6 +692,10 @@ pmap_init_reserved_pages(void)
pc->pc_copyout_saddr = kva_alloc(ptoa(2));
if (pc->pc_copyout_saddr == 0)
panic("unable to allocate sleepable copyout KVA");
+ pc->pc_pmap_eh_va = kva_alloc(ptoa(1));
+ if (pc->pc_pmap_eh_va == 0)
+ panic("unable to allocate pmap_extract_and_hold KVA");
+ pc->pc_pmap_eh_ptep = (char *)vtopte(pc->pc_pmap_eh_va);
/*
* Skip if the mappings have already been initialized,
@@ -1598,8 +1602,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;
- pt_entry_t pte, *ptep;
+ pd_entry_t pde, newpf;
+ pt_entry_t *eh_ptep, pte, *ptep;
vm_page_t m;
vm_paddr_t pa;
@@ -1619,9 +1623,17 @@ retry:
vm_page_hold(m);
}
} else {
- ptep = pmap_pte(pmap, va);
+ 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;
- pmap_pte_release(ptep);
+ critical_exit();
if (pte != 0 &&
((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) {
if (vm_page_pa_tryrelock(pmap, pte & PG_FRAME,
diff --git a/sys/i386/include/pcpu.h b/sys/i386/include/pcpu.h
index 768ccee20c0d..be4594963fe5 100644
--- a/sys/i386/include/pcpu.h
+++ b/sys/i386/include/pcpu.h
@@ -76,9 +76,11 @@
struct mtx pc_copyout_mlock; \
struct sx pc_copyout_slock; \
char *pc_copyout_buf; \
+ vm_offset_t pc_pmap_eh_va; \
+ caddr_t pc_pmap_eh_ptep; \
uint32_t pc_smp_tlb_done; /* TLB op acknowledgement */ \
uint32_t pc_ibpb_set; \
- char __pad[546]
+ char __pad[538]
#ifdef _KERNEL