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