diff options
author | 2000-02-18 17:40:04 +0000 | |
---|---|---|
committer | 2000-02-18 17:40:04 +0000 | |
commit | 4aa512d366fa0e553ed78322b6e5acc671b9f365 (patch) | |
tree | dc9389584616b0f00841c87cd54322047729a2c8 | |
parent | full support for a serial console. (diff) | |
download | wireguard-openbsd-4aa512d366fa0e553ed78322b6e5acc671b9f365.tar.xz wireguard-openbsd-4aa512d366fa0e553ed78322b6e5acc671b9f365.zip |
In vmapbuf expand uvm_km_valloc_wait into a direct call to uvm_map
so that we can specify an offset. This allows uvm_map to use PMAP_PREFER
and removes a big source of bad cache aliases.
With this change I have not seen any bad cache aliases during normal use.
(it is still possible to force them).
-rw-r--r-- | sys/arch/sparc/sparc/vm_machdep.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/sys/arch/sparc/sparc/vm_machdep.c b/sys/arch/sparc/sparc/vm_machdep.c index 45d30dd45ef..bd296ac66d0 100644 --- a/sys/arch/sparc/sparc/vm_machdep.c +++ b/sys/arch/sparc/sparc/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.14 2000/02/17 20:18:00 art Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.15 2000/02/18 17:40:04 art Exp $ */ /* $NetBSD: vm_machdep.c,v 1.30 1997/03/10 23:55:40 pk Exp $ */ /* @@ -277,15 +277,15 @@ dvma_mapout(kva, va, len) /*ARGSUSED*/ void vmapbuf(bp, sz) - register struct buf *bp; + struct buf *bp; vsize_t sz; { - register vaddr_t addr, kva; + vaddr_t addr, kva; paddr_t pa; - register vsize_t size, off; - register int npf; + vsize_t size, off; + int npf; struct proc *p; - register struct vm_map *map; + struct vm_map *map; #ifdef DIAGNOSTIC if ((bp->b_flags & B_PHYS) == 0) @@ -298,7 +298,20 @@ vmapbuf(bp, sz) off = addr & PGOFSET; size = round_page(bp->b_bcount + off); #if defined(UVM) - kva = uvm_km_valloc_wait(kernel_map, size); + /* + * Note that this is an expanded version of: + * kva = uvm_km_valloc_wait(kernel_map, size); + * We do it on our own here to be able to specify an offset to uvm_map + * so that we can get all benefits of PMAP_PREFER. + */ + while (1) { + kva = vm_map_min(kernel_map); + if (uvm_map(kernel_map, &kva, size, NULL, addr, + UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL, + UVM_INH_NONE, UVM_ADV_RANDOM, 0)) == KERN_SUCCESS) + break; + tsleep(kernel_map, PVM, "vallocwait", 0); + } #else kva = kmem_alloc_wait(kernel_map, size); #endif |