Print this page
patch as-lock-macro-simplification

*** 549,559 **** size_t pgsz; lgrp_mem_policy_t mpolicy = LGRP_MEM_POLICY_DEFAULT; int use_rgn = 0; int trok = 0; ! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock)); if (a->type != MAP_PRIVATE && a->type != MAP_SHARED) { panic("segvn_create type"); /*NOTREACHED*/ } --- 549,559 ---- size_t pgsz; lgrp_mem_policy_t mpolicy = LGRP_MEM_POLICY_DEFAULT; int use_rgn = 0; int trok = 0; ! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as)); if (a->type != MAP_PRIVATE && a->type != MAP_SHARED) { panic("segvn_create type"); /*NOTREACHED*/ }
*** 1020,1030 **** struct vpage *vpage2 = svd2->vpage, *nvpage = NULL; size_t size, nvpsize; pgcnt_t npages1, npages2; ASSERT(seg1->s_as && seg2->s_as && seg1->s_as == seg2->s_as); ! ASSERT(AS_WRITE_HELD(seg1->s_as, &seg1->s_as->a_lock)); ASSERT(seg1->s_ops == seg2->s_ops); if (HAT_IS_REGION_COOKIE_VALID(svd1->rcookie) || HAT_IS_REGION_COOKIE_VALID(svd2->rcookie)) { return (-1); --- 1020,1030 ---- struct vpage *vpage2 = svd2->vpage, *nvpage = NULL; size_t size, nvpsize; pgcnt_t npages1, npages2; ASSERT(seg1->s_as && seg2->s_as && seg1->s_as == seg2->s_as); ! ASSERT(AS_WRITE_HELD(seg1->s_as)); ASSERT(seg1->s_ops == seg2->s_ops); if (HAT_IS_REGION_COOKIE_VALID(svd1->rcookie) || HAT_IS_REGION_COOKIE_VALID(svd2->rcookie)) { return (-1);
*** 1265,1275 **** /* * We don't need any segment level locks for "segvn" data * since the address space is "write" locked. */ ! ASSERT(seg1->s_as && AS_WRITE_HELD(seg1->s_as, &seg1->s_as->a_lock)); if (HAT_IS_REGION_COOKIE_VALID(svd1->rcookie)) { return (-1); } --- 1265,1275 ---- /* * We don't need any segment level locks for "segvn" data * since the address space is "write" locked. */ ! ASSERT(seg1->s_as && AS_WRITE_HELD(seg1->s_as)); if (HAT_IS_REGION_COOKIE_VALID(svd1->rcookie)) { return (-1); }
*** 1386,1396 **** /* * We don't need any segment level locks for "segvn" data * since the address space is "write" locked. */ ! ASSERT(seg2->s_as && AS_WRITE_HELD(seg2->s_as, &seg2->s_as->a_lock)); if (HAT_IS_REGION_COOKIE_VALID(svd2->rcookie)) { return (-1); } --- 1386,1396 ---- /* * We don't need any segment level locks for "segvn" data * since the address space is "write" locked. */ ! ASSERT(seg2->s_as && AS_WRITE_HELD(seg2->s_as)); if (HAT_IS_REGION_COOKIE_VALID(svd2->rcookie)) { return (-1); }
*** 1573,1583 **** pgcnt_t npages = seg_pages(seg); int error = 0; size_t len; struct anon_map *amp; ! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock)); ASSERT(newseg->s_as->a_proc->p_parent == curproc); /* * If segment has anon reserved, reserve more for the new seg. * For a MAP_NORESERVE segment swresv will be a count of all the --- 1573,1583 ---- pgcnt_t npages = seg_pages(seg); int error = 0; size_t len; struct anon_map *amp; ! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as)); ASSERT(newseg->s_as->a_proc->p_parent == curproc); /* * If segment has anon reserved, reserve more for the new seg. * For a MAP_NORESERVE segment swresv will be a count of all the
*** 1870,1880 **** /* * We don't need any segment level locks for "segvn" data * since the address space is "write" locked. */ ! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock)); /* * Fail the unmap if pages are SOFTLOCKed through this mapping. * softlockcnt is protected from change by the as write lock. */ --- 1870,1880 ---- /* * We don't need any segment level locks for "segvn" data * since the address space is "write" locked. */ ! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as)); /* * Fail the unmap if pages are SOFTLOCKed through this mapping. * softlockcnt is protected from change by the as write lock. */
*** 2420,2430 **** /* * We don't need any segment level locks for "segvn" data * since the address space is "write" locked. */ ! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock)); ASSERT(svd->tr_state == SEGVN_TR_OFF); ASSERT(svd->rcookie == HAT_INVALID_REGION_COOKIE); /* --- 2420,2430 ---- /* * We don't need any segment level locks for "segvn" data * since the address space is "write" locked. */ ! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as)); ASSERT(svd->tr_state == SEGVN_TR_OFF); ASSERT(svd->rcookie == HAT_INVALID_REGION_COOKIE); /*
*** 2570,2580 **** u_offset_t offset; ulong_t anon_index; struct anon_map *amp; struct anon *ap = NULL; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); ASSERT(SEGVN_LOCK_HELD(seg->s_as, &svd->lock)); if ((amp = svd->amp) != NULL) anon_index = svd->anon_index + seg_page(seg, addr); --- 2570,2580 ---- u_offset_t offset; ulong_t anon_index; struct anon_map *amp; struct anon *ap = NULL; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); ASSERT(SEGVN_LOCK_HELD(seg->s_as, &svd->lock)); if ((amp = svd->amp) != NULL) anon_index = svd->anon_index + seg_page(seg, addr);
*** 4959,4978 **** caddr_t lpgaddr, lpgeaddr; size_t pgsz; anon_sync_obj_t cookie; int brkcow = BREAK_COW_SHARE(rw, type, svd->type); ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); ASSERT(svd->amp == NULL || svd->rcookie == HAT_INVALID_REGION_COOKIE); /* * First handle the easy stuff */ if (type == F_SOFTUNLOCK) { if (rw == S_READ_NOCOW) { rw = S_READ; ! ASSERT(AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock)); } SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); pgsz = (seg->s_szc == 0) ? PAGESIZE : page_get_pagesize(seg->s_szc); VM_STAT_COND_ADD(pgsz > PAGESIZE, segvnvmstats.fltanpages[16]); --- 4959,4978 ---- caddr_t lpgaddr, lpgeaddr; size_t pgsz; anon_sync_obj_t cookie; int brkcow = BREAK_COW_SHARE(rw, type, svd->type); ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); ASSERT(svd->amp == NULL || svd->rcookie == HAT_INVALID_REGION_COOKIE); /* * First handle the easy stuff */ if (type == F_SOFTUNLOCK) { if (rw == S_READ_NOCOW) { rw = S_READ; ! ASSERT(AS_WRITE_HELD(seg->s_as)); } SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); pgsz = (seg->s_szc == 0) ? PAGESIZE : page_get_pagesize(seg->s_szc); VM_STAT_COND_ADD(pgsz > PAGESIZE, segvnvmstats.fltanpages[16]);
*** 5113,5123 **** if (lpgeaddr - lpgaddr > pgsz) { demote = 1; } } ! ASSERT(demote || AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock)); if (demote) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); if (seg->s_szc != 0) { --- 5113,5123 ---- if (lpgeaddr - lpgaddr > pgsz) { demote = 1; } } ! ASSERT(demote || AS_WRITE_HELD(seg->s_as)); if (demote) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); if (seg->s_szc != 0) {
*** 5167,5177 **** * only needed for the code above. After * that we treat it as S_READ. */ if (rw == S_READ_NOCOW) { ASSERT(type == F_SOFTLOCK); ! ASSERT(AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock)); rw = S_READ; } amp = svd->amp; --- 5167,5177 ---- * only needed for the code above. After * that we treat it as S_READ. */ if (rw == S_READ_NOCOW) { ASSERT(type == F_SOFTLOCK); ! ASSERT(AS_WRITE_HELD(seg->s_as)); rw = S_READ; } amp = svd->amp;
*** 5638,5648 **** struct segvn_data *svd = (struct segvn_data *)seg->s_data; int err; struct anon_map *amp; vnode_t *vp; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); if ((amp = svd->amp) != NULL) { struct anon *ap; --- 5638,5648 ---- struct segvn_data *svd = (struct segvn_data *)seg->s_data; int err; struct anon_map *amp; vnode_t *vp; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); if ((amp = svd->amp) != NULL) { struct anon *ap;
*** 5695,5705 **** size_t pgsz; pgcnt_t pgcnt; anon_sync_obj_t cookie; int unload_done = 0; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); if ((svd->maxprot & prot) != prot) return (EACCES); /* violated maxprot */ SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); --- 5695,5705 ---- size_t pgsz; pgcnt_t pgcnt; anon_sync_obj_t cookie; int unload_done = 0; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); if ((svd->maxprot & prot) != prot) return (EACCES); /* violated maxprot */ SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER);
*** 5772,5782 **** /* * If we are holding the as lock as a reader then * we need to return IE_RETRY and let the as * layer drop and re-acquire the lock as a writer. */ ! if (AS_READ_HELD(seg->s_as, &seg->s_as->a_lock)) return (IE_RETRY); VM_STAT_ADD(segvnvmstats.demoterange[1]); if (svd->type == MAP_PRIVATE || svd->vp != NULL) { err = segvn_demote_range(seg, addr, len, SDR_END, 0); --- 5772,5782 ---- /* * If we are holding the as lock as a reader then * we need to return IE_RETRY and let the as * layer drop and re-acquire the lock as a writer. */ ! if (AS_READ_HELD(seg->s_as)) return (IE_RETRY); VM_STAT_ADD(segvnvmstats.demoterange[1]); if (svd->type == MAP_PRIVATE || svd->vp != NULL) { err = segvn_demote_range(seg, addr, len, SDR_END, 0);
*** 6098,6108 **** size_t pgsz = page_get_pagesize(szc); pgcnt_t pgcnt = page_get_pagecnt(szc); int err; u_offset_t off = svd->offset + (uintptr_t)(addr - seg->s_base); ! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock)); ASSERT(addr >= seg->s_base && eaddr <= seg->s_base + seg->s_size); if (seg->s_szc == szc || segvn_lpg_disable != 0) { return (0); } --- 6098,6108 ---- size_t pgsz = page_get_pagesize(szc); pgcnt_t pgcnt = page_get_pagecnt(szc); int err; u_offset_t off = svd->offset + (uintptr_t)(addr - seg->s_base); ! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as)); ASSERT(addr >= seg->s_base && eaddr <= seg->s_base + seg->s_size); if (seg->s_szc == szc || segvn_lpg_disable != 0) { return (0); }
*** 6386,6396 **** page_t *anon_pl[1 + 1], *pp; struct anon *ap, *oldap; uint_t prot = svd->prot, vpprot; int pageflag = 0; ! ASSERT(AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock) || SEGVN_WRITE_HELD(seg->s_as, &svd->lock)); ASSERT(svd->softlockcnt == 0); if (vp == NULL && amp == NULL) { ASSERT(svd->rcookie == HAT_INVALID_REGION_COOKIE); --- 6386,6396 ---- page_t *anon_pl[1 + 1], *pp; struct anon *ap, *oldap; uint_t prot = svd->prot, vpprot; int pageflag = 0; ! ASSERT(AS_WRITE_HELD(seg->s_as) || SEGVN_WRITE_HELD(seg->s_as, &svd->lock)); ASSERT(svd->softlockcnt == 0); if (vp == NULL && amp == NULL) { ASSERT(svd->rcookie == HAT_INVALID_REGION_COOKIE);
*** 6598,6608 **** struct segvn_data *svd = (struct segvn_data *)seg->s_data; struct seg *nseg; size_t nsize; struct segvn_data *nsvd; ! ASSERT(AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock)); ASSERT(svd->tr_state == SEGVN_TR_OFF); ASSERT(addr >= seg->s_base); ASSERT(addr <= seg->s_base + seg->s_size); ASSERT(svd->rcookie == HAT_INVALID_REGION_COOKIE); --- 6598,6608 ---- struct segvn_data *svd = (struct segvn_data *)seg->s_data; struct seg *nseg; size_t nsize; struct segvn_data *nsvd; ! ASSERT(AS_WRITE_HELD(seg->s_as)); ASSERT(svd->tr_state == SEGVN_TR_OFF); ASSERT(addr >= seg->s_base); ASSERT(addr <= seg->s_base + seg->s_size); ASSERT(svd->rcookie == HAT_INVALID_REGION_COOKIE);
*** 6753,6763 **** struct segvn_data *svd = (struct segvn_data *)seg->s_data; int err; uint_t szc = seg->s_szc; uint_t tszcvec; ! ASSERT(AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock)); ASSERT(svd->tr_state == SEGVN_TR_OFF); ASSERT(szc != 0); pgsz = page_get_pagesize(szc); ASSERT(seg->s_base != addr || seg->s_size != len); ASSERT(addr >= seg->s_base && eaddr <= seg->s_base + seg->s_size); --- 6753,6763 ---- struct segvn_data *svd = (struct segvn_data *)seg->s_data; int err; uint_t szc = seg->s_szc; uint_t tszcvec; ! ASSERT(AS_WRITE_HELD(seg->s_as)); ASSERT(svd->tr_state == SEGVN_TR_OFF); ASSERT(szc != 0); pgsz = page_get_pagesize(szc); ASSERT(seg->s_base != addr || seg->s_size != len); ASSERT(addr >= seg->s_base && eaddr <= seg->s_base + seg->s_size);
*** 6882,6892 **** segvn_checkprot(struct seg *seg, caddr_t addr, size_t len, uint_t prot) { struct segvn_data *svd = (struct segvn_data *)seg->s_data; struct vpage *vp, *evp; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); /* * If segment protection can be used, simply check against them. */ --- 6882,6892 ---- segvn_checkprot(struct seg *seg, caddr_t addr, size_t len, uint_t prot) { struct segvn_data *svd = (struct segvn_data *)seg->s_data; struct vpage *vp, *evp; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); /* * If segment protection can be used, simply check against them. */
*** 6916,6926 **** segvn_getprot(struct seg *seg, caddr_t addr, size_t len, uint_t *protv) { struct segvn_data *svd = (struct segvn_data *)seg->s_data; size_t pgno = seg_page(seg, addr + len) - seg_page(seg, addr) + 1; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); if (pgno != 0) { SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); if (svd->pageprot == 0) { do { --- 6916,6926 ---- segvn_getprot(struct seg *seg, caddr_t addr, size_t len, uint_t *protv) { struct segvn_data *svd = (struct segvn_data *)seg->s_data; size_t pgno = seg_page(seg, addr + len) - seg_page(seg, addr) + 1; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); if (pgno != 0) { SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); if (svd->pageprot == 0) { do {
*** 6942,6963 **** static u_offset_t segvn_getoffset(struct seg *seg, caddr_t addr) { struct segvn_data *svd = (struct segvn_data *)seg->s_data; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); return (svd->offset + (uintptr_t)(addr - seg->s_base)); } /*ARGSUSED*/ static int segvn_gettype(struct seg *seg, caddr_t addr) { struct segvn_data *svd = (struct segvn_data *)seg->s_data; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); return (svd->type | (svd->flags & (MAP_NORESERVE | MAP_TEXT | MAP_INITDATA))); } --- 6942,6963 ---- static u_offset_t segvn_getoffset(struct seg *seg, caddr_t addr) { struct segvn_data *svd = (struct segvn_data *)seg->s_data; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); return (svd->offset + (uintptr_t)(addr - seg->s_base)); } /*ARGSUSED*/ static int segvn_gettype(struct seg *seg, caddr_t addr) { struct segvn_data *svd = (struct segvn_data *)seg->s_data; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); return (svd->type | (svd->flags & (MAP_NORESERVE | MAP_TEXT | MAP_INITDATA))); }
*** 6965,6975 **** static int segvn_getvp(struct seg *seg, caddr_t addr, struct vnode **vpp) { struct segvn_data *svd = (struct segvn_data *)seg->s_data; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); *vpp = svd->vp; return (0); } --- 6965,6975 ---- static int segvn_getvp(struct seg *seg, caddr_t addr, struct vnode **vpp) { struct segvn_data *svd = (struct segvn_data *)seg->s_data; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); *vpp = svd->vp; return (0); }
*** 6992,7003 **** size_t page; struct vnode *vp1, *vp2; u_offset_t off1, off2; struct anon_map *amp; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); ! ASSERT(AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock) || SEGVN_LOCK_HELD(seg->s_as, &svd->lock)); if (addr + delta < seg->s_base || addr + delta >= (seg->s_base + seg->s_size)) return (-1); /* exceeded segment bounds */ --- 6992,7003 ---- size_t page; struct vnode *vp1, *vp2; u_offset_t off1, off2; struct anon_map *amp; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); ! ASSERT(AS_WRITE_HELD(seg->s_as) || SEGVN_LOCK_HELD(seg->s_as, &svd->lock)); if (addr + delta < seg->s_base || addr + delta >= (seg->s_base + seg->s_size)) return (-1); /* exceeded segment bounds */
*** 7098,7108 **** pgcnt_t pgcnt = 0; pgcnt_t npages; pgcnt_t page; ulong_t anon_index; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); /* * Find pages unmapped by our caller and force them * out to the virtual swap device. --- 7098,7108 ---- pgcnt_t pgcnt = 0; pgcnt_t npages; pgcnt_t page; ulong_t anon_index; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); /* * Find pages unmapped by our caller and force them * out to the virtual swap device.
*** 7277,7287 **** ulong_t anon_index; struct anon_map *amp; struct anon *ap; anon_sync_obj_t cookie; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); if (svd->softlockcnt > 0) { /* --- 7277,7287 ---- ulong_t anon_index; struct anon_map *amp; struct anon *ap; anon_sync_obj_t cookie; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); if (svd->softlockcnt > 0) { /*
*** 7499,7509 **** struct anon_map *amp; /* XXX - for locknest */ struct anon *ap; uint_t attr; anon_sync_obj_t cookie; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); if (svd->amp == NULL && svd->vp == NULL) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); bzero(vec, btopr(len)); --- 7499,7509 ---- struct anon_map *amp; /* XXX - for locknest */ struct anon *ap; uint_t attr; anon_sync_obj_t cookie; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); if (svd->amp == NULL && svd->vp == NULL) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); bzero(vec, btopr(len));
*** 7675,7685 **** /* * Hold write lock on address space because may split or concatenate * segments */ ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); /* * If this is a shm, use shm's project and zone, else use * project and zone of calling process */ --- 7675,7685 ---- /* * Hold write lock on address space because may split or concatenate * segments */ ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); /* * If this is a shm, use shm's project and zone, else use * project and zone of calling process */
*** 8091,8101 **** struct seg *next; lgrp_mem_policy_t policy; struct seg *prev; struct vnode *vp; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); /* * In case of MADV_FREE, we won't be modifying any segment private * data structures; so, we only need to grab READER's lock */ --- 8091,8101 ---- struct seg *next; lgrp_mem_policy_t policy; struct seg *prev; struct vnode *vp; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); /* * In case of MADV_FREE, we won't be modifying any segment private * data structures; so, we only need to grab READER's lock */
*** 8219,8230 **** /* * For private memory, need writers lock on * address space because the segment may be * split or concatenated when changing policy */ ! if (AS_READ_HELD(seg->s_as, ! &seg->s_as->a_lock)) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); return (IE_RETRY); } already_set = lgrp_privm_policy_set(policy, --- 8219,8229 ---- /* * For private memory, need writers lock on * address space because the segment may be * split or concatenated when changing policy */ ! if (AS_READ_HELD(seg->s_as)) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); return (IE_RETRY); } already_set = lgrp_privm_policy_set(policy,
*** 8370,8380 **** * For private memory, need writers lock on * address space because the segment may be * split or concatenated when changing policy */ if (svd->type == MAP_PRIVATE && ! AS_READ_HELD(seg->s_as, &seg->s_as->a_lock)) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); return (IE_RETRY); } /* --- 8369,8379 ---- * For private memory, need writers lock on * address space because the segment may be * split or concatenated when changing policy */ if (svd->type == MAP_PRIVATE && ! AS_READ_HELD(seg->s_as)) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); return (IE_RETRY); } /*
*** 8556,8566 **** struct segvn_data *svd = (struct segvn_data *)seg->s_data; struct vpage *bvpp, *evpp; size_t page; int ret = 0; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); /* Can't support something we don't know about */ if (behav != SEGP_INH_ZERO) return (ENOTSUP); --- 8555,8565 ---- struct segvn_data *svd = (struct segvn_data *)seg->s_data; struct vpage *bvpp, *evpp; size_t page; int ret = 0; ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); /* Can't support something we don't know about */ if (behav != SEGP_INH_ZERO) return (ENOTSUP);
*** 8825,8835 **** #endif TRACE_2(TR_FAC_PHYSIO, TR_PHYSIO_SEGVN_START, "segvn_pagelock: start seg %p addr %p", seg, addr); ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); ASSERT(type == L_PAGELOCK || type == L_PAGEUNLOCK); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); /* --- 8824,8834 ---- #endif TRACE_2(TR_FAC_PHYSIO, TR_PHYSIO_SEGVN_START, "segvn_pagelock: start seg %p addr %p", seg, addr); ! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); ASSERT(type == L_PAGELOCK || type == L_PAGEUNLOCK); SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); /*
*** 9447,9457 **** npages = np = btop(len); ASSERT(npages); ASSERT(svd->vp == NULL && svd->amp != NULL); ASSERT(svd->softlockcnt >= npages); ! ASSERT(async || AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); pl = pplist; ASSERT(pl[np] == NOPCACHE_SHWLIST || pl[np] == PCACHE_SHWLIST); ASSERT(!async || pl[np] == PCACHE_SHWLIST); --- 9446,9456 ---- npages = np = btop(len); ASSERT(npages); ASSERT(svd->vp == NULL && svd->amp != NULL); ASSERT(svd->softlockcnt >= npages); ! ASSERT(async || AS_LOCK_HELD(seg->s_as)); pl = pplist; ASSERT(pl[np] == NOPCACHE_SHWLIST || pl[np] == PCACHE_SHWLIST); ASSERT(!async || pl[np] == PCACHE_SHWLIST);
*** 9725,9735 **** lgrp_id_t lgrp_id; lgrp_id_t olid; int first; struct anon_map *amp; ! ASSERT(AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); ASSERT(SEGVN_WRITE_HELD(seg->s_as, &svd->lock)); ASSERT(p != NULL); ASSERT(svd->tr_state == SEGVN_TR_INIT); ASSERT(!HAT_IS_REGION_COOKIE_VALID(svd->rcookie)); ASSERT(svd->flags & MAP_TEXT); --- 9724,9734 ---- lgrp_id_t lgrp_id; lgrp_id_t olid; int first; struct anon_map *amp; ! ASSERT(AS_LOCK_HELD(seg->s_as)); ASSERT(SEGVN_WRITE_HELD(seg->s_as, &svd->lock)); ASSERT(p != NULL); ASSERT(svd->tr_state == SEGVN_TR_INIT); ASSERT(!HAT_IS_REGION_COOKIE_VALID(svd->rcookie)); ASSERT(svd->flags & MAP_TEXT);
*** 10006,10017 **** svntr_t *svntrp; svntr_t **prv_svntrp; lgrp_id_t lgrp_id = svd->tr_policy_info.mem_lgrpid; lgrp_id_t i; ! ASSERT(AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock)); ! ASSERT(AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock) || SEGVN_WRITE_HELD(seg->s_as, &svd->lock)); ASSERT(svd->tr_state == SEGVN_TR_ON); ASSERT(!HAT_IS_REGION_COOKIE_VALID(svd->rcookie)); ASSERT(svd->amp != NULL); ASSERT(svd->amp->refcnt >= 1); --- 10005,10016 ---- svntr_t *svntrp; svntr_t **prv_svntrp; lgrp_id_t lgrp_id = svd->tr_policy_info.mem_lgrpid; lgrp_id_t i; ! ASSERT(AS_LOCK_HELD(seg->s_as)); ! ASSERT(AS_WRITE_HELD(seg->s_as) || SEGVN_WRITE_HELD(seg->s_as, &svd->lock)); ASSERT(svd->tr_state == SEGVN_TR_ON); ASSERT(!HAT_IS_REGION_COOKIE_VALID(svd->rcookie)); ASSERT(svd->amp != NULL); ASSERT(svd->amp->refcnt >= 1);
*** 10232,10250 **** /* * Use tryenter locking since we are locking as/seg and svntr hash * lock in reverse from syncrounous thread order. */ ! if (!AS_LOCK_TRYENTER(as, &as->a_lock, RW_READER)) { SEGVN_TR_ADDSTAT(nolock); if (segvn_lgrp_trthr_migrs_snpsht) { segvn_lgrp_trthr_migrs_snpsht = 0; } return; } if (!SEGVN_LOCK_TRYENTER(seg->s_as, &svd->lock, RW_WRITER)) { ! AS_LOCK_EXIT(as, &as->a_lock); SEGVN_TR_ADDSTAT(nolock); if (segvn_lgrp_trthr_migrs_snpsht) { segvn_lgrp_trthr_migrs_snpsht = 0; } return; --- 10231,10249 ---- /* * Use tryenter locking since we are locking as/seg and svntr hash * lock in reverse from syncrounous thread order. */ ! if (!AS_LOCK_TRYENTER(as, RW_READER)) { SEGVN_TR_ADDSTAT(nolock); if (segvn_lgrp_trthr_migrs_snpsht) { segvn_lgrp_trthr_migrs_snpsht = 0; } return; } if (!SEGVN_LOCK_TRYENTER(seg->s_as, &svd->lock, RW_WRITER)) { ! AS_LOCK_EXIT(as); SEGVN_TR_ADDSTAT(nolock); if (segvn_lgrp_trthr_migrs_snpsht) { segvn_lgrp_trthr_migrs_snpsht = 0; } return;
*** 10252,10277 **** size = seg->s_size; if (svntrp->tr_amp[lgrp_id] == NULL) { size_t trmem = atomic_add_long_nv(&segvn_textrepl_bytes, size); if (trmem > segvn_textrepl_max_bytes) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); ! AS_LOCK_EXIT(as, &as->a_lock); atomic_add_long(&segvn_textrepl_bytes, -size); SEGVN_TR_ADDSTAT(normem); return; } if (anon_try_resv_zone(size, NULL) == 0) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); ! AS_LOCK_EXIT(as, &as->a_lock); atomic_add_long(&segvn_textrepl_bytes, -size); SEGVN_TR_ADDSTAT(noanon); return; } amp = anonmap_alloc(size, size, KM_NOSLEEP); if (amp == NULL) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); ! AS_LOCK_EXIT(as, &as->a_lock); atomic_add_long(&segvn_textrepl_bytes, -size); anon_unresv_zone(size, NULL); SEGVN_TR_ADDSTAT(nokmem); return; } --- 10251,10276 ---- size = seg->s_size; if (svntrp->tr_amp[lgrp_id] == NULL) { size_t trmem = atomic_add_long_nv(&segvn_textrepl_bytes, size); if (trmem > segvn_textrepl_max_bytes) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); ! AS_LOCK_EXIT(as); atomic_add_long(&segvn_textrepl_bytes, -size); SEGVN_TR_ADDSTAT(normem); return; } if (anon_try_resv_zone(size, NULL) == 0) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); ! AS_LOCK_EXIT(as); atomic_add_long(&segvn_textrepl_bytes, -size); SEGVN_TR_ADDSTAT(noanon); return; } amp = anonmap_alloc(size, size, KM_NOSLEEP); if (amp == NULL) { SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); ! AS_LOCK_EXIT(as); atomic_add_long(&segvn_textrepl_bytes, -size); anon_unresv_zone(size, NULL); SEGVN_TR_ADDSTAT(nokmem); return; }
*** 10299,10309 **** svd->tr_policy_info.mem_lgrpid = lgrp_id; svd->amp = svntrp->tr_amp[lgrp_id]; p->p_tr_lgrpid = NLGRPS_MAX; SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); ! AS_LOCK_EXIT(as, &as->a_lock); ASSERT(svntrp->tr_refcnt != 0); ASSERT(svd->vp == svntrp->tr_vp); ASSERT(svd->tr_policy_info.mem_lgrpid == lgrp_id); ASSERT(svd->amp != NULL && svd->amp == svntrp->tr_amp[lgrp_id]); --- 10298,10308 ---- svd->tr_policy_info.mem_lgrpid = lgrp_id; svd->amp = svntrp->tr_amp[lgrp_id]; p->p_tr_lgrpid = NLGRPS_MAX; SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); ! AS_LOCK_EXIT(as); ASSERT(svntrp->tr_refcnt != 0); ASSERT(svd->vp == svntrp->tr_vp); ASSERT(svd->tr_policy_info.mem_lgrpid == lgrp_id); ASSERT(svd->amp != NULL && svd->amp == svntrp->tr_amp[lgrp_id]);