Print this page
patch as-lock-macro-simplification
*** 366,376 ****
/*
* Since the address space is "write" locked, we
* don't need the segment lock to protect "segdev" data.
*/
! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock));
hat_map(seg->s_as->a_hat, seg->s_base, seg->s_size, HAT_MAP);
sdp = sdp_alloc();
--- 366,376 ----
/*
* Since the address space is "write" locked, we
* don't need the segment lock to protect "segdev" data.
*/
! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as));
hat_map(seg->s_as->a_hat, seg->s_base, seg->s_size, HAT_MAP);
sdp = sdp_alloc();
*** 472,482 ****
/*
* Since the address space is "write" locked, we
* don't need the segment lock to protect "segdev" data.
*/
! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock));
newsdp = sdp_alloc();
newseg->s_ops = seg->s_ops;
newseg->s_data = (void *)newsdp;
--- 472,482 ----
/*
* Since the address space is "write" locked, we
* don't need the segment lock to protect "segdev" data.
*/
! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as));
newsdp = sdp_alloc();
newseg->s_ops = seg->s_ops;
newseg->s_data = (void *)newsdp;
*** 644,654 ****
/*
* Since the address space is "write" locked, we
* don't need the segment lock to protect "segdev" data.
*/
! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock));
if ((sz = sdp->softlockcnt) > 0) {
/*
* Fail the unmap if pages are SOFTLOCKed through this mapping.
* softlockcnt is protected from change by the as write lock.
--- 644,654 ----
/*
* Since the address space is "write" locked, we
* don't need the segment lock to protect "segdev" data.
*/
! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as));
if ((sz = sdp->softlockcnt) > 0) {
/*
* Fail the unmap if pages are SOFTLOCKed through this mapping.
* softlockcnt is protected from change by the as write lock.
*** 1133,1143 ****
/*
* Since the address space is "write" locked, we
* don't need the segment lock to protect "segdev" data.
*/
! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock));
while (dhp != NULL)
dhp = devmap_handle_unmap(dhp);
VN_RELE(sdp->vp);
--- 1133,1143 ----
/*
* Since the address space is "write" locked, we
* don't need the segment lock to protect "segdev" data.
*/
! ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as));
while (dhp != NULL)
dhp = devmap_handle_unmap(dhp);
VN_RELE(sdp->vp);
*** 1615,1625 ****
(void *)dhp_head, (void *)seg, (void *)addr, len, type);
DEBUGF(7, (CE_CONT, "segdev_fault: dhp_head %p seg %p "
"addr %p len %lx type %x\n",
(void *)dhp_head, (void *)seg, (void *)addr, len, type));
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
/* Handle non-devmap case */
if (dhp_head == NULL)
return (segdev_faultpages(hat, seg, addr, len, type, rw, NULL));
--- 1615,1625 ----
(void *)dhp_head, (void *)seg, (void *)addr, len, type);
DEBUGF(7, (CE_CONT, "segdev_fault: dhp_head %p seg %p "
"addr %p len %lx type %x\n",
(void *)dhp_head, (void *)seg, (void *)addr, len, type));
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
/* Handle non-devmap case */
if (dhp_head == NULL)
return (segdev_faultpages(hat, seg, addr, len, type, rw, NULL));
*** 2055,2065 ****
static faultcode_t
segdev_faulta(struct seg *seg, caddr_t addr)
{
TRACE_2(TR_FAC_DEVMAP, TR_DEVMAP_FAULTA,
"segdev_faulta: seg=%p addr=%p", (void *)seg, (void *)addr);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
return (0);
}
static int
--- 2055,2065 ----
static faultcode_t
segdev_faulta(struct seg *seg, caddr_t addr)
{
TRACE_2(TR_FAC_DEVMAP, TR_DEVMAP_FAULTA,
"segdev_faulta: seg=%p addr=%p", (void *)seg, (void *)addr);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
return (0);
}
static int
*** 2073,2083 ****
size_t mlen, sz;
TRACE_4(TR_FAC_DEVMAP, TR_DEVMAP_SETPROT,
"segdev_setprot:start seg=%p addr=%p len=%lx prot=%x",
(void *)seg, (void *)addr, len, prot);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
if ((sz = sdp->softlockcnt) > 0 && dhp_head != NULL) {
/*
* Fail the setprot if pages are SOFTLOCKed through this
* mapping.
--- 2073,2083 ----
size_t mlen, sz;
TRACE_4(TR_FAC_DEVMAP, TR_DEVMAP_SETPROT,
"segdev_setprot:start seg=%p addr=%p len=%lx prot=%x",
(void *)seg, (void *)addr, len, prot);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
if ((sz = sdp->softlockcnt) > 0 && dhp_head != NULL) {
/*
* Fail the setprot if pages are SOFTLOCKed through this
* mapping.
*** 2196,2206 ****
struct vpage *vp, *evp;
TRACE_4(TR_FAC_DEVMAP, TR_DEVMAP_CHECKPROT,
"segdev_checkprot:start seg=%p addr=%p len=%lx prot=%x",
(void *)seg, (void *)addr, len, prot);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
/*
* If segment protection can be used, simply check against them
*/
rw_enter(&sdp->lock, RW_READER);
--- 2196,2206 ----
struct vpage *vp, *evp;
TRACE_4(TR_FAC_DEVMAP, TR_DEVMAP_CHECKPROT,
"segdev_checkprot:start seg=%p addr=%p len=%lx prot=%x",
(void *)seg, (void *)addr, len, prot);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
/*
* If segment protection can be used, simply check against them
*/
rw_enter(&sdp->lock, RW_READER);
*** 2233,2243 ****
size_t pgno;
TRACE_4(TR_FAC_DEVMAP, TR_DEVMAP_GETPROT,
"segdev_getprot:start seg=%p addr=%p len=%lx protv=%p",
(void *)seg, (void *)addr, len, (void *)protv);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
pgno = seg_page(seg, addr + len) - seg_page(seg, addr) + 1;
if (pgno != 0) {
rw_enter(&sdp->lock, RW_READER);
if (sdp->pageprot == 0) {
--- 2233,2243 ----
size_t pgno;
TRACE_4(TR_FAC_DEVMAP, TR_DEVMAP_GETPROT,
"segdev_getprot:start seg=%p addr=%p len=%lx protv=%p",
(void *)seg, (void *)addr, len, (void *)protv);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
pgno = seg_page(seg, addr + len) - seg_page(seg, addr) + 1;
if (pgno != 0) {
rw_enter(&sdp->lock, RW_READER);
if (sdp->pageprot == 0) {
*** 2264,2274 ****
register struct segdev_data *sdp = (struct segdev_data *)seg->s_data;
TRACE_2(TR_FAC_DEVMAP, TR_DEVMAP_GETOFFSET,
"segdev_getoffset:start seg=%p addr=%p", (void *)seg, (void *)addr);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
return ((u_offset_t)sdp->offset + (addr - seg->s_base));
}
/*ARGSUSED*/
--- 2264,2274 ----
register struct segdev_data *sdp = (struct segdev_data *)seg->s_data;
TRACE_2(TR_FAC_DEVMAP, TR_DEVMAP_GETOFFSET,
"segdev_getoffset:start seg=%p addr=%p", (void *)seg, (void *)addr);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
return ((u_offset_t)sdp->offset + (addr - seg->s_base));
}
/*ARGSUSED*/
*** 2278,2288 ****
register struct segdev_data *sdp = (struct segdev_data *)seg->s_data;
TRACE_2(TR_FAC_DEVMAP, TR_DEVMAP_GETTYPE,
"segdev_gettype:start seg=%p addr=%p", (void *)seg, (void *)addr);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
return (sdp->type);
}
--- 2278,2288 ----
register struct segdev_data *sdp = (struct segdev_data *)seg->s_data;
TRACE_2(TR_FAC_DEVMAP, TR_DEVMAP_GETTYPE,
"segdev_gettype:start seg=%p addr=%p", (void *)seg, (void *)addr);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
return (sdp->type);
}
*** 2293,2303 ****
register struct segdev_data *sdp = (struct segdev_data *)seg->s_data;
TRACE_2(TR_FAC_DEVMAP, TR_DEVMAP_GETVP,
"segdev_getvp:start seg=%p addr=%p", (void *)seg, (void *)addr);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
/*
* Note that this vp is the common_vp of the device, where the
* pages are hung ..
*/
--- 2293,2303 ----
register struct segdev_data *sdp = (struct segdev_data *)seg->s_data;
TRACE_2(TR_FAC_DEVMAP, TR_DEVMAP_GETVP,
"segdev_getvp:start seg=%p addr=%p", (void *)seg, (void *)addr);
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
/*
* Note that this vp is the common_vp of the device, where the
* pages are hung ..
*/
*** 2323,2333 ****
static int
segdev_sync(struct seg *seg, caddr_t addr, size_t len, int attr, uint_t flags)
{
TRACE_0(TR_FAC_DEVMAP, TR_DEVMAP_SYNC, "segdev_sync:start");
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
return (0);
}
/*
--- 2323,2333 ----
static int
segdev_sync(struct seg *seg, caddr_t addr, size_t len, int attr, uint_t flags)
{
TRACE_0(TR_FAC_DEVMAP, TR_DEVMAP_SYNC, "segdev_sync:start");
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
return (0);
}
/*
*** 2339,2349 ****
{
size_t v = 0;
TRACE_0(TR_FAC_DEVMAP, TR_DEVMAP_INCORE, "segdev_incore:start");
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
for (len = (len + PAGEOFFSET) & PAGEMASK; len; len -= PAGESIZE,
v += PAGESIZE)
*vec++ = 1;
return (v);
--- 2339,2349 ----
{
size_t v = 0;
TRACE_0(TR_FAC_DEVMAP, TR_DEVMAP_INCORE, "segdev_incore:start");
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
for (len = (len + PAGEOFFSET) & PAGEMASK; len; len -= PAGESIZE,
v += PAGESIZE)
*vec++ = 1;
return (v);
*** 2358,2368 ****
segdev_lockop(struct seg *seg, caddr_t addr,
size_t len, int attr, int op, ulong_t *lockmap, size_t pos)
{
TRACE_0(TR_FAC_DEVMAP, TR_DEVMAP_LOCKOP, "segdev_lockop:start");
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
return (0);
}
/*
--- 2358,2368 ----
segdev_lockop(struct seg *seg, caddr_t addr,
size_t len, int attr, int op, ulong_t *lockmap, size_t pos)
{
TRACE_0(TR_FAC_DEVMAP, TR_DEVMAP_LOCKOP, "segdev_lockop:start");
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
return (0);
}
/*
*** 2373,2383 ****
static int
segdev_advise(struct seg *seg, caddr_t addr, size_t len, uint_t behav)
{
TRACE_0(TR_FAC_DEVMAP, TR_DEVMAP_ADVISE, "segdev_advise:start");
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as, &seg->s_as->a_lock));
return (0);
}
/*
--- 2373,2383 ----
static int
segdev_advise(struct seg *seg, caddr_t addr, size_t len, uint_t behav)
{
TRACE_0(TR_FAC_DEVMAP, TR_DEVMAP_ADVISE, "segdev_advise:start");
! ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as));
return (0);
}
/*
*** 3078,3088 ****
/*
* Hat layer only supports devload to process' context for which
* the as lock is held. Verify here and return error if drivers
* inadvertently call devmap_load on a wrong devmap handle.
*/
! if ((asp != &kas) && !AS_LOCK_HELD(asp, &asp->a_lock))
return (FC_MAKE_ERR(EINVAL));
soff = (ssize_t)(offset - dhp->dh_uoff);
soff = round_down_p2(soff, PAGESIZE);
if (soff < 0 || soff >= dhp->dh_len)
--- 3078,3088 ----
/*
* Hat layer only supports devload to process' context for which
* the as lock is held. Verify here and return error if drivers
* inadvertently call devmap_load on a wrong devmap handle.
*/
! if ((asp != &kas) && !AS_LOCK_HELD(asp))
return (FC_MAKE_ERR(EINVAL));
soff = (ssize_t)(offset - dhp->dh_uoff);
soff = round_down_p2(soff, PAGESIZE);
if (soff < 0 || soff >= dhp->dh_len)