[BACK]Return to uvm_vnode.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / uvm

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/uvm/uvm_vnode.c between version 1.81 and 1.81.2.4

version 1.81, 2007/03/04 06:03:49 version 1.81.2.4, 2007/04/13 20:56:19
Line 138  uvn_attach(void *arg, vm_prot_t accesspr
Line 138  uvn_attach(void *arg, vm_prot_t accesspr
          * first get a lock on the uobj.           * first get a lock on the uobj.
          */           */
   
         simple_lock(&uobj->vmobjlock);          mutex_enter(&uobj->vmobjlock);
         while (vp->v_flag & VXLOCK) {          if (vp->v_flag & VXLOCK) {
                 vp->v_flag |= VXWANT;  
                 UVMHIST_LOG(maphist, "  SLEEPING on blocked vn",0,0,0,0);                  UVMHIST_LOG(maphist, "  SLEEPING on blocked vn",0,0,0,0);
                 UVM_UNLOCK_AND_WAIT(uobj, &uobj->vmobjlock, false,                  vwait(vp, VXLOCK);
                     "uvn_attach", 0);  
                 simple_lock(&uobj->vmobjlock);  
                 UVMHIST_LOG(maphist,"  WOKE UP",0,0,0,0);                  UVMHIST_LOG(maphist,"  WOKE UP",0,0,0,0);
         }          }
   
Line 152  uvn_attach(void *arg, vm_prot_t accesspr
Line 149  uvn_attach(void *arg, vm_prot_t accesspr
          * if we're mapping a BLK device, make sure it is a disk.           * if we're mapping a BLK device, make sure it is a disk.
          */           */
         if (vp->v_type == VBLK) {          if (vp->v_type == VBLK) {
                 bdev = bdevsw_lookup(vp->v_rdev);                  if (bdev_type(vp->v_rdev) != D_DISK) {
                 if (bdev == NULL || bdev->d_type != D_DISK) {                          mutex_exit(&uobj->vmobjlock);
                         simple_unlock(&uobj->vmobjlock);  
                         UVMHIST_LOG(maphist,"<- done (VBLK not D_DISK!)",                          UVMHIST_LOG(maphist,"<- done (VBLK not D_DISK!)",
                                     0,0,0,0);                                      0,0,0,0);
                         return(NULL);                          return(NULL);
Line 170  uvn_attach(void *arg, vm_prot_t accesspr
Line 166  uvn_attach(void *arg, vm_prot_t accesspr
   
   
         vp->v_flag |= VXLOCK;          vp->v_flag |= VXLOCK;
         simple_unlock(&uobj->vmobjlock); /* drop lock in case we sleep */          mutex_exit(&uobj->vmobjlock); /* drop lock in case we sleep */
                 /* XXX: curproc? */                  /* XXX: curproc? */
         if (vp->v_type == VBLK) {          if (vp->v_type == VBLK) {
                 /*                  /*
Line 200  uvn_attach(void *arg, vm_prot_t accesspr
Line 196  uvn_attach(void *arg, vm_prot_t accesspr
         }          }
   
         /* relock object */          /* relock object */
         simple_lock(&uobj->vmobjlock);          mutex_enter(&uobj->vmobjlock);
           vunwait(vp, VXLOCK);
         if (vp->v_flag & VXWANT) {  
                 wakeup(vp);  
         }  
         vp->v_flag &= ~(VXLOCK|VXWANT);  
   
         if (result != 0) {          if (result != 0) {
                 simple_unlock(&uobj->vmobjlock);                  mutex_exit(&uobj->vmobjlock);
                 UVMHIST_LOG(maphist,"<- done (VOP_GETATTR FAILED!)", 0,0,0,0);                  UVMHIST_LOG(maphist,"<- done (VOP_GETATTR FAILED!)", 0,0,0,0);
                 return(NULL);                  return(NULL);
         }          }
Line 216  uvn_attach(void *arg, vm_prot_t accesspr
Line 208  uvn_attach(void *arg, vm_prot_t accesspr
   
         }          }
   
         simple_unlock(&uobj->vmobjlock);          mutex_exit(&uobj->vmobjlock);
         UVMHIST_LOG(maphist,"<- done, refcnt=%d", vp->v_usecount,          UVMHIST_LOG(maphist,"<- done, refcnt=%d", vp->v_usecount,
             0, 0, 0);              0, 0, 0);
   
         return uobj;          return uobj;
 }  }
   
Line 269  uvn_put(struct uvm_object *uobj, voff_t 
Line 262  uvn_put(struct uvm_object *uobj, voff_t 
         struct vnode *vp = (struct vnode *)uobj;          struct vnode *vp = (struct vnode *)uobj;
         int error;          int error;
   
         LOCK_ASSERT(simple_lock_held(&vp->v_interlock));          KASSERT(mutex_owned(&vp->v_interlock));
         error = VOP_PUTPAGES(vp, offlo, offhi, flags);          error = VOP_PUTPAGES(vp, offlo, offhi, flags);
         LOCK_ASSERT(!simple_lock_held(&vp->v_interlock));  
         return error;          return error;
 }  }
   
Line 301  uvn_get(struct uvm_object *uobj, voff_t 
Line 294  uvn_get(struct uvm_object *uobj, voff_t 
         UVMHIST_LOG(ubchist, "vp %p off 0x%x", vp, (int)offset, 0,0);          UVMHIST_LOG(ubchist, "vp %p off 0x%x", vp, (int)offset, 0,0);
   
         if ((access_type & VM_PROT_WRITE) == 0 && (flags & PGO_LOCKED) == 0) {          if ((access_type & VM_PROT_WRITE) == 0 && (flags & PGO_LOCKED) == 0) {
                 simple_unlock(&vp->v_interlock);                  mutex_exit(&vp->v_interlock);
                 vn_ra_allocctx(vp);                  vn_ra_allocctx(vp);
                 uvm_ra_request(vp->v_ractx, advice, uobj, offset,                  uvm_ra_request(vp->v_ractx, advice, uobj, offset,
                     *npagesp << PAGE_SHIFT);                      *npagesp << PAGE_SHIFT);
                 simple_lock(&vp->v_interlock);                  mutex_enter(&vp->v_interlock);
         }          }
   
         error = VOP_GETPAGES(vp, offset, pps, npagesp, centeridx,          error = VOP_GETPAGES(vp, offset, pps, npagesp, centeridx,
                              access_type, advice, flags);                               access_type, advice, flags);
   
         LOCK_ASSERT(((flags & PGO_LOCKED) != 0 &&          KASSERT(((flags & PGO_LOCKED) != 0 &&
                      simple_lock_held(&vp->v_interlock)) ||                       mutex_owned(&vp->v_interlock)) ||
                     ((flags & PGO_LOCKED) == 0 &&                      ((flags & PGO_LOCKED) == 0 &&
                      !simple_lock_held(&vp->v_interlock)));                       !mutex_owned(&vp->v_interlock)));
         return error;          return error;
 }  }
   
Line 388  uvn_findpage(struct uvm_object *uobj, vo
Line 381  uvn_findpage(struct uvm_object *uobj, vo
                                         UVMHIST_LOG(ubchist, "nowait",0,0,0,0);                                          UVMHIST_LOG(ubchist, "nowait",0,0,0,0);
                                         return 0;                                          return 0;
                                 }                                  }
                                 simple_unlock(&uobj->vmobjlock);                                  mutex_exit(&uobj->vmobjlock);
                                 uvm_wait("uvn_fp1");                                  uvm_wait("uvn_fp1");
                                 simple_lock(&uobj->vmobjlock);                                  mutex_enter(&uobj->vmobjlock);
                                 continue;                                  continue;
                         }                          }
                         UVMHIST_LOG(ubchist, "alloced %p", pg,0,0,0);                          UVMHIST_LOG(ubchist, "alloced %p", pg,0,0,0);
Line 410  uvn_findpage(struct uvm_object *uobj, vo
Line 403  uvn_findpage(struct uvm_object *uobj, vo
                         UVMHIST_LOG(ubchist, "wait %p", pg,0,0,0);                          UVMHIST_LOG(ubchist, "wait %p", pg,0,0,0);
                         UVM_UNLOCK_AND_WAIT(pg, &uobj->vmobjlock, 0,                          UVM_UNLOCK_AND_WAIT(pg, &uobj->vmobjlock, 0,
                                             "uvn_fp2", 0);                                              "uvn_fp2", 0);
                         simple_lock(&uobj->vmobjlock);                          mutex_enter(&uobj->vmobjlock);
                         continue;                          continue;
                 }                  }
   
Line 460  uvm_vnp_setsize(struct vnode *vp, voff_t
Line 453  uvm_vnp_setsize(struct vnode *vp, voff_t
         voff_t oldsize;          voff_t oldsize;
         UVMHIST_FUNC("uvm_vnp_setsize"); UVMHIST_CALLED(ubchist);          UVMHIST_FUNC("uvm_vnp_setsize"); UVMHIST_CALLED(ubchist);
   
         simple_lock(&uobj->vmobjlock);          mutex_enter(&uobj->vmobjlock);
         UVMHIST_LOG(ubchist, "vp %p old 0x%x new 0x%x",          UVMHIST_LOG(ubchist, "vp %p old 0x%x new 0x%x",
             vp, vp->v_size, newsize, 0);              vp, vp->v_size, newsize, 0);
   
Line 472  uvm_vnp_setsize(struct vnode *vp, voff_t
Line 465  uvm_vnp_setsize(struct vnode *vp, voff_t
         oldsize = vp->v_size;          oldsize = vp->v_size;
         if (oldsize > pgend && oldsize != VSIZENOTSET) {          if (oldsize > pgend && oldsize != VSIZENOTSET) {
                 (void) uvn_put(uobj, pgend, 0, PGO_FREE | PGO_SYNCIO);                  (void) uvn_put(uobj, pgend, 0, PGO_FREE | PGO_SYNCIO);
                 simple_lock(&uobj->vmobjlock);                  mutex_enter(&uobj->vmobjlock);
         }          }
         vp->v_size = newsize;          vp->v_size = newsize;
         simple_unlock(&uobj->vmobjlock);          mutex_exit(&uobj->vmobjlock);
 }  }
   
 /*  /*

Legend:
Removed from v.1.81  
changed lines
  Added in v.1.81.2.4

CVSweb <webmaster@jp.NetBSD.org>