On Wed, Feb 03, 2010 at 04:08:39PM +0100, Mark Kettenis wrote:
> > Date: Wed, 3 Feb 2010 14:41:04 +0000
> > From: Owain Ainsworth <zer...@googlemail.com>
> > 
> > On Mon, Feb 01, 2010 at 11:30:06PM -0500, Ted Unangst wrote:
> > > 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);
> > 
> > 
> > this doesn't take into account the fact that valloc_try may fail and
> > return 0.
> 
> That case is handled just fine.  In uvm_pseg_get() we have a check
> for pseg->start == 0 immediately after the uvm_pseg_init() call.

Ah yes, I missed that (also pointed out by ted). In which case this does
look correct. Will review more carefully when I get home from work.

-0-
-- 
I had to censor everything my sons watched ... even on the Mary Tyler
Moore show I heard the word "damn"!
                -- Mary Lou Bax

Reply via email to