Author: andrew
Date: Wed Oct 31 12:00:35 2018
New Revision: 339948
URL: https://svnweb.freebsd.org/changeset/base/339948

Log:
  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:
  head/sys/arm64/arm64/pmap.c

Modified: head/sys/arm64/arm64/pmap.c
==============================================================================
--- head/sys/arm64/arm64/pmap.c Wed Oct 31 11:37:05 2018        (r339947)
+++ head/sys/arm64/arm64/pmap.c Wed Oct 31 12:00:35 2018        (r339948)
@@ -4663,11 +4663,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);
 
@@ -4700,12 +4700,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;
@@ -4715,6 +4717,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;
 
@@ -4725,13 +4728,15 @@ pmap_unmapbios(vm_offset_t va, vm_size_t size)
                            va_trunc));
                        l2 = pmap_l1_to_l2(pde, va_trunc);
                        pmap_load_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. */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to