diff options
author | kib <kib@FreeBSD.org> | 2017-02-03 12:03:10 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2017-02-03 12:03:10 +0000 |
commit | 0b7160d00d1511eafb8598877443090ed738b30e (patch) | |
tree | bb6917be18c7074073ad0bfda9784c81f16da1b4 /sys/amd64/amd64/pmap.c | |
parent | 5c75d73ea10112eca60a524a52b1a65118c3da39 (diff) | |
download | FreeBSD-src-0b7160d00d1511eafb8598877443090ed738b30e.zip FreeBSD-src-0b7160d00d1511eafb8598877443090ed738b30e.tar.gz |
MFC r312555:
Use SFENCE for ordering CLFLUSHOPT.
Diffstat (limited to 'sys/amd64/amd64/pmap.c')
-rw-r--r-- | sys/amd64/amd64/pmap.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index d7c721c..49ceca9 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -1863,16 +1863,16 @@ pmap_invalidate_cache_range(vm_offset_t sva, vm_offset_t eva, boolean_t force) return; /* - * Otherwise, do per-cache line flush. Use the mfence + * Otherwise, do per-cache line flush. Use the sfence * instruction to insure that previous stores are * included in the write-back. The processor * propagates flush to other processors in the cache * coherence domain. */ - mfence(); + sfence(); for (; sva < eva; sva += cpu_clflush_line_size) clflushopt(sva); - mfence(); + sfence(); } else if ((cpu_feature & CPUID_CLFSH) != 0 && eva - sva < PMAP_CLFLUSH_THRESHOLD) { if (pmap_kextract(sva) == lapic_paddr) @@ -1916,7 +1916,9 @@ pmap_invalidate_cache_pages(vm_page_t *pages, int count) ((cpu_feature & CPUID_CLFSH) == 0 && !useclflushopt)) pmap_invalidate_cache(); else { - if (useclflushopt || cpu_vendor_id != CPU_VENDOR_INTEL) + if (useclflushopt) + sfence(); + else if (cpu_vendor_id != CPU_VENDOR_INTEL) mfence(); for (i = 0; i < count; i++) { daddr = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pages[i])); @@ -1928,7 +1930,9 @@ pmap_invalidate_cache_pages(vm_page_t *pages, int count) clflush(daddr); } } - if (useclflushopt || cpu_vendor_id != CPU_VENDOR_INTEL) + if (useclflushopt) + sfence(); + else if (cpu_vendor_id != CPU_VENDOR_INTEL) mfence(); } } |