Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Sep 2019 14:35:03 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r352399 - stable/12/sys/arm64/arm64
Message-ID:  <201909161435.x8GEZ3dj031117@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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. */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201909161435.x8GEZ3dj031117>