svn commit: r352399 - stable/12/sys/arm64/arm64
Andrew Turner
andrew at FreeBSD.org
Mon Sep 16 14:35:03 UTC 2019
Author: andrew
Date: Mon Sep 16 14:35:02 2019
New Revision: 352399
URL: https://svnweb.freebsd.org/changeset/base/352399
Log:
MFC r339948:
Use pmap_invalidate_all rather than invalidating 512 level 2 entries in
the early pmap_mapbios/unmapbios code. It is even worse when there are
multiple L2 entries to handle as we would need to iterate over all pages.
Sponsored by: DARPA, AFRL
Modified:
stable/12/sys/arm64/arm64/pmap.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/arm64/arm64/pmap.c
==============================================================================
--- stable/12/sys/arm64/arm64/pmap.c Mon Sep 16 14:34:10 2019 (r352398)
+++ stable/12/sys/arm64/arm64/pmap.c Mon Sep 16 14:35:02 2019 (r352399)
@@ -4869,11 +4869,11 @@ pmap_mapbios(vm_paddr_t pa, vm_size_t size)
pmap_load_store(l2,
pa | ATTR_DEFAULT | ATTR_XN |
ATTR_IDX(CACHED_MEMORY) | L2_BLOCK);
- pmap_invalidate_range(kernel_pmap, va, va + L2_SIZE);
va += L2_SIZE;
pa += L2_SIZE;
}
+ pmap_invalidate_all(kernel_pmap);
va = preinit_map_va + (start_idx * L2_SIZE);
@@ -4906,12 +4906,14 @@ pmap_unmapbios(vm_offset_t va, vm_size_t size)
pd_entry_t *pde;
pt_entry_t *l2;
int i, lvl, l2_blocks, block;
+ bool preinit_map;
l2_blocks =
(roundup2(va + size, L2_SIZE) - rounddown2(va, L2_SIZE)) >> L2_SHIFT;
KASSERT(l2_blocks > 0, ("pmap_unmapbios: invalid size %lx", size));
/* Remove preinit mapping */
+ preinit_map = false;
block = 0;
for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
ppim = pmap_preinit_mapping + i;
@@ -4921,6 +4923,7 @@ pmap_unmapbios(vm_offset_t va, vm_size_t size)
ppim->va = 0;
ppim->pa = 0;
ppim->size = 0;
+ preinit_map = true;
offset = block * L2_SIZE;
va_trunc = rounddown2(va, L2_SIZE) + offset;
@@ -4931,13 +4934,15 @@ pmap_unmapbios(vm_offset_t va, vm_size_t size)
va_trunc));
l2 = pmap_l1_to_l2(pde, va_trunc);
pmap_clear(l2);
- pmap_invalidate_range(kernel_pmap, va_trunc,
- va_trunc + L2_SIZE);
if (block == (l2_blocks - 1))
- return;
+ break;
block++;
}
+ }
+ if (preinit_map) {
+ pmap_invalidate_all(kernel_pmap);
+ return;
}
/* Unmap the pages reserved with kva_alloc. */
More information about the svn-src-all
mailing list