summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2012-04-25 22:07:36 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2012-04-25 22:07:36 +0000
commit3f552609ac54f95f970f8906be1228e343eb41b4 (patch)
tree208de5c8b9a56c249931aa23edd20e4db35db753 /sys/arch
parente955464205074c47103cd2bf1831237c52140317 (diff)
Skip cache flushes in pmap_zero_page() and pmap_copy_page() on systems
without virtual aliasing, or for pages which are not currently mapped cached. 1+% speed increase on sgi IP27 and loongson kernels. Tested on LS2F, R4400, R5000, R12000 and R16000.
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/mips64/mips64/pmap.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/sys/arch/mips64/mips64/pmap.c b/sys/arch/mips64/mips64/pmap.c
index dccef3d6a42..f2ff258ed04 100644
--- a/sys/arch/mips64/mips64/pmap.c
+++ b/sys/arch/mips64/mips64/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.61 2012/04/24 20:02:03 miod Exp $ */
+/* $OpenBSD: pmap.c,v 1.62 2012/04/25 22:07:35 miod Exp $ */
/*
* Copyright (c) 2001-2004 Opsycon AB (www.opsycon.se / www.opsycon.com)
@@ -1206,17 +1206,19 @@ pmap_zero_page(struct vm_page *pg)
vaddr_t va;
pv_entry_t pv;
struct cpu_info *ci = curcpu();
+ int df = cache_valias_mask != 0;
DPRINTF(PDB_FOLLOW, ("pmap_zero_page(%p)\n", phys));
va = (vaddr_t)PHYS_TO_XKPHYS(phys, CCA_CACHED);
pv = pg_to_pvh(pg);
if ((pg->pg_flags & PV_CACHED) &&
- ((pv->pv_va ^ va) & cache_valias_mask) != 0) {
+ (df = ((pv->pv_va ^ va) & cache_valias_mask) != 0)) {
Mips_SyncDCachePage(ci, pv->pv_va, phys);
}
mem_zero_page(va);
- Mips_HitSyncDCache(ci, va, PAGE_SIZE);
+ if (df)
+ Mips_HitSyncDCache(ci, va, PAGE_SIZE);
}
/*
@@ -1231,11 +1233,11 @@ pmap_copy_page(struct vm_page *srcpg, struct vm_page *dstpg)
{
paddr_t src, dst;
vaddr_t s, d;
- int df = 1;
- int sf = 1;
+ int sf, df;
pv_entry_t pv;
struct cpu_info *ci = curcpu();
+ sf = df = cache_valias_mask != 0;
src = VM_PAGE_TO_PHYS(srcpg);
dst = VM_PAGE_TO_PHYS(dstpg);
s = (vaddr_t)PHYS_TO_XKPHYS(src, CCA_CACHED);
@@ -1256,10 +1258,10 @@ pmap_copy_page(struct vm_page *srcpg, struct vm_page *dstpg)
memcpy((void *)d, (void *)s, PAGE_SIZE);
- if (sf) {
+ if (sf)
Mips_HitSyncDCache(ci, s, PAGE_SIZE);
- }
- Mips_HitSyncDCache(ci, d, PAGE_SIZE);
+ if (df)
+ Mips_HitSyncDCache(ci, d, PAGE_SIZE);
}
/*