Index: sys/amd64/amd64/pmap.c =================================================================== --- sys/amd64/amd64/pmap.c +++ sys/amd64/amd64/pmap.c @@ -1434,6 +1434,9 @@ sched_unpin(); } +/* 512 PTEs */ +#define PMAP_INVLPG_THRESHOLD (512 * PAGE_SIZE) + void pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) { @@ -1441,6 +1444,11 @@ vm_offset_t addr; u_int cpuid, i; + if (eva - sva >= PMAP_INVLPG_THRESHOLD) { + pmap_invalidate_all(pmap); + return; + } + if (pmap_type_guest(pmap)) { pmap_invalidate_ept(pmap); return; Index: sys/i386/i386/pmap.c =================================================================== --- sys/i386/i386/pmap.c +++ sys/i386/i386/pmap.c @@ -1016,6 +1016,9 @@ sched_unpin(); } +/* 512 PTEs */ +#define PMAP_INVLPG_THRESHOLD (512 * PAGE_SIZE) + void pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) { @@ -1023,6 +1026,11 @@ vm_offset_t addr; u_int cpuid; + if (eva - sva >= PMAP_INVLPG_THRESHOLD) { + pmap_invalidate_all(pmap); + return; + } + sched_pin(); if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) { for (addr = sva; addr < eva; addr += PAGE_SIZE)