Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/miscfs/genfs Use the new UVM_KMF_COLORMATCH flag to get ...



details:   https://anonhg.NetBSD.org/src/rev/5c4cee0f1e94
branches:  trunk
changeset: 769164:5c4cee0f1e94
user:      matt <matt%NetBSD.org@localhost>
date:      Thu Sep 01 16:55:08 2011 +0000

description:
Use the new UVM_KMF_COLORMATCH flag to get a congruent mappings of the user
buffer so we can use unmanaged mappings (pmap_kenter_pa/pmap_kremove).

diffstat:

 sys/miscfs/genfs/genfs_io.c |  42 ++++++------------------------------------
 1 files changed, 6 insertions(+), 36 deletions(-)

diffs (81 lines):

diff -r 3789e686cc52 -r 5c4cee0f1e94 sys/miscfs/genfs/genfs_io.c
--- a/sys/miscfs/genfs/genfs_io.c       Thu Sep 01 16:41:48 2011 +0000
+++ b/sys/miscfs/genfs/genfs_io.c       Thu Sep 01 16:55:08 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: genfs_io.c,v 1.50 2011/08/31 22:16:54 rmind Exp $      */
+/*     $NetBSD: genfs_io.c,v 1.51 2011/09/01 16:55:08 matt Exp $       */
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.50 2011/08/31 22:16:54 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.51 2011/09/01 16:55:08 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1748,8 +1748,6 @@
        int error, rv, poff, koff;
        const int pgoflags = PGO_CLEANIT | PGO_SYNCIO | PGO_JOURNALLOCKED |
                (rw == UIO_WRITE ? PGO_FREE : 0);
-       struct vm_page *pg;
-       kmutex_t *slock;
 
        /*
         * For writes, verify that this range of the file already has fully
@@ -1803,24 +1801,13 @@
        map = &vs->vm_map;
        upm = vm_map_pmap(map);
        kpm = vm_map_pmap(kernel_map);
-       kva = uvm_km_alloc(kernel_map, klen, 0,
-                          UVM_KMF_VAONLY | UVM_KMF_WAITVA);
        puva = trunc_page(uva);
+       kva = uvm_km_alloc(kernel_map, klen, atop(puva) & uvmexp.colormask,
+           UVM_KMF_VAONLY | UVM_KMF_WAITVA | UVM_KMF_COLORMATCH);
        for (poff = 0; poff < klen; poff += PAGE_SIZE) {
                rv = pmap_extract(upm, puva + poff, &pa);
                KASSERT(rv);
-               pg = PHYS_TO_VM_PAGE(pa);
-
-retry1:                /* XXX: Rework to not use managed-mappings.. */
-               mutex_enter(&uvm_pageqlock);
-               slock = uvmpd_trylockowner(pg);
-               mutex_exit(&uvm_pageqlock);
-               if (slock == NULL) {
-                       kpause("gendiolk", false, 1, slock);
-                       goto retry1;
-               }
-               pmap_enter(kpm, kva + poff, pa, prot, prot | PMAP_WIRED);
-               mutex_exit(slock);
+               pmap_kenter_pa(kva + poff, pa, prot, PMAP_WIRED);
        }
        pmap_update(kpm);
 
@@ -1836,24 +1823,7 @@
         * Tear down the kernel mapping.
         */
 
-       for (koff = 0; koff < klen; koff += PAGE_SIZE) {
-               vaddr_t sva = kva + koff;
-
-               rv = pmap_extract(kpm, sva, &pa);
-               KASSERT(rv);
-               pg = PHYS_TO_VM_PAGE(pa);
-
-retry2:                /* XXX: Rework to not use managed-mappings.. */
-               mutex_enter(&uvm_pageqlock);
-               slock = uvmpd_trylockowner(pg);
-               mutex_exit(&uvm_pageqlock);
-               if (slock == NULL) {
-                       kpause("gendiolk", false, 1, slock);
-                       goto retry2;
-               }
-               pmap_remove(kpm, sva, sva + PAGE_SIZE);
-               mutex_exit(slock);
-       }
+       pmap_kremove(kva, klen);
        pmap_update(kpm);
        uvm_km_free(kernel_map, kva, klen, UVM_KMF_VAONLY);
 



Home | Main Index | Thread Index | Old Index