Print this page
patch as-lock-macro-simplification
*** 887,897 ****
if ((p->p_flag & SSYS) || as == &kas) {
prunlock(pnp);
return (0);
}
! if (!AS_LOCK_TRYENTER(as, &as->a_lock, RW_WRITER)) {
prunlock(pnp);
delay(1);
goto readmap_common;
}
mutex_exit(&p->p_lock);
--- 887,897 ----
if ((p->p_flag & SSYS) || as == &kas) {
prunlock(pnp);
return (0);
}
! if (!AS_LOCK_TRYENTER(as, RW_WRITER)) {
prunlock(pnp);
delay(1);
goto readmap_common;
}
mutex_exit(&p->p_lock);
*** 906,916 ****
case PR_MAP:
error = prgetmap(p, 0, &iolhead);
break;
}
! AS_LOCK_EXIT(as, &as->a_lock);
mutex_enter(&p->p_lock);
prunlock(pnp);
error = pr_iol_uiomove_and_free(&iolhead, uiop, error);
--- 906,916 ----
case PR_MAP:
error = prgetmap(p, 0, &iolhead);
break;
}
! AS_LOCK_EXIT(as);
mutex_enter(&p->p_lock);
prunlock(pnp);
error = pr_iol_uiomove_and_free(&iolhead, uiop, error);
*** 2003,2013 ****
if (PROCESS_NOT_32BIT(p)) {
prunlock(pnp);
return (EOVERFLOW);
}
! if (!AS_LOCK_TRYENTER(as, &as->a_lock, RW_WRITER)) {
prunlock(pnp);
delay(1);
goto readmap32_common;
}
mutex_exit(&p->p_lock);
--- 2003,2013 ----
if (PROCESS_NOT_32BIT(p)) {
prunlock(pnp);
return (EOVERFLOW);
}
! if (!AS_LOCK_TRYENTER(as, RW_WRITER)) {
prunlock(pnp);
delay(1);
goto readmap32_common;
}
mutex_exit(&p->p_lock);
*** 2021,2031 ****
break;
case PR_MAP:
error = prgetmap32(p, 0, &iolhead);
break;
}
! AS_LOCK_EXIT(as, &as->a_lock);
mutex_enter(&p->p_lock);
prunlock(pnp);
error = pr_iol_uiomove_and_free(&iolhead, uiop, error);
--- 2021,2031 ----
break;
case PR_MAP:
error = prgetmap32(p, 0, &iolhead);
break;
}
! AS_LOCK_EXIT(as);
mutex_enter(&p->p_lock);
prunlock(pnp);
error = pr_iol_uiomove_and_free(&iolhead, uiop, error);
*** 2928,2957 ****
case PR_OBJECTDIR:
if ((p->p_flag & SSYS) || (as = p->p_as) == &kas)
vap->va_size = 2 * PRSDSIZE;
else {
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
if (as->a_updatedir)
rebuild_objdir(as);
vap->va_size = (as->a_sizedir + 2) * PRSDSIZE;
! AS_LOCK_EXIT(as, &as->a_lock);
mutex_enter(&p->p_lock);
}
vap->va_nlink = 2;
break;
case PR_PATHDIR:
if ((p->p_flag & SSYS) || (as = p->p_as) == &kas)
vap->va_size = (P_FINFO(p)->fi_nfiles + 4) * PRSDSIZE;
else {
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
if (as->a_updatedir)
rebuild_objdir(as);
vap->va_size = (as->a_sizedir + 4 +
P_FINFO(p)->fi_nfiles) * PRSDSIZE;
! AS_LOCK_EXIT(as, &as->a_lock);
mutex_enter(&p->p_lock);
}
vap->va_nlink = 2;
break;
case PR_PATH:
--- 2928,2957 ----
case PR_OBJECTDIR:
if ((p->p_flag & SSYS) || (as = p->p_as) == &kas)
vap->va_size = 2 * PRSDSIZE;
else {
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, RW_WRITER);
if (as->a_updatedir)
rebuild_objdir(as);
vap->va_size = (as->a_sizedir + 2) * PRSDSIZE;
! AS_LOCK_EXIT(as);
mutex_enter(&p->p_lock);
}
vap->va_nlink = 2;
break;
case PR_PATHDIR:
if ((p->p_flag & SSYS) || (as = p->p_as) == &kas)
vap->va_size = (P_FINFO(p)->fi_nfiles + 4) * PRSDSIZE;
else {
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, RW_WRITER);
if (as->a_updatedir)
rebuild_objdir(as);
vap->va_size = (as->a_sizedir + 4 +
P_FINFO(p)->fi_nfiles) * PRSDSIZE;
! AS_LOCK_EXIT(as);
mutex_enter(&p->p_lock);
}
vap->va_nlink = 2;
break;
case PR_PATH:
*** 3013,3032 ****
case PR_XMAP:
if ((p->p_flag & SSYS) || (as = p->p_as) == &kas)
vap->va_size = 0;
else {
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
if (type == PR_MAP)
vap->va_mtime = as->a_updatetime;
if (type == PR_XMAP)
vap->va_size = prnsegs(as, 0) *
PR_OBJSIZE(prxmap32_t, prxmap_t);
else
vap->va_size = prnsegs(as, type == PR_RMAP) *
PR_OBJSIZE(prmap32_t, prmap_t);
! AS_LOCK_EXIT(as, &as->a_lock);
mutex_enter(&p->p_lock);
}
break;
case PR_CRED:
mutex_enter(&p->p_crlock);
--- 3013,3032 ----
case PR_XMAP:
if ((p->p_flag & SSYS) || (as = p->p_as) == &kas)
vap->va_size = 0;
else {
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, RW_WRITER);
if (type == PR_MAP)
vap->va_mtime = as->a_updatetime;
if (type == PR_XMAP)
vap->va_size = prnsegs(as, 0) *
PR_OBJSIZE(prxmap32_t, prxmap_t);
else
vap->va_size = prnsegs(as, type == PR_RMAP) *
PR_OBJSIZE(prmap32_t, prmap_t);
! AS_LOCK_EXIT(as);
mutex_enter(&p->p_lock);
}
break;
case PR_CRED:
mutex_enter(&p->p_crlock);
*** 3071,3104 ****
* We can drop p->p_lock before grabbing the
* address space lock because p->p_as will not
* change while the process is marked P_PR_LOCK.
*/
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
#ifdef _LP64
vap->va_size = iam32bit?
prpdsize32(as) : prpdsize(as);
#else
vap->va_size = prpdsize(as);
#endif
! AS_LOCK_EXIT(as, &as->a_lock);
mutex_enter(&p->p_lock);
}
break;
case PR_OPAGEDATA:
if ((p->p_flag & SSYS) || (as = p->p_as) == &kas)
vap->va_size = 0;
else {
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
#ifdef _LP64
vap->va_size = iam32bit?
oprpdsize32(as) : oprpdsize(as);
#else
vap->va_size = oprpdsize(as);
#endif
! AS_LOCK_EXIT(as, &as->a_lock);
mutex_enter(&p->p_lock);
}
break;
case PR_WATCH:
vap->va_size = avl_numnodes(&p->p_warea) *
--- 3071,3104 ----
* We can drop p->p_lock before grabbing the
* address space lock because p->p_as will not
* change while the process is marked P_PR_LOCK.
*/
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, RW_WRITER);
#ifdef _LP64
vap->va_size = iam32bit?
prpdsize32(as) : prpdsize(as);
#else
vap->va_size = prpdsize(as);
#endif
! AS_LOCK_EXIT(as);
mutex_enter(&p->p_lock);
}
break;
case PR_OPAGEDATA:
if ((p->p_flag & SSYS) || (as = p->p_as) == &kas)
vap->va_size = 0;
else {
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, RW_WRITER);
#ifdef _LP64
vap->va_size = iam32bit?
oprpdsize32(as) : oprpdsize(as);
#else
vap->va_size = oprpdsize(as);
#endif
! AS_LOCK_EXIT(as);
mutex_enter(&p->p_lock);
}
break;
case PR_WATCH:
vap->va_size = avl_numnodes(&p->p_warea) *
*** 3691,3701 ****
* in order to avoid a deadlock with the clock thread.
* The process will not disappear and its address space
* will not change because it is marked P_PR_LOCK.
*/
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
if ((seg = AS_SEGFIRST(as)) == NULL) {
vp = NULL;
goto out;
}
if (strcmp(comp, "a.out") == 0) {
--- 3691,3701 ----
* in order to avoid a deadlock with the clock thread.
* The process will not disappear and its address space
* will not change because it is marked P_PR_LOCK.
*/
mutex_exit(&p->p_lock);
! AS_LOCK_ENTER(as, RW_READER);
if ((seg = AS_SEGFIRST(as)) == NULL) {
vp = NULL;
goto out;
}
if (strcmp(comp, "a.out") == 0) {
*** 3724,3734 ****
vp = NULL;
out:
if (vp != NULL) {
VN_HOLD(vp);
}
! AS_LOCK_EXIT(as, &as->a_lock);
mutex_enter(&p->p_lock);
prunlock(dpnp);
if (vp == NULL)
prfreenode(pnp);
--- 3724,3734 ----
vp = NULL;
out:
if (vp != NULL) {
VN_HOLD(vp);
}
! AS_LOCK_EXIT(as);
mutex_enter(&p->p_lock);
prunlock(dpnp);
if (vp == NULL)
prfreenode(pnp);
*** 4148,4158 ****
vp = p->p_exec;
VN_HOLD(vp);
type = NAME_OBJECT;
}
} else {
! AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
if ((seg = AS_SEGFIRST(as)) != NULL) {
do {
/*
* Manufacture a filename for the
* "object" directory.
--- 4148,4158 ----
vp = p->p_exec;
VN_HOLD(vp);
type = NAME_OBJECT;
}
} else {
! AS_LOCK_ENTER(as, RW_READER);
if ((seg = AS_SEGFIRST(as)) != NULL) {
do {
/*
* Manufacture a filename for the
* "object" directory.
*** 4182,4192 ****
} else {
VN_HOLD(vp);
type = NAME_OBJECT;
}
! AS_LOCK_EXIT(as, &as->a_lock);
}
}
switch (type) {
--- 4182,4192 ----
} else {
VN_HOLD(vp);
type = NAME_OBJECT;
}
! AS_LOCK_EXIT(as);
}
}
switch (type) {
*** 4836,4846 ****
ulong_t nalloc;
ulong_t nentries;
int i, j;
ulong_t nold, nnew;
! ASSERT(AS_WRITE_HELD(as, &as->a_lock));
if (as->a_updatedir == 0 && as->a_objectdir != NULL)
return;
as->a_updatedir = 0;
--- 4836,4846 ----
ulong_t nalloc;
ulong_t nentries;
int i, j;
ulong_t nold, nnew;
! ASSERT(AS_WRITE_HELD(as));
if (as->a_updatedir == 0 && as->a_objectdir != NULL)
return;
as->a_updatedir = 0;
*** 4941,4951 ****
* The only caller is below, in pr_readdir_objectdir().
*/
static vnode_t *
obj_entry(struct as *as, int slot)
{
! ASSERT(AS_LOCK_HELD(as, &as->a_lock));
if (as->a_objectdir == NULL)
return (NULL);
ASSERT(slot < as->a_sizedir);
return (as->a_objectdir[slot]);
}
--- 4941,4951 ----
* The only caller is below, in pr_readdir_objectdir().
*/
static vnode_t *
obj_entry(struct as *as, int slot)
{
! ASSERT(AS_LOCK_HELD(as));
if (as->a_objectdir == NULL)
return (NULL);
ASSERT(slot < as->a_sizedir);
return (as->a_objectdir[slot]);
}
*** 5005,5015 ****
* Set the correct size of the directory just
* in case the process has changed it's address
* space via mmap/munmap calls.
*/
if (as != NULL) {
! AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
if (as->a_updatedir)
rebuild_objdir(as);
objdirsize = as->a_sizedir;
}
--- 5005,5015 ----
* Set the correct size of the directory just
* in case the process has changed it's address
* space via mmap/munmap calls.
*/
if (as != NULL) {
! AS_LOCK_ENTER(as, RW_WRITER);
if (as->a_updatedir)
rebuild_objdir(as);
objdirsize = as->a_sizedir;
}
*** 5023,5033 ****
vattr.va_mask = AT_FSID | AT_NODEID;
n++;
}
if (as != NULL)
! AS_LOCK_EXIT(as, &as->a_lock);
/*
* Stop when all objects have been reported.
*/
if (n >= objdirsize) {
--- 5023,5033 ----
vattr.va_mask = AT_FSID | AT_NODEID;
n++;
}
if (as != NULL)
! AS_LOCK_EXIT(as);
/*
* Stop when all objects have been reported.
*/
if (n >= objdirsize) {
*** 5297,5311 ****
if ((p->p_flag & SSYS) || (as = p->p_as) == &kas) {
as = NULL;
objdirsize = 0;
} else {
! AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
if (as->a_updatedir)
rebuild_objdir(as);
objdirsize = as->a_sizedir;
! AS_LOCK_EXIT(as, &as->a_lock);
as = NULL;
}
mutex_enter(&fip->fi_lock);
if ((p->p_flag & SSYS) || p->p_as == &kas)
--- 5297,5311 ----
if ((p->p_flag & SSYS) || (as = p->p_as) == &kas) {
as = NULL;
objdirsize = 0;
} else {
! AS_LOCK_ENTER(as, RW_WRITER);
if (as->a_updatedir)
rebuild_objdir(as);
objdirsize = as->a_sizedir;
! AS_LOCK_EXIT(as);
as = NULL;
}
mutex_enter(&fip->fi_lock);
if ((p->p_flag & SSYS) || p->p_as == &kas)
*** 5361,5371 ****
* The process will not disappear and its address space
* will not change because it is marked P_PR_LOCK.
*/
if (as == NULL) {
as = p->p_as;
! AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
}
if (as->a_updatedir) {
rebuild_objdir(as);
objdirsize = as->a_sizedir;
--- 5361,5371 ----
* The process will not disappear and its address space
* will not change because it is marked P_PR_LOCK.
*/
if (as == NULL) {
as = p->p_as;
! AS_LOCK_ENTER(as, RW_WRITER);
}
if (as->a_updatedir) {
rebuild_objdir(as);
objdirsize = as->a_sizedir;
*** 5399,5413 ****
}
/*
* Drop the address space lock to do the uiomove().
*/
if (as != NULL)
! AS_LOCK_EXIT(as, &as->a_lock);
error = uiomove((caddr_t)dirent, reclen, UIO_READ, uiop);
if (as != NULL)
! AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
if (error)
break;
}
--- 5399,5413 ----
}
/*
* Drop the address space lock to do the uiomove().
*/
if (as != NULL)
! AS_LOCK_EXIT(as);
error = uiomove((caddr_t)dirent, reclen, UIO_READ, uiop);
if (as != NULL)
! AS_LOCK_ENTER(as, RW_WRITER);
if (error)
break;
}
*** 5415,5425 ****
*eofp = (uiop->uio_offset >= (fddirsize + 2) * PRSDSIZE);
if (fip != NULL)
mutex_exit(&fip->fi_lock);
if (as != NULL)
! AS_LOCK_EXIT(as, &as->a_lock);
mutex_enter(&p->p_lock);
prunlock(pnp);
return (error);
}
--- 5415,5425 ----
*eofp = (uiop->uio_offset >= (fddirsize + 2) * PRSDSIZE);
if (fip != NULL)
mutex_exit(&fip->fi_lock);
if (as != NULL)
! AS_LOCK_EXIT(as);
mutex_enter(&p->p_lock);
prunlock(pnp);
return (error);
}