I think this fixes the problem with sleeping and holding pseg_lck.

Index: uvm_extern.h
===================================================================
RCS file: /home/tedu/cvs/src/sys/uvm/uvm_extern.h,v
retrieving revision 1.82
diff -u -r1.82 uvm_extern.h
--- uvm_extern.h        11 Aug 2009 18:43:33 -0000      1.82
+++ uvm_extern.h        2 Feb 2010 04:28:09 -0000
@@ -517,8 +517,9 @@
                                vaddr_t *, vsize_t, int,
                                boolean_t, vm_map_t);
 vaddr_t                        uvm_km_valloc(vm_map_t, vsize_t);
-vaddr_t                        uvm_km_valloc_align(vm_map_t, vsize_t, vsize_t);
+vaddr_t                        uvm_km_valloc_try(vm_map_t, vsize_t);
 vaddr_t                        uvm_km_valloc_wait(vm_map_t, vsize_t);
+vaddr_t                        uvm_km_valloc_align(struct vm_map *, vsize_t, 
vsize_t, int);
 vaddr_t                        uvm_km_valloc_prefer_wait(vm_map_t, vsize_t,
                                        voff_t);
 void                   *uvm_km_getpage(boolean_t, int *);
Index: uvm_km.c
===================================================================
RCS file: /home/tedu/cvs/src/sys/uvm/uvm_km.c,v
retrieving revision 1.75
diff -u -r1.75 uvm_km.c
--- uvm_km.c    25 Jul 2009 12:55:40 -0000      1.75
+++ uvm_km.c    2 Feb 2010 04:27:35 -0000
@@ -571,11 +571,17 @@
 vaddr_t
 uvm_km_valloc(struct vm_map *map, vsize_t size)
 {
-       return(uvm_km_valloc_align(map, size, 0));
+       return(uvm_km_valloc_align(map, size, 0, 0));
 }
 
 vaddr_t
-uvm_km_valloc_align(struct vm_map *map, vsize_t size, vsize_t align)
+uvm_km_valloc_try(struct vm_map *map, vsize_t size)
+{
+       return(uvm_km_valloc_align(map, size, 0, UVM_FLAG_TRYLOCK));
+}
+
+vaddr_t
+uvm_km_valloc_align(struct vm_map *map, vsize_t size, vsize_t align, int flags)
 {
        vaddr_t kva;
        UVMHIST_FUNC("uvm_km_valloc"); UVMHIST_CALLED(maphist);
@@ -592,7 +598,7 @@
 
        if (__predict_false(uvm_map(map, &kva, size, uvm.kernel_object,
            UVM_UNKNOWN_OFFSET, align, UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL,
-           UVM_INH_NONE, UVM_ADV_RANDOM, 0)) != 0)) {
+           UVM_INH_NONE, UVM_ADV_RANDOM, flags)) != 0)) {
                UVMHIST_LOG(maphist, "<- done (no VM)", 0,0,0,0);
                return(0);
        }
Index: uvm_pager.c
===================================================================
RCS file: /home/tedu/cvs/src/sys/uvm/uvm_pager.c,v
retrieving revision 1.54
diff -u -r1.54 uvm_pager.c
--- uvm_pager.c 22 Jul 2009 21:05:37 -0000      1.54
+++ uvm_pager.c 2 Feb 2010 04:23:57 -0000
@@ -138,7 +138,7 @@
 {
        KASSERT(pseg->start == 0);
        KASSERT(pseg->use == 0);
-       pseg->start = uvm_km_valloc(kernel_map, MAX_PAGER_SEGS * MAXBSIZE);
+       pseg->start = uvm_km_valloc_try(kernel_map, MAX_PAGER_SEGS * MAXBSIZE);
 }
 
 /*

Reply via email to