Print this page
patch lower-case-segops

*** 706,716 **** for (seg = AS_SEGFIRST(as); seg != NULL; seg = next) { int err; next = AS_SEGNEXT(as, seg); retry: ! err = SEGOP_UNMAP(seg, seg->s_base, seg->s_size); if (err == EAGAIN) { mutex_enter(&as->a_contents); if (as->a_callbacks) { AS_LOCK_EXIT(as, &as->a_lock); } else if (!AS_ISNOUNMAPWAIT(as)) { --- 706,716 ---- for (seg = AS_SEGFIRST(as); seg != NULL; seg = next) { int err; next = AS_SEGNEXT(as, seg); retry: ! err = segop_unmap(seg, seg->s_base, seg->s_size); if (err == EAGAIN) { mutex_enter(&as->a_contents); if (as->a_callbacks) { AS_LOCK_EXIT(as, &as->a_lock); } else if (!AS_ISNOUNMAPWAIT(as)) {
*** 799,809 **** as_setwatch(as); AS_LOCK_EXIT(as, &as->a_lock); as_free(newas); return (-1); } ! if ((error = SEGOP_DUP(seg, newseg)) != 0) { /* * We call seg_free() on the new seg * because the segment is not set up * completely; i.e. it has no ops. */ --- 799,809 ---- as_setwatch(as); AS_LOCK_EXIT(as, &as->a_lock); as_free(newas); return (-1); } ! if ((error = segop_dup(seg, newseg)) != 0) { /* * We call seg_free() on the new seg * because the segment is not set up * completely; i.e. it has no ops. */
*** 938,948 **** if (raddr + rsize > seg->s_base + seg->s_size) ssize = seg->s_base + seg->s_size - raddr; else ssize = rsize; ! res = SEGOP_FAULT(hat, seg, raddr, ssize, type, rw); /* Restore watchpoints */ if (holding_wpage) { as_setwatch(as); holding_wpage = 0; --- 938,948 ---- if (raddr + rsize > seg->s_base + seg->s_size) ssize = seg->s_base + seg->s_size - raddr; else ssize = rsize; ! res = segop_fault(hat, seg, raddr, ssize, type, rw); /* Restore watchpoints */ if (holding_wpage) { as_setwatch(as); holding_wpage = 0;
*** 970,980 **** */ if (raddr > seg->s_base + seg->s_size) ssize = seg->s_base + seg->s_size - addrsav; else ssize = raddr - addrsav; ! (void) SEGOP_FAULT(hat, seg, addrsav, ssize, F_SOFTUNLOCK, S_OTHER); } } if (as_lock_held) AS_LOCK_EXIT(as, &as->a_lock); --- 970,980 ---- */ if (raddr > seg->s_base + seg->s_size) ssize = seg->s_base + seg->s_size - addrsav; else ssize = raddr - addrsav; ! (void) segop_fault(hat, seg, addrsav, ssize, F_SOFTUNLOCK, S_OTHER); } } if (as_lock_held) AS_LOCK_EXIT(as, &as->a_lock);
*** 1040,1050 **** if (seg == NULL || raddr != seg->s_base) { res = FC_NOMAP; break; } } ! res = SEGOP_FAULTA(seg, raddr); if (res != 0) break; } AS_LOCK_EXIT(as, &as->a_lock); if (lwp != NULL) --- 1040,1050 ---- if (seg == NULL || raddr != seg->s_base) { res = FC_NOMAP; break; } } ! res = segop_faulta(seg, raddr); if (res != 0) break; } AS_LOCK_EXIT(as, &as->a_lock); if (lwp != NULL)
*** 1130,1140 **** if ((raddr + rsize) > (seg->s_base + seg->s_size)) ssize = seg->s_base + seg->s_size - raddr; else ssize = rsize; retry: ! error = SEGOP_SETPROT(seg, raddr, ssize, prot); if (error == IE_NOMEM) { error = EAGAIN; break; } --- 1130,1140 ---- if ((raddr + rsize) > (seg->s_base + seg->s_size)) ssize = seg->s_base + seg->s_size - raddr; else ssize = rsize; retry: ! error = segop_setprot(seg, raddr, ssize, prot); if (error == IE_NOMEM) { error = EAGAIN; break; }
*** 1281,1291 **** if ((raddr + rsize) > (seg->s_base + seg->s_size)) ssize = seg->s_base + seg->s_size - raddr; else ssize = rsize; ! error = SEGOP_CHECKPROT(seg, raddr, ssize, prot); if (error != 0) break; } as_setwatch(as); AS_LOCK_EXIT(as, &as->a_lock); --- 1281,1291 ---- if ((raddr + rsize) > (seg->s_base + seg->s_size)) ssize = seg->s_base + seg->s_size - raddr; else ssize = rsize; ! error = segop_checkprot(seg, raddr, ssize, prot); if (error != 0) break; } as_setwatch(as); AS_LOCK_EXIT(as, &as->a_lock);
*** 1347,1357 **** if (!SEG_IS_DEVNULL_MAPPING(seg) && !SEG_IS_PARTIAL_RESV(seg)) rsize = ssize; retry: ! err = SEGOP_UNMAP(seg, raddr, ssize); if (err == EAGAIN) { /* * Memory is currently locked. It must be unlocked * before this operation can succeed through a retry. * The possible reasons for locked memory and --- 1347,1357 ---- if (!SEG_IS_DEVNULL_MAPPING(seg) && !SEG_IS_PARTIAL_RESV(seg)) rsize = ssize; retry: ! err = segop_unmap(seg, raddr, ssize); if (err == EAGAIN) { /* * Memory is currently locked. It must be unlocked * before this operation can succeed through a retry. * The possible reasons for locked memory and
*** 1785,1795 **** next_seg = NULL; seg = AS_SEGFIRST(as); while (seg != NULL) { next_seg = AS_SEGNEXT(as, seg); if (seg->s_flags & S_PURGE) ! SEGOP_UNMAP(seg, seg->s_base, seg->s_size); seg = next_seg; } AS_LOCK_EXIT(as, &as->a_lock); mutex_enter(&as->a_contents); --- 1785,1795 ---- next_seg = NULL; seg = AS_SEGFIRST(as); while (seg != NULL) { next_seg = AS_SEGNEXT(as, seg); if (seg->s_flags & S_PURGE) ! segop_unmap(seg, seg->s_base, seg->s_size); seg = next_seg; } AS_LOCK_EXIT(as, &as->a_lock); mutex_enter(&as->a_contents);
*** 2097,2107 **** } if ((raddr + rsize) > (seg->s_base + seg->s_size)) ssize = seg->s_base + seg->s_size - raddr; else ssize = rsize; ! *sizep += isize = SEGOP_INCORE(seg, raddr, ssize, vec); if (isize != ssize) { error = -1; break; } vec += btopr(ssize); --- 2097,2107 ---- } if ((raddr + rsize) > (seg->s_base + seg->s_size)) ssize = seg->s_base + seg->s_size - raddr; else ssize = rsize; ! *sizep += isize = segop_incore(seg, raddr, ssize, vec); if (isize != ssize) { error = -1; break; } vec += btopr(ssize);
*** 2123,2133 **** while (bt_range(bitmap, &pos1, &pos2, end_pos)) { size = ptob((pos2 - pos1)); range_start = (caddr_t)((uintptr_t)addr + ptob(pos1 - position)); ! (void) SEGOP_LOCKOP(seg, range_start, size, attr, MC_UNLOCK, (ulong_t *)NULL, (size_t)NULL); pos1 = pos2; } } --- 2123,2133 ---- while (bt_range(bitmap, &pos1, &pos2, end_pos)) { size = ptob((pos2 - pos1)); range_start = (caddr_t)((uintptr_t)addr + ptob(pos1 - position)); ! (void) segop_lockop(seg, range_start, size, attr, MC_UNLOCK, (ulong_t *)NULL, (size_t)NULL); pos1 = pos2; } }
*** 2219,2229 **** AS_LOCK_EXIT(as, &as->a_lock); return (EAGAIN); } for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) { ! error = SEGOP_LOCKOP(seg, seg->s_base, seg->s_size, attr, MC_LOCK, mlock_map, pos); if (error != 0) break; pos += seg_pages(seg); } --- 2219,2229 ---- AS_LOCK_EXIT(as, &as->a_lock); return (EAGAIN); } for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) { ! error = segop_lockop(seg, seg->s_base, seg->s_size, attr, MC_LOCK, mlock_map, pos); if (error != 0) break; pos += seg_pages(seg); }
*** 2248,2258 **** mutex_enter(&as->a_contents); AS_CLRPGLCK(as); mutex_exit(&as->a_contents); for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) { ! error = SEGOP_LOCKOP(seg, seg->s_base, seg->s_size, attr, MC_UNLOCK, NULL, 0); if (error != 0) break; } --- 2248,2258 ---- mutex_enter(&as->a_contents); AS_CLRPGLCK(as); mutex_exit(&as->a_contents); for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) { ! error = segop_lockop(seg, seg->s_base, seg->s_size, attr, MC_UNLOCK, NULL, 0); if (error != 0) break; }
*** 2326,2347 **** /* * Synchronize cached data from mappings with backing * objects. */ case MC_SYNC: ! if (error = SEGOP_SYNC(seg, raddr, ssize, attr, (uint_t)arg)) { AS_LOCK_EXIT(as, &as->a_lock); return (error); } break; /* * Lock pages in memory. */ case MC_LOCK: ! if (error = SEGOP_LOCKOP(seg, raddr, ssize, attr, func, mlock_map, pos)) { as_unlockerr(as, attr, mlock_map, initraddr, initrsize - rsize + ssize); kmem_free(mlock_map, mlock_size * sizeof (ulong_t)); --- 2326,2347 ---- /* * Synchronize cached data from mappings with backing * objects. */ case MC_SYNC: ! if (error = segop_sync(seg, raddr, ssize, attr, (uint_t)arg)) { AS_LOCK_EXIT(as, &as->a_lock); return (error); } break; /* * Lock pages in memory. */ case MC_LOCK: ! if (error = segop_lockop(seg, raddr, ssize, attr, func, mlock_map, pos)) { as_unlockerr(as, attr, mlock_map, initraddr, initrsize - rsize + ssize); kmem_free(mlock_map, mlock_size * sizeof (ulong_t));
*** 2352,2370 **** /* * Unlock mapped pages. */ case MC_UNLOCK: ! (void) SEGOP_LOCKOP(seg, raddr, ssize, attr, func, (ulong_t *)NULL, (size_t)NULL); break; /* * Store VM advise for mapped pages in segment layer. */ case MC_ADVISE: ! error = SEGOP_ADVISE(seg, raddr, ssize, (uint_t)arg); /* * Check for regular errors and special retry error */ if (error) { --- 2352,2370 ---- /* * Unlock mapped pages. */ case MC_UNLOCK: ! (void) segop_lockop(seg, raddr, ssize, attr, func, (ulong_t *)NULL, (size_t)NULL); break; /* * Store VM advise for mapped pages in segment layer. */ case MC_ADVISE: ! error = segop_advise(seg, raddr, ssize, (uint_t)arg); /* * Check for regular errors and special retry error */ if (error) {
*** 2399,2409 **** case MC_INHERIT_ZERO: if (seg->s_ops->inherit == NULL) { error = ENOTSUP; } else { ! error = SEGOP_INHERIT(seg, raddr, ssize, SEGP_INH_ZERO); } if (error != 0) { AS_LOCK_EXIT(as, &as->a_lock); return (error); --- 2399,2409 ---- case MC_INHERIT_ZERO: if (seg->s_ops->inherit == NULL) { error = ENOTSUP; } else { ! error = segop_inherit(seg, raddr, ssize, SEGP_INH_ZERO); } if (error != 0) { AS_LOCK_EXIT(as, &as->a_lock); return (error);
*** 2514,2524 **** * will most likely support pagelock. */ if (seg->s_ops == &segvn_ops) { vnode_t *vp; ! if (SEGOP_GETVP(seg, addr, &vp) != 0 || vp != NULL) { AS_LOCK_EXIT(as, &as->a_lock); goto slow; } } else if (seg->s_ops != &segspt_shmops) { --- 2514,2524 ---- * will most likely support pagelock. */ if (seg->s_ops == &segvn_ops) { vnode_t *vp; ! if (segop_getvp(seg, addr, &vp) != 0 || vp != NULL) { AS_LOCK_EXIT(as, &as->a_lock); goto slow; } } else if (seg->s_ops != &segspt_shmops) {
*** 2552,2562 **** ssize = seg->s_base + seg->s_size - addr; } else { ssize = size; } pl = &plist[npages + cnt]; ! error = SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl, L_PAGELOCK, rw); if (error) { break; } ASSERT(plist[npages + cnt] != NULL); --- 2552,2562 ---- ssize = seg->s_base + seg->s_size - addr; } else { ssize = size; } pl = &plist[npages + cnt]; ! error = segop_pagelock(seg, addr, ssize, (page_t ***)pl, L_PAGELOCK, rw); if (error) { break; } ASSERT(plist[npages + cnt] != NULL);
*** 2595,2605 **** } else { ssize = eaddr - addr; } pl = &plist[npages + cnt]; ASSERT(*pl != NULL); ! (void) SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl, L_PAGEUNLOCK, rw); } AS_LOCK_EXIT(as, &as->a_lock); --- 2595,2605 ---- } else { ssize = eaddr - addr; } pl = &plist[npages + cnt]; ASSERT(*pl != NULL); ! (void) segop_pagelock(seg, addr, ssize, (page_t ***)pl, L_PAGEUNLOCK, rw); } AS_LOCK_EXIT(as, &as->a_lock);
*** 2670,2680 **** "seg_lock_1_start: raddr %p rsize %ld", raddr, rsize); /* * try to lock pages and pass back shadow list */ ! err = SEGOP_PAGELOCK(seg, raddr, rsize, ppp, L_PAGELOCK, rw); TRACE_0(TR_FAC_PHYSIO, TR_PHYSIO_SEG_LOCK_END, "seg_lock_1_end"); AS_LOCK_EXIT(as, &as->a_lock); --- 2670,2680 ---- "seg_lock_1_start: raddr %p rsize %ld", raddr, rsize); /* * try to lock pages and pass back shadow list */ ! err = segop_pagelock(seg, raddr, rsize, ppp, L_PAGELOCK, rw); TRACE_0(TR_FAC_PHYSIO, TR_PHYSIO_SEG_LOCK_END, "seg_lock_1_end"); AS_LOCK_EXIT(as, &as->a_lock);
*** 2733,2743 **** } else { ssize = eaddr - addr; } pl = &plist[npages + cnt]; ASSERT(*pl != NULL); ! (void) SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl, L_PAGEUNLOCK, rw); } ASSERT(cnt > 0); AS_LOCK_EXIT(as, &as->a_lock); --- 2733,2743 ---- } else { ssize = eaddr - addr; } pl = &plist[npages + cnt]; ASSERT(*pl != NULL); ! (void) segop_pagelock(seg, addr, ssize, (page_t ***)pl, L_PAGEUNLOCK, rw); } ASSERT(cnt > 0); AS_LOCK_EXIT(as, &as->a_lock);
*** 2779,2789 **** TRACE_2(TR_FAC_PHYSIO, TR_PHYSIO_SEG_UNLOCK_START, "seg_unlock_start: raddr %p rsize %ld", raddr, rsize); ASSERT(raddr >= seg->s_base && raddr < seg->s_base + seg->s_size); if (raddr + rsize <= seg->s_base + seg->s_size) { ! SEGOP_PAGELOCK(seg, raddr, rsize, &pp, L_PAGEUNLOCK, rw); } else { as_pageunlock_segs(as, seg, raddr, rsize, pp, rw); return; } AS_LOCK_EXIT(as, &as->a_lock); --- 2779,2789 ---- TRACE_2(TR_FAC_PHYSIO, TR_PHYSIO_SEG_UNLOCK_START, "seg_unlock_start: raddr %p rsize %ld", raddr, rsize); ASSERT(raddr >= seg->s_base && raddr < seg->s_base + seg->s_size); if (raddr + rsize <= seg->s_base + seg->s_size) { ! segop_pagelock(seg, raddr, rsize, &pp, L_PAGEUNLOCK, rw); } else { as_pageunlock_segs(as, seg, raddr, rsize, pp, rw); return; } AS_LOCK_EXIT(as, &as->a_lock);
*** 2834,2844 **** } else { ssize = rsize; } retry: ! error = SEGOP_SETPAGESIZE(seg, raddr, ssize, szc); if (error == IE_NOMEM) { error = EAGAIN; break; } --- 2834,2844 ---- } else { ssize = rsize; } retry: ! error = segop_setpagesize(seg, raddr, ssize, szc); if (error == IE_NOMEM) { error = EAGAIN; break; }
*** 2913,2923 **** AS_LOCK_EXIT(as, &as->a_lock); return (error); } /* ! * as_iset3_default_lpsize() just calls SEGOP_SETPAGESIZE() on all segments * in its chunk where s_szc is less than the szc we want to set. */ static int as_iset3_default_lpsize(struct as *as, caddr_t raddr, size_t rsize, uint_t szc, int *retry) --- 2913,2923 ---- AS_LOCK_EXIT(as, &as->a_lock); return (error); } /* ! * as_iset3_default_lpsize() just calls segop_setpagesize() on all segments * in its chunk where s_szc is less than the szc we want to set. */ static int as_iset3_default_lpsize(struct as *as, caddr_t raddr, size_t rsize, uint_t szc, int *retry)
*** 2945,2960 **** } else { ssize = rsize; } if (szc > seg->s_szc) { ! error = SEGOP_SETPAGESIZE(seg, raddr, ssize, szc); /* Only retry on EINVAL segments that have no vnode. */ if (error == EINVAL) { vnode_t *vp = NULL; ! if ((SEGOP_GETTYPE(seg, raddr) & MAP_SHARED) && ! (SEGOP_GETVP(seg, raddr, &vp) != 0 || vp == NULL)) { *retry = 1; } else { *retry = 0; } --- 2945,2960 ---- } else { ssize = rsize; } if (szc > seg->s_szc) { ! error = segop_setpagesize(seg, raddr, ssize, szc); /* Only retry on EINVAL segments that have no vnode. */ if (error == EINVAL) { vnode_t *vp = NULL; ! if ((segop_gettype(seg, raddr) & MAP_SHARED) && ! (segop_getvp(seg, raddr, &vp) != 0 || vp == NULL)) { *retry = 1; } else { *retry = 0; }
*** 3193,3203 **** as_setwatch(as); AS_LOCK_EXIT(as, &as->a_lock); return (ENOMEM); } if (seg->s_ops == &segvn_ops) { ! rtype = SEGOP_GETTYPE(seg, addr); rflags = rtype & (MAP_TEXT | MAP_INITDATA); rtype = rtype & (MAP_SHARED | MAP_PRIVATE); segvn = 1; } else { segvn = 0; --- 3193,3203 ---- as_setwatch(as); AS_LOCK_EXIT(as, &as->a_lock); return (ENOMEM); } if (seg->s_ops == &segvn_ops) { ! rtype = segop_gettype(seg, addr); rflags = rtype & (MAP_TEXT | MAP_INITDATA); rtype = rtype & (MAP_SHARED | MAP_PRIVATE); segvn = 1; } else { segvn = 0;
*** 3211,3221 **** if (seg == NULL || raddr != seg->s_base) { error = ENOMEM; break; } if (seg->s_ops == &segvn_ops) { ! stype = SEGOP_GETTYPE(seg, raddr); sflags = stype & (MAP_TEXT | MAP_INITDATA); stype &= (MAP_SHARED | MAP_PRIVATE); if (segvn && (rflags != sflags || rtype != stype)) { /* --- 3211,3221 ---- if (seg == NULL || raddr != seg->s_base) { error = ENOMEM; break; } if (seg->s_ops == &segvn_ops) { ! stype = segop_gettype(seg, raddr); sflags = stype & (MAP_TEXT | MAP_INITDATA); stype &= (MAP_SHARED | MAP_PRIVATE); if (segvn && (rflags != sflags || rtype != stype)) { /*
*** 3325,3346 **** retrycnt = 0; retry: vaddr = pwp->wp_vaddr; if (pwp->wp_oprot != 0 || /* already set up */ (seg = as_segat(as, vaddr)) == NULL || ! SEGOP_GETPROT(seg, vaddr, 0, &prot) != 0) continue; pwp->wp_oprot = prot; if (pwp->wp_read) prot &= ~(PROT_READ|PROT_WRITE|PROT_EXEC); if (pwp->wp_write) prot &= ~PROT_WRITE; if (pwp->wp_exec) prot &= ~(PROT_READ|PROT_WRITE|PROT_EXEC); if (!(pwp->wp_flags & WP_NOWATCH) && prot != pwp->wp_oprot) { ! err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, prot); if (err == IE_RETRY) { pwp->wp_oprot = 0; ASSERT(retrycnt == 0); retrycnt++; goto retry; --- 3325,3346 ---- retrycnt = 0; retry: vaddr = pwp->wp_vaddr; if (pwp->wp_oprot != 0 || /* already set up */ (seg = as_segat(as, vaddr)) == NULL || ! segop_getprot(seg, vaddr, 0, &prot) != 0) continue; pwp->wp_oprot = prot; if (pwp->wp_read) prot &= ~(PROT_READ|PROT_WRITE|PROT_EXEC); if (pwp->wp_write) prot &= ~PROT_WRITE; if (pwp->wp_exec) prot &= ~(PROT_READ|PROT_WRITE|PROT_EXEC); if (!(pwp->wp_flags & WP_NOWATCH) && prot != pwp->wp_oprot) { ! err = segop_setprot(seg, vaddr, PAGESIZE, prot); if (err == IE_RETRY) { pwp->wp_oprot = 0; ASSERT(retrycnt == 0); retrycnt++; goto retry;
*** 3375,3385 **** if (pwp->wp_oprot == 0 || /* not set up */ (seg = as_segat(as, vaddr)) == NULL) continue; if ((prot = pwp->wp_oprot) != pwp->wp_prot) { ! err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, prot); if (err == IE_RETRY) { ASSERT(retrycnt == 0); retrycnt++; goto retry; } --- 3375,3385 ---- if (pwp->wp_oprot == 0 || /* not set up */ (seg = as_segat(as, vaddr)) == NULL) continue; if ((prot = pwp->wp_oprot) != pwp->wp_prot) { ! err = segop_setprot(seg, vaddr, PAGESIZE, prot); if (err == IE_RETRY) { ASSERT(retrycnt == 0); retrycnt++; goto retry; }
*** 3429,3439 **** seg = as_segat(as, vaddr); if (seg == NULL) { panic("as_setwatchprot: no seg"); /*NOTREACHED*/ } ! err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, wprot); if (err == IE_RETRY) { ASSERT(retrycnt == 0); retrycnt++; goto retry; } --- 3429,3439 ---- seg = as_segat(as, vaddr); if (seg == NULL) { panic("as_setwatchprot: no seg"); /*NOTREACHED*/ } ! err = segop_setprot(seg, vaddr, PAGESIZE, wprot); if (err == IE_RETRY) { ASSERT(retrycnt == 0); retrycnt++; goto retry; }
*** 3476,3486 **** if (prot != pwp->wp_prot) { retry: seg = as_segat(as, pwp->wp_vaddr); if (seg == NULL) continue; ! err = SEGOP_SETPROT(seg, pwp->wp_vaddr, PAGESIZE, prot); if (err == IE_RETRY) { ASSERT(retrycnt == 0); retrycnt++; goto retry; --- 3476,3486 ---- if (prot != pwp->wp_prot) { retry: seg = as_segat(as, pwp->wp_vaddr); if (seg == NULL) continue; ! err = segop_setprot(seg, pwp->wp_vaddr, PAGESIZE, prot); if (err == IE_RETRY) { ASSERT(retrycnt == 0); retrycnt++; goto retry;
*** 3533,3542 **** if (seg->s_ops->getmemid == NULL) { AS_LOCK_EXIT(as, &as->a_lock); return (ENODEV); } ! sts = SEGOP_GETMEMID(seg, addr, memidp); AS_LOCK_EXIT(as, &as->a_lock); return (sts); } --- 3533,3542 ---- if (seg->s_ops->getmemid == NULL) { AS_LOCK_EXIT(as, &as->a_lock); return (ENODEV); } ! sts = segop_getmemid(seg, addr, memidp); AS_LOCK_EXIT(as, &as->a_lock); return (sts); }