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); |
} |
} |
|
|
/* |
/* |