diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2018-05-25 16:29:22 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2018-05-25 16:29:22 +0000 |
| commit | ded29bd9a578b11b61e9d1d9ddd71f77e44d9aca (patch) | |
| tree | 4f5e4ac77a96ec03eb5d56f37d4f9cdb313eed4c /sys | |
| parent | feac1d48082921a353a292f5bb9965facfbe1b20 (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/i386/i386/pmap.c | 20 | ||||
| -rw-r--r-- | sys/i386/include/pcpu.h | 4 |
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 |
