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