svn commit: r355145 - head/sys/arm64/arm64
Alan Cox
alc at FreeBSD.org
Wed Nov 27 20:33:50 UTC 2019
Author: alc
Date: Wed Nov 27 20:33:49 2019
New Revision: 355145
URL: https://svnweb.freebsd.org/changeset/base/355145
Log:
There is no reason why we need to pin the underlying thread to its current
processor in pmap_invalidate_{all,page,range}(). These functions are using
an instruction that broadcasts the TLB invalidation to every processor, so
even if a thread migrates in the middle of one of these functions every
processor will still perform the required TLB invalidations.
Reviewed by: andrew, markj
MFC after: 10 days
Differential Revision: https://reviews.freebsd.org/D22502
Modified:
head/sys/arm64/arm64/pmap.c
Modified: head/sys/arm64/arm64/pmap.c
==============================================================================
--- head/sys/arm64/arm64/pmap.c Wed Nov 27 20:32:53 2019 (r355144)
+++ head/sys/arm64/arm64/pmap.c Wed Nov 27 20:33:49 2019 (r355145)
@@ -1043,7 +1043,6 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
{
uint64_t r;
- sched_pin();
dsb(ishst);
if (pmap == kernel_pmap) {
r = atop(va);
@@ -1054,11 +1053,10 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
}
dsb(ish);
isb();
- sched_unpin();
}
static __inline void
-pmap_invalidate_range_nopin(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
+pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
{
uint64_t end, r, start;
@@ -1080,20 +1078,10 @@ pmap_invalidate_range_nopin(pmap_t pmap, vm_offset_t s
}
static __inline void
-pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
-{
-
- sched_pin();
- pmap_invalidate_range_nopin(pmap, sva, eva);
- sched_unpin();
-}
-
-static __inline void
pmap_invalidate_all(pmap_t pmap)
{
uint64_t r;
- sched_pin();
dsb(ishst);
if (pmap == kernel_pmap) {
__asm __volatile("tlbi vmalle1is");
@@ -1103,7 +1091,6 @@ pmap_invalidate_all(pmap_t pmap)
}
dsb(ish);
isb();
- sched_unpin();
}
/*
@@ -3114,7 +3101,7 @@ pmap_update_entry(pmap_t pmap, pd_entry_t *pte, pd_ent
* lookup the physical address.
*/
pmap_clear_bits(pte, ATTR_DESCR_VALID);
- pmap_invalidate_range_nopin(pmap, va, va + size);
+ pmap_invalidate_range(pmap, va, va + size);
/* Create the new mapping */
pmap_store(pte, newpte);
More information about the svn-src-head
mailing list