Print this page
patch as-lock-macro-simplification
*** 1316,1328 ****
NULL, NULL, NULL, 0);
/*
* We grab the first hat for the kernel,
*/
! AS_LOCK_ENTER(&kas, &kas.a_lock, RW_WRITER);
kas.a_hat = hat_alloc(&kas);
! AS_LOCK_EXIT(&kas, &kas.a_lock);
/*
* Initialize hblk_reserve.
*/
((struct hme_blk *)hblk_reserve)->hblk_nextpa =
--- 1316,1328 ----
NULL, NULL, NULL, 0);
/*
* We grab the first hat for the kernel,
*/
! AS_LOCK_ENTER(&kas, RW_WRITER);
kas.a_hat = hat_alloc(&kas);
! AS_LOCK_EXIT(&kas);
/*
* Initialize hblk_reserve.
*/
((struct hme_blk *)hblk_reserve)->hblk_nextpa =
*** 1461,1471 ****
sfmmu_t *sfmmup;
int i;
uint64_t cnum;
extern uint_t get_color_start(struct as *);
! ASSERT(AS_WRITE_HELD(as, &as->a_lock));
sfmmup = kmem_cache_alloc(sfmmuid_cache, KM_SLEEP);
sfmmup->sfmmu_as = as;
sfmmup->sfmmu_flags = 0;
sfmmup->sfmmu_tteflags = 0;
sfmmup->sfmmu_rtteflags = 0;
--- 1461,1471 ----
sfmmu_t *sfmmup;
int i;
uint64_t cnum;
extern uint_t get_color_start(struct as *);
! ASSERT(AS_WRITE_HELD(as));
sfmmup = kmem_cache_alloc(sfmmuid_cache, KM_SLEEP);
sfmmup->sfmmu_as = as;
sfmmup->sfmmu_flags = 0;
sfmmup->sfmmu_tteflags = 0;
sfmmup->sfmmu_rtteflags = 0;
*** 1915,1925 ****
* Called from as_free when an address space is being destroyed.
*/
void
hat_free_start(struct hat *sfmmup)
{
! ASSERT(AS_WRITE_HELD(sfmmup->sfmmu_as, &sfmmup->sfmmu_as->a_lock));
ASSERT(sfmmup != ksfmmup);
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
sfmmup->sfmmu_free = 1;
if (sfmmup->sfmmu_scdp != NULL) {
--- 1915,1925 ----
* Called from as_free when an address space is being destroyed.
*/
void
hat_free_start(struct hat *sfmmup)
{
! ASSERT(AS_WRITE_HELD(sfmmup->sfmmu_as));
ASSERT(sfmmup != ksfmmup);
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
sfmmup->sfmmu_free = 1;
if (sfmmup->sfmmu_scdp != NULL) {
*** 2245,2256 ****
ASSERT(!SFMMU_IS_SHMERID_VALID(rid));
XHAT_MEMLOAD(hat, addr, pp, attr, flags);
return;
}
! ASSERT((hat == ksfmmup) ||
! AS_LOCK_HELD(hat->sfmmu_as, &hat->sfmmu_as->a_lock));
if (flags & ~SFMMU_LOAD_ALLFLAG)
cmn_err(CE_NOTE, "hat_memload: unsupported flags %d",
flags & ~SFMMU_LOAD_ALLFLAG);
--- 2245,2255 ----
ASSERT(!SFMMU_IS_SHMERID_VALID(rid));
XHAT_MEMLOAD(hat, addr, pp, attr, flags);
return;
}
! ASSERT((hat == ksfmmup) || AS_LOCK_HELD(hat->sfmmu_as));
if (flags & ~SFMMU_LOAD_ALLFLAG)
cmn_err(CE_NOTE, "hat_memload: unsupported flags %d",
flags & ~SFMMU_LOAD_ALLFLAG);
*** 2301,2312 ****
return;
}
ASSERT(!(flags & ~SFMMU_LOAD_ALLFLAG));
ASSERT(!(attr & ~SFMMU_LOAD_ALLATTR));
! ASSERT((hat == ksfmmup) ||
! AS_LOCK_HELD(hat->sfmmu_as, &hat->sfmmu_as->a_lock));
if (len == 0)
panic("hat_devload: zero len");
if (flags & ~SFMMU_LOAD_ALLFLAG)
cmn_err(CE_NOTE, "hat_devload: unsupported flags %d",
flags & ~SFMMU_LOAD_ALLFLAG);
--- 2300,2310 ----
return;
}
ASSERT(!(flags & ~SFMMU_LOAD_ALLFLAG));
ASSERT(!(attr & ~SFMMU_LOAD_ALLATTR));
! ASSERT((hat == ksfmmup) || AS_LOCK_HELD(hat->sfmmu_as));
if (len == 0)
panic("hat_devload: zero len");
if (flags & ~SFMMU_LOAD_ALLFLAG)
cmn_err(CE_NOTE, "hat_devload: unsupported flags %d",
flags & ~SFMMU_LOAD_ALLFLAG);
*** 3971,3982 ****
caddr_t endaddr;
ASSERT(sfmmup != NULL);
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
! ASSERT((sfmmup == ksfmmup) ||
! AS_LOCK_HELD(sfmmup->sfmmu_as, &sfmmup->sfmmu_as->a_lock));
ASSERT((len & MMU_PAGEOFFSET) == 0);
endaddr = addr + len;
hblktag.htag_id = sfmmup;
hblktag.htag_rid = SFMMU_INVALID_SHMERID;
--- 3969,3979 ----
caddr_t endaddr;
ASSERT(sfmmup != NULL);
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
! ASSERT((sfmmup == ksfmmup) || AS_LOCK_HELD(sfmmup->sfmmu_as));
ASSERT((len & MMU_PAGEOFFSET) == 0);
endaddr = addr + len;
hblktag.htag_id = sfmmup;
hblktag.htag_rid = SFMMU_INVALID_SHMERID;
*** 4768,4779 ****
tte_t tte;
ASSERT(sfmmup != NULL);
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
! ASSERT((sfmmup == ksfmmup) ||
! AS_LOCK_HELD(sfmmup->sfmmu_as, &sfmmup->sfmmu_as->a_lock));
if (sfmmup == ksfmmup) {
while ((pfn = sfmmu_vatopfn(addr, sfmmup, &tte))
== PFN_SUSPENDED) {
sfmmu_vatopfn_suspended(addr, sfmmup, &tte);
--- 4765,4775 ----
tte_t tte;
ASSERT(sfmmup != NULL);
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
! ASSERT((sfmmup == ksfmmup) || AS_LOCK_HELD(sfmmup->sfmmu_as));
if (sfmmup == ksfmmup) {
while ((pfn = sfmmu_vatopfn(addr, sfmmup, &tte))
== PFN_SUSPENDED) {
sfmmu_vatopfn_suspended(addr, sfmmup, &tte);
*** 4918,4929 ****
cpuset_t cpuset;
demap_range_t dmr;
CPUSET_ZERO(cpuset);
! ASSERT((sfmmup == ksfmmup) ||
! AS_LOCK_HELD(sfmmup->sfmmu_as, &sfmmup->sfmmu_as->a_lock));
ASSERT((len & MMU_PAGEOFFSET) == 0);
ASSERT(((uintptr_t)addr & MMU_PAGEOFFSET) == 0);
if ((attr & PROT_USER) && (mode != SFMMU_CLRATTR) &&
((addr + len) > (caddr_t)USERLIMIT)) {
--- 4914,4924 ----
cpuset_t cpuset;
demap_range_t dmr;
CPUSET_ZERO(cpuset);
! ASSERT((sfmmup == ksfmmup) || AS_LOCK_HELD(sfmmup->sfmmu_as));
ASSERT((len & MMU_PAGEOFFSET) == 0);
ASSERT(((uintptr_t)addr & MMU_PAGEOFFSET) == 0);
if ((attr & PROT_USER) && (mode != SFMMU_CLRATTR) &&
((addr + len) > (caddr_t)USERLIMIT)) {
*** 5712,5722 ****
xhat_unload_callback_all(sfmmup->sfmmu_as, addr,
len, flags, callback);
}
ASSERT((sfmmup == ksfmmup) || (flags & HAT_UNLOAD_OTHER) || \
! AS_LOCK_HELD(sfmmup->sfmmu_as, &sfmmup->sfmmu_as->a_lock));
ASSERT(sfmmup != NULL);
ASSERT((len & MMU_PAGEOFFSET) == 0);
ASSERT(!((uintptr_t)addr & MMU_PAGEOFFSET));
--- 5707,5717 ----
xhat_unload_callback_all(sfmmup->sfmmu_as, addr,
len, flags, callback);
}
ASSERT((sfmmup == ksfmmup) || (flags & HAT_UNLOAD_OTHER) || \
! AS_LOCK_HELD(sfmmup->sfmmu_as));
ASSERT(sfmmup != NULL);
ASSERT((len & MMU_PAGEOFFSET) == 0);
ASSERT(!((uintptr_t)addr & MMU_PAGEOFFSET));
*** 6330,6341 ****
struct hme_blk *hmeblkp, *list = NULL;
caddr_t endaddr;
cpuset_t cpuset;
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
! ASSERT((sfmmup == ksfmmup) ||
! AS_LOCK_HELD(sfmmup->sfmmu_as, &sfmmup->sfmmu_as->a_lock));
ASSERT((len & MMU_PAGEOFFSET) == 0);
ASSERT((clearflag == HAT_SYNC_DONTZERO) ||
(clearflag == HAT_SYNC_ZERORM));
CPUSET_ZERO(cpuset);
--- 6325,6335 ----
struct hme_blk *hmeblkp, *list = NULL;
caddr_t endaddr;
cpuset_t cpuset;
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
! ASSERT((sfmmup == ksfmmup) || AS_LOCK_HELD(sfmmup->sfmmu_as));
ASSERT((len & MMU_PAGEOFFSET) == 0);
ASSERT((clearflag == HAT_SYNC_DONTZERO) ||
(clearflag == HAT_SYNC_ZERORM));
CPUSET_ZERO(cpuset);
*** 7974,7984 ****
pfn_t pfn;
tte_t tte;
/*
* We would like to
! * ASSERT(AS_LOCK_HELD(as, &as->a_lock));
* but we can't because the iommu driver will call this
* routine at interrupt time and it can't grab the as lock
* or it will deadlock: A thread could have the as lock
* and be waiting for io. The io can't complete
* because the interrupt thread is blocked trying to grab
--- 7968,7978 ----
pfn_t pfn;
tte_t tte;
/*
* We would like to
! * ASSERT(AS_LOCK_HELD(as));
* but we can't because the iommu driver will call this
* routine at interrupt time and it can't grab the as lock
* or it will deadlock: A thread could have the as lock
* and be waiting for io. The io can't complete
* because the interrupt thread is blocked trying to grab
*** 14029,14039 ****
return (HAT_INVALID_REGION_COOKIE);
}
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
ASSERT(sfmmup != ksfmmup);
! ASSERT(AS_WRITE_HELD(sfmmup->sfmmu_as, &sfmmup->sfmmu_as->a_lock));
ASSERT(srdp->srd_refcnt > 0);
ASSERT(!(flags & ~HAT_REGION_TYPE_MASK));
ASSERT(flags == HAT_REGION_TEXT || flags == HAT_REGION_ISM);
ASSERT(r_pgszc < mmu_page_sizes);
if (!IS_P2ALIGNED(r_saddr, TTEBYTES(r_pgszc)) ||
--- 14023,14033 ----
return (HAT_INVALID_REGION_COOKIE);
}
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
ASSERT(sfmmup != ksfmmup);
! ASSERT(AS_WRITE_HELD(sfmmup->sfmmu_as));
ASSERT(srdp->srd_refcnt > 0);
ASSERT(!(flags & ~HAT_REGION_TYPE_MASK));
ASSERT(flags == HAT_REGION_TEXT || flags == HAT_REGION_ISM);
ASSERT(r_pgszc < mmu_page_sizes);
if (!IS_P2ALIGNED(r_saddr, TTEBYTES(r_pgszc)) ||
*** 14332,14342 ****
}
ASSERT(rgnp != NULL);
ASSERT(rgnp->rgn_id == rid);
ASSERT((rgnp->rgn_flags & SFMMU_REGION_TYPE_MASK) == r_type);
ASSERT(!(rgnp->rgn_flags & SFMMU_REGION_FREE));
! ASSERT(AS_LOCK_HELD(sfmmup->sfmmu_as, &sfmmup->sfmmu_as->a_lock));
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
if (r_type == SFMMU_REGION_HME && sfmmup->sfmmu_as->a_xhat != NULL) {
xhat_unload_callback_all(sfmmup->sfmmu_as, rgnp->rgn_saddr,
rgnp->rgn_size, 0, NULL);
--- 14326,14336 ----
}
ASSERT(rgnp != NULL);
ASSERT(rgnp->rgn_id == rid);
ASSERT((rgnp->rgn_flags & SFMMU_REGION_TYPE_MASK) == r_type);
ASSERT(!(rgnp->rgn_flags & SFMMU_REGION_FREE));
! ASSERT(AS_LOCK_HELD(sfmmup->sfmmu_as));
ASSERT(sfmmup->sfmmu_xhat_provider == NULL);
if (r_type == SFMMU_REGION_HME && sfmmup->sfmmu_as->a_xhat != NULL) {
xhat_unload_callback_all(sfmmup->sfmmu_as, rgnp->rgn_saddr,
rgnp->rgn_size, 0, NULL);
*** 15128,15138 ****
sf_scd_t *old_scdp;
ASSERT(srdp != NULL);
ASSERT(scdp != NULL);
ASSERT(scdp->scd_refcnt > 0);
! ASSERT(AS_WRITE_HELD(sfmmup->sfmmu_as, &sfmmup->sfmmu_as->a_lock));
if ((old_scdp = sfmmup->sfmmu_scdp) != NULL) {
ASSERT(old_scdp != scdp);
mutex_enter(&old_scdp->scd_mutex);
--- 15122,15132 ----
sf_scd_t *old_scdp;
ASSERT(srdp != NULL);
ASSERT(scdp != NULL);
ASSERT(scdp->scd_refcnt > 0);
! ASSERT(AS_WRITE_HELD(sfmmup->sfmmu_as));
if ((old_scdp = sfmmup->sfmmu_scdp) != NULL) {
ASSERT(old_scdp != scdp);
mutex_enter(&old_scdp->scd_mutex);
*** 15240,15250 ****
sf_srd_t *srdp = sfmmup->sfmmu_srdp;
sf_scd_t *scdp, *new_scdp;
int ret;
ASSERT(srdp != NULL);
! ASSERT(AS_WRITE_HELD(sfmmup->sfmmu_as, &sfmmup->sfmmu_as->a_lock));
mutex_enter(&srdp->srd_scd_mutex);
for (scdp = srdp->srd_scdp; scdp != NULL;
scdp = scdp->scd_next) {
SF_RGNMAP_EQUAL(&scdp->scd_region_map,
--- 15234,15244 ----
sf_srd_t *srdp = sfmmup->sfmmu_srdp;
sf_scd_t *scdp, *new_scdp;
int ret;
ASSERT(srdp != NULL);
! ASSERT(AS_WRITE_HELD(sfmmup->sfmmu_as));
mutex_enter(&srdp->srd_scd_mutex);
for (scdp = srdp->srd_scdp; scdp != NULL;
scdp = scdp->scd_next) {
SF_RGNMAP_EQUAL(&scdp->scd_region_map,
*** 15346,15356 ****
ASSERT(r_type != SFMMU_REGION_ISM ||
SFMMU_FLAGS_ISSET(sfmmup, HAT_ISMBUSY));
ASSERT(scdp->scd_refcnt);
ASSERT(!sfmmup->sfmmu_free);
ASSERT(sfmmu_hat_lock_held(sfmmup));
! ASSERT(AS_LOCK_HELD(sfmmup->sfmmu_as, &sfmmup->sfmmu_as->a_lock));
/*
* Wait for ISM maps to be updated.
*/
if (r_type != SFMMU_REGION_ISM) {
--- 15340,15350 ----
ASSERT(r_type != SFMMU_REGION_ISM ||
SFMMU_FLAGS_ISSET(sfmmup, HAT_ISMBUSY));
ASSERT(scdp->scd_refcnt);
ASSERT(!sfmmup->sfmmu_free);
ASSERT(sfmmu_hat_lock_held(sfmmup));
! ASSERT(AS_LOCK_HELD(sfmmup->sfmmu_as));
/*
* Wait for ISM maps to be updated.
*/
if (r_type != SFMMU_REGION_ISM) {