Lines Matching refs:seg
102 static int segvn_dup(struct seg *seg, struct seg *newseg);
103 static int segvn_unmap(struct seg *seg, caddr_t addr, size_t len);
104 static void segvn_free(struct seg *seg);
105 static faultcode_t segvn_fault(struct hat *hat, struct seg *seg,
108 static faultcode_t segvn_faulta(struct seg *seg, caddr_t addr);
109 static int segvn_setprot(struct seg *seg, caddr_t addr,
111 static int segvn_checkprot(struct seg *seg, caddr_t addr,
113 static int segvn_kluster(struct seg *seg, caddr_t addr, ssize_t delta);
114 static size_t segvn_swapout(struct seg *seg);
115 static int segvn_sync(struct seg *seg, caddr_t addr, size_t len,
117 static size_t segvn_incore(struct seg *seg, caddr_t addr, size_t len,
119 static int segvn_lockop(struct seg *seg, caddr_t addr, size_t len,
121 static int segvn_getprot(struct seg *seg, caddr_t addr, size_t len,
123 static u_offset_t segvn_getoffset(struct seg *seg, caddr_t addr);
124 static int segvn_gettype(struct seg *seg, caddr_t addr);
125 static int segvn_getvp(struct seg *seg, caddr_t addr,
127 static int segvn_advise(struct seg *seg, caddr_t addr, size_t len,
129 static void segvn_dump(struct seg *seg);
130 static int segvn_pagelock(struct seg *seg, caddr_t addr, size_t len,
132 static int segvn_setpagesize(struct seg *seg, caddr_t addr, size_t len,
134 static int segvn_getmemid(struct seg *seg, caddr_t addr,
136 static lgrp_mem_policy_info_t *segvn_getpolicy(struct seg *, caddr_t);
137 static int segvn_capable(struct seg *seg, segcapability_t capable);
138 static int segvn_inherit(struct seg *, caddr_t, size_t, uint_t);
192 static int segvn_concat(struct seg *, struct seg *, int);
193 static int segvn_extend_prev(struct seg *, struct seg *,
195 static int segvn_extend_next(struct seg *, struct seg *,
197 static void segvn_softunlock(struct seg *, caddr_t, size_t, enum seg_rw);
204 static faultcode_t segvn_fault_vnodepages(struct hat *, struct seg *, caddr_t,
206 static faultcode_t segvn_fault_anonpages(struct hat *, struct seg *, caddr_t,
208 static faultcode_t segvn_faultpage(struct hat *, struct seg *, caddr_t,
211 static void segvn_vpage(struct seg *);
212 static size_t segvn_count_swap_by_vpages(struct seg *);
214 static void segvn_purge(struct seg *seg);
220 static int sameprot(struct seg *, caddr_t, size_t);
222 static int segvn_demote_range(struct seg *, caddr_t, size_t, int, uint_t);
223 static int segvn_clrszc(struct seg *);
224 static struct seg *segvn_split_seg(struct seg *, caddr_t);
225 static int segvn_claim_pages(struct seg *, struct vpage *, u_offset_t,
249 #define CALC_LPG_REGION(pgsz, seg, addr, len, lpgaddr, lpgeaddr) { \ argument
252 ASSERT(lpgaddr >= (seg)->s_base); \
256 ASSERT(lpgeaddr <= (seg)->s_base + (seg)->s_size); \
397 static void segvn_textrepl(struct seg *);
398 static void segvn_textunrepl(struct seg *, int);
403 static void segvn_trupdate_seg(struct seg *, segvn_data_t *, svntr_t *,
541 segvn_create(struct seg **segpp, void *argsp) in segvn_create()
543 struct seg *seg = *segpp; in segvn_create() local
556 ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as)); in segvn_create()
585 (a->flags & MAP_NORESERVE) || seg->s_as == &kas) { in segvn_create()
591 if (!IS_P2ALIGNED(seg->s_base, pgsz) || in segvn_create()
592 !IS_P2ALIGNED(seg->s_size, pgsz)) { in segvn_create()
602 } else if (map_addr_vacalign_check(seg->s_base, in segvn_create()
621 if (anon_resv_zone(seg->s_size, in segvn_create()
622 seg->s_as->a_proc->p_zone) == 0) in segvn_create()
624 swresv = seg->s_size; in segvn_create()
626 seg, swresv, 1); in segvn_create()
636 hat_map(seg->s_as->a_hat, seg->s_base, seg->s_size, HAT_MAP); in segvn_create()
649 seg->s_as, seg->s_base, seg->s_size, a->prot, in segvn_create()
654 seg->s_as->a_proc->p_zone); in segvn_create()
656 "anon proc:%p %lu %u", seg, swresv, 0); in segvn_create()
660 hat_unload(seg->s_as->a_hat, seg->s_base, in segvn_create()
661 seg->s_size, HAT_UNLOAD_UNMAP); in segvn_create()
669 (seg->s_size > textrepl_size_thresh || in segvn_create()
674 seg->s_as != &kas && a->vp->v_type == VREG); in segvn_create()
685 seg->s_as->a_resvsize -= seg->s_size; in segvn_create()
695 struct seg *pseg, *nseg; in segvn_create()
705 !(a->flags & MAP_NORESERVE) && (seg->s_as != &kas)) { in segvn_create()
711 mpolicy = lgrp_mem_policy_default(seg->s_size, a->type); in segvn_create()
717 pseg = AS_SEGPREV(seg->s_as, seg); in segvn_create()
719 pseg->s_base + pseg->s_size == seg->s_base && in segvn_create()
737 pseg->s_size + seg->s_size, in segvn_create()
743 (pseg->s_size + seg->s_size <= in segvn_create()
745 segvn_extend_prev(pseg, seg, a, swresv) == 0) { in segvn_create()
774 nseg = AS_SEGNEXT(seg->s_as, seg); in segvn_create()
776 seg->s_base + seg->s_size == nseg->s_base && in segvn_create()
794 nseg->s_size + seg->s_size, in segvn_create()
800 segvn_extend_next(seg, nseg, a, swresv) == 0) { in segvn_create()
823 seg->s_ops = &segvn_ops; in segvn_create()
824 seg->s_data = (void *)svd; in segvn_create()
825 seg->s_szc = a->szc; in segvn_create()
827 svd->seg = seg; in segvn_create()
871 svd->amp = anonmap_alloc(seg->s_size, swresv, in segvn_create()
873 svd->amp->a_szc = seg->s_szc; in segvn_create()
895 if ((amp->size - a->offset) < seg->s_size) { in segvn_create()
934 svd->amp = anonmap_alloc(seg->s_size, 0, ANON_SLEEP); in segvn_create()
935 svd->amp->a_szc = seg->s_szc; in segvn_create()
944 eaddr = seg->s_base + seg->s_size; in segvn_create()
946 for (anon_idx = anon_num, addr = seg->s_base; in segvn_create()
959 pp = anon_zero(seg, addr, &ap, cred); in segvn_create()
974 ASSERT(seg->s_szc == 0); in segvn_create()
978 hat_memload(seg->s_as->a_hat, addr, pp, in segvn_create()
983 ASSERT(seg->s_szc == 0); in segvn_create()
985 0, seg->s_size); in segvn_create()
996 (void) lgrp_privm_policy_set(mpolicy, &svd->policy_info, seg->s_size); in segvn_create()
1000 svd->vp, svd->offset, seg->s_size); in segvn_create()
1005 svd->rcookie = hat_join_region(seg->s_as->a_hat, seg->s_base, in segvn_create()
1006 seg->s_size, (void *)svd->vp, svd->offset, svd->prot, in segvn_create()
1007 (uchar_t)seg->s_szc, segvn_hat_rgn_unload_callback, in segvn_create()
1024 segvn_concat(struct seg *seg1, struct seg *seg2, int amp_cat) in segvn_concat()
1267 segvn_extend_prev(struct seg *seg1, struct seg *seg2, struct segvn_crargs *a, in segvn_extend_prev()
1385 segvn_extend_next(struct seg *seg1, struct seg *seg2, struct segvn_crargs *a, in segvn_extend_next()
1505 segvn_dup_pages(struct seg *seg, struct seg *newseg) in segvn_dup_pages() argument
1514 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_dup_pages()
1519 i = btopr(seg->s_size); in segvn_dup_pages()
1520 addr = seg->s_base; in segvn_dup_pages()
1531 vpp = &svd->vpage[seg_page(seg, addr)]; in segvn_dup_pages()
1552 PAGESIZE, seg, addr, S_READ, svd->cred); in segvn_dup_pages()
1575 segvn_dup(struct seg *seg, struct seg *newseg) in segvn_dup() argument
1577 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_dup()
1579 pgcnt_t npages = seg_pages(seg); in segvn_dup()
1584 ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as)); in segvn_dup()
1600 seg, len, 0); in segvn_dup()
1607 newseg->s_szc = seg->s_szc; in segvn_dup()
1609 newsvd->seg = newseg; in segvn_dup()
1716 segvn_purge(seg); in segvn_dup()
1721 error = segvn_dup_pages(seg, newseg); in segvn_dup()
1727 if (seg->s_szc != 0) { in segvn_dup()
1737 0, seg->s_size, seg->s_szc, in segvn_dup()
1741 newsvd->amp->ahp, 0, seg->s_size); in segvn_dup()
1744 hat_clrattr(seg->s_as->a_hat, seg->s_base, in segvn_dup()
1745 seg->s_size, PROT_WRITE); in segvn_dup()
1821 struct seg *seg = cb->hcb_data; in segvn_hat_unload_callback() local
1822 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_hat_unload_callback()
1828 ASSERT(cb->hcb_start_addr >= seg->s_base); in segvn_hat_unload_callback()
1831 off = cb->hcb_start_addr - seg->s_base; in segvn_hat_unload_callback()
1841 segvn_count_swap_by_vpages(struct seg *seg) in segvn_count_swap_by_vpages() argument
1843 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_count_swap_by_vpages()
1850 evp = &svd->vpage[seg_page(seg, seg->s_base + seg->s_size)]; in segvn_count_swap_by_vpages()
1861 segvn_unmap(struct seg *seg, caddr_t addr, size_t len) in segvn_unmap() argument
1863 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_unmap()
1865 struct seg *nseg; in segvn_unmap()
1881 ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as)); in segvn_unmap()
1905 segvn_purge(seg); in segvn_unmap()
1915 if (addr < seg->s_base || addr + len > seg->s_base + seg->s_size || in segvn_unmap()
1921 if (seg->s_szc != 0) { in segvn_unmap()
1922 size_t pgsz = page_get_pagesize(seg->s_szc); in segvn_unmap()
1925 ASSERT(seg->s_base != addr || seg->s_size != len); in segvn_unmap()
1929 hat_leave_region(seg->s_as->a_hat, in segvn_unmap()
1942 segvn_textunrepl(seg, 1); in segvn_unmap()
1947 err = segvn_demote_range(seg, addr, len, SDR_END, 0); in segvn_unmap()
1960 (offset_t)svd->offset + (uintptr_t)(addr - seg->s_base), in segvn_unmap()
1961 seg->s_as, addr, len, svd->prot, svd->maxprot, in segvn_unmap()
1974 (void) segvn_lockop(seg, addr, len, 0, MC_UNLOCK, NULL, 0); in segvn_unmap()
1981 hat_leave_region(seg->s_as->a_hat, svd->rcookie, in segvn_unmap()
1987 segvn_textunrepl(seg, 1); in segvn_unmap()
1999 callback.hcb_data = seg; in segvn_unmap()
2003 hat_unload_callback(seg->s_as->a_hat, addr, len, in segvn_unmap()
2016 if (addr == seg->s_base && len == seg->s_size) { in segvn_unmap()
2017 seg_free(seg); in segvn_unmap()
2021 opages = seg_pages(seg); in segvn_unmap()
2025 ASSERT(amp == NULL || amp->a_szc >= seg->s_szc); in segvn_unmap()
2030 if (addr == seg->s_base) { in segvn_unmap()
2060 if (amp->a_szc == seg->s_szc) { in segvn_unmap()
2061 if (seg->s_szc != 0) { in segvn_unmap()
2064 seg->s_szc); in segvn_unmap()
2072 ASSERT(amp->a_szc > seg->s_szc); in segvn_unmap()
2084 seg->s_as->a_proc->p_zone); in segvn_unmap()
2094 seg->s_base += len; in segvn_unmap()
2095 seg->s_size -= len; in segvn_unmap()
2105 seg->s_as->a_proc->p_zone); in segvn_unmap()
2106 if (SEG_IS_PARTIAL_RESV(seg)) in segvn_unmap()
2107 seg->s_as->a_resvsize -= oswresv - in segvn_unmap()
2115 segvn_count_swap_by_vpages(seg); in segvn_unmap()
2120 ASSERT(svd->swresv == seg->s_size); in segvn_unmap()
2124 seg->s_as->a_proc->p_zone); in segvn_unmap()
2127 seg, len, 0); in segvn_unmap()
2136 if (addr + len == seg->s_base + seg->s_size) { in segvn_unmap()
2170 if (amp->a_szc == seg->s_szc) { in segvn_unmap()
2171 if (seg->s_szc != 0) { in segvn_unmap()
2174 seg->s_szc); in segvn_unmap()
2181 ASSERT(amp->a_szc > seg->s_szc); in segvn_unmap()
2193 seg->s_as->a_proc->p_zone); in segvn_unmap()
2200 seg->s_size -= len; in segvn_unmap()
2209 seg->s_as->a_proc->p_zone); in segvn_unmap()
2210 if (SEG_IS_PARTIAL_RESV(seg)) in segvn_unmap()
2211 seg->s_as->a_resvsize -= oswresv - in segvn_unmap()
2219 segvn_count_swap_by_vpages(seg); in segvn_unmap()
2224 ASSERT(svd->swresv == seg->s_size); in segvn_unmap()
2228 seg->s_as->a_proc->p_zone); in segvn_unmap()
2231 "anon proc:%p %lu %u", seg, len, 0); in segvn_unmap()
2243 nsize = (seg->s_base + seg->s_size) - nbase; /* new seg size */ in segvn_unmap()
2244 seg->s_size = addr - seg->s_base; /* shrink old seg */ in segvn_unmap()
2245 nseg = seg_alloc(seg->s_as, nbase, nsize); in segvn_unmap()
2250 nseg->s_ops = seg->s_ops; in segvn_unmap()
2253 nseg->s_szc = seg->s_szc; in segvn_unmap()
2255 nsvd->seg = nseg; in segvn_unmap()
2256 nsvd->offset = svd->offset + (uintptr_t)(nseg->s_base - seg->s_base); in segvn_unmap()
2280 npages = seg_pages(seg); /* seg has shrunk */ in segvn_unmap()
2305 opages = btop((uintptr_t)(addr - seg->s_base)); in segvn_unmap()
2324 if (amp->a_szc == seg->s_szc) { in segvn_unmap()
2325 if (seg->s_szc != 0) { in segvn_unmap()
2327 seg->s_szc); in segvn_unmap()
2334 ASSERT(amp->a_szc > seg->s_szc); in segvn_unmap()
2345 seg->s_as->a_proc->p_zone); in segvn_unmap()
2350 btop((uintptr_t)(nseg->s_base - seg->s_base)); in segvn_unmap()
2359 nahp = anon_create(btop(seg->s_size), ANON_SLEEP); in segvn_unmap()
2361 namp->a_szc = seg->s_szc; in segvn_unmap()
2363 0, btop(seg->s_size), ANON_SLEEP); in segvn_unmap()
2370 amp->size = seg->s_size; in segvn_unmap()
2380 svd->anon_index, btop(seg->s_size))); in segvn_unmap()
2385 seg->s_as->a_proc->p_zone); in segvn_unmap()
2386 if (SEG_IS_PARTIAL_RESV(seg)) in segvn_unmap()
2387 seg->s_as->a_resvsize -= oswresv - in segvn_unmap()
2394 svd->swresv = segvn_count_swap_by_vpages(seg); in segvn_unmap()
2399 if (seg->s_size + nseg->s_size + len != in segvn_unmap()
2405 svd->swresv = seg->s_size; in segvn_unmap()
2410 seg->s_as->a_proc->p_zone); in segvn_unmap()
2413 seg, len, 0); in segvn_unmap()
2420 segvn_free(struct seg *seg) in segvn_free() argument
2422 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_free()
2423 pgcnt_t npages = seg_pages(seg); in segvn_free()
2431 ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as)); in segvn_free()
2440 (void) segvn_lockop(seg, seg->s_base, seg->s_size, in segvn_free()
2457 ASSERT(amp->a_szc >= seg->s_szc); in segvn_free()
2464 if (seg->s_szc != 0) { in segvn_free()
2466 svd->anon_index, seg->s_size, in segvn_free()
2467 seg->s_szc); in segvn_free()
2470 seg->s_size); in segvn_free()
2495 seg->s_as->a_proc->p_zone); in segvn_free()
2497 "anon proc:%p %lu %u", seg, len, 0); in segvn_free()
2509 if (seg->s_szc != 0) { in segvn_free()
2511 seg->s_size, seg->s_szc); in segvn_free()
2514 seg->s_size); in segvn_free()
2527 seg->s_as->a_proc->p_zone); in segvn_free()
2529 seg, len, 0); in segvn_free()
2530 if (SEG_IS_PARTIAL_RESV(seg)) in segvn_free()
2531 seg->s_as->a_resvsize -= svd->swresv; in segvn_free()
2559 seg->s_data = NULL; in segvn_free()
2570 segvn_softunlock(struct seg *seg, caddr_t addr, size_t len, enum seg_rw rw) in segvn_softunlock() argument
2572 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_softunlock()
2581 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_softunlock()
2582 ASSERT(SEGVN_LOCK_HELD(seg->s_as, &svd->lock)); in segvn_softunlock()
2585 anon_index = svd->anon_index + seg_page(seg, addr); in segvn_softunlock()
2589 hat_unlock_region(seg->s_as->a_hat, addr, len, svd->rcookie); in segvn_softunlock()
2591 hat_unlock(seg->s_as->a_hat, addr, len); in segvn_softunlock()
2602 (uintptr_t)(adr - seg->s_base); in segvn_softunlock()
2608 (uintptr_t)(adr - seg->s_base); in segvn_softunlock()
2625 if (seg->s_as->a_vbits) in segvn_softunlock()
2626 hat_setstat(seg->s_as, adr, PAGESIZE, in segvn_softunlock()
2630 if (seg->s_as->a_vbits) in segvn_softunlock()
2631 hat_setstat(seg->s_as, adr, PAGESIZE, P_REF); in segvn_softunlock()
2646 if (AS_ISUNMAPWAIT(seg->s_as)) { in segvn_softunlock()
2647 mutex_enter(&seg->s_as->a_contents); in segvn_softunlock()
2648 if (AS_ISUNMAPWAIT(seg->s_as)) { in segvn_softunlock()
2649 AS_CLRUNMAPWAIT(seg->s_as); in segvn_softunlock()
2650 cv_broadcast(&seg->s_as->a_cv); in segvn_softunlock()
2652 mutex_exit(&seg->s_as->a_contents); in segvn_softunlock()
2708 struct seg *seg, /* seg_vn of interest */ in segvn_faultpage() argument
2718 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_faultpage()
2739 ASSERT(SEGVN_READ_HELD(seg->s_as, &svd->lock)); in segvn_faultpage()
2740 ASSERT(seg->s_szc == 0); in segvn_faultpage()
2784 anon_index = svd->anon_index + seg_page(seg, addr); in segvn_faultpage()
2797 seg->s_as->a_proc->p_zone)) { in segvn_faultpage()
2799 atomic_add_long(&seg->s_as->a_resvsize, in segvn_faultpage()
2806 if ((pp = anon_zero(seg, addr, &ap, in segvn_faultpage()
2824 page_migrate(seg, addr, &pp, 1); in segvn_faultpage()
2866 if (AS_ISPGLCK(seg->s_as) && vpage != NULL && in segvn_faultpage()
2869 proc_t *p = seg->s_as->a_proc; in segvn_faultpage()
2904 seg, addr, rw, svd->cred); in segvn_faultpage()
2983 page_migrate(seg, addr, &opp, 1); in segvn_faultpage()
3044 hat_unload(seg->s_as->a_hat, addr, PAGESIZE, in segvn_faultpage()
3075 if (anon_resv_zone(ptob(1), seg->s_as->a_proc->p_zone)) { in segvn_faultpage()
3077 atomic_add_long(&seg->s_as->a_resvsize, ptob(1)); in segvn_faultpage()
3085 pp = anon_private(&ap, seg, addr, prot, opp, pageflags, svd->cred); in segvn_faultpage()
3109 page_migrate(seg, addr, &pp, 1); in segvn_faultpage()
3829 segvn_fault_vnodepages(struct hat *hat, struct seg *seg, caddr_t lpgaddr, in segvn_fault_vnodepages() argument
3833 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_fault_vnodepages()
3836 uint_t szc = seg->s_szc; in segvn_fault_vnodepages()
3844 u_offset_t off = svd->offset + (uintptr_t)(a - seg->s_base); in segvn_fault_vnodepages()
3845 ulong_t aindx = svd->anon_index + seg_page(seg, a); in segvn_fault_vnodepages()
3847 &svd->vpage[seg_page(seg, a)] : NULL; in segvn_fault_vnodepages()
3880 ASSERT(SEGVN_LOCK_HELD(seg->s_as, &svd->lock)); in segvn_fault_vnodepages()
3881 ASSERT(seg->s_szc < NBBY * sizeof (int)); in segvn_fault_vnodepages()
3931 while (szc < seg->s_szc) { in segvn_fault_vnodepages()
3935 seg->s_szc; in segvn_fault_vnodepages()
3961 err = segvn_fault_anonpages(hat, seg, in segvn_fault_vnodepages()
3969 if (szc < seg->s_szc) { in segvn_fault_vnodepages()
3970 szc = seg->s_szc; in segvn_fault_vnodepages()
3990 ASSERT(sameprot(seg, a, maxpgsz)); in segvn_fault_vnodepages()
4009 if (page_alloc_pages(vp, seg, a, &pplist, NULL, in segvn_fault_vnodepages()
4049 &vpprot, ppa, pgsz, seg, a, arw, in segvn_fault_vnodepages()
4137 if (szc < seg->s_szc) { in segvn_fault_vnodepages()
4155 pszc = seg->s_szc; in segvn_fault_vnodepages()
4172 ASSERT(szc == seg->s_szc); in segvn_fault_vnodepages()
4177 seg, a, prot, ppa, vpage, segvn_anypgsz, in segvn_fault_vnodepages()
4267 page_migrate(seg, a, ppa, pages); in segvn_fault_vnodepages()
4290 if (pszc > szc && szc < seg->s_szc && in segvn_fault_vnodepages()
4291 (segvn_anypgsz_vnode || pszc >= seg->s_szc)) { in segvn_fault_vnodepages()
4293 uint_t pszc1 = MIN(pszc, seg->s_szc); in segvn_fault_vnodepages()
4458 page_alloc_pages(vp, seg, a, &pplist, NULL, in segvn_fault_vnodepages()
4534 ASSERT(ierr == -1 || szc < seg->s_szc); in segvn_fault_vnodepages()
4537 ASSERT(pszc > szc && pszc <= seg->s_szc); in segvn_fault_vnodepages()
4562 off = svd->offset + (uintptr_t)(a - seg->s_base); in segvn_fault_vnodepages()
4563 aindx = svd->anon_index + seg_page(seg, a); in segvn_fault_vnodepages()
4565 &svd->vpage[seg_page(seg, a)] : NULL; in segvn_fault_vnodepages()
4586 (uintptr_t)(a - seg->s_base); in segvn_fault_vnodepages()
4587 aindx = svd->anon_index + seg_page(seg, a); in segvn_fault_vnodepages()
4589 &svd->vpage[seg_page(seg, a)] : NULL; in segvn_fault_vnodepages()
4601 segvn_softunlock(seg, lpgaddr, a - lpgaddr, S_OTHER); in segvn_fault_vnodepages()
4618 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault_vnodepages()
4619 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); in segvn_fault_vnodepages()
4621 if (seg->s_szc != 0) { in segvn_fault_vnodepages()
4624 err = segvn_clrszc(seg); in segvn_fault_vnodepages()
4629 ASSERT(err || seg->s_szc == 0); in segvn_fault_vnodepages()
4630 SEGVN_LOCK_DOWNGRADE(seg->s_as, &svd->lock); in segvn_fault_vnodepages()
4641 segvn_fault_anonpages(struct hat *hat, struct seg *seg, caddr_t lpgaddr, in segvn_fault_anonpages() argument
4645 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_fault_anonpages()
4648 uint_t szc = seg->s_szc; in segvn_fault_anonpages()
4654 ulong_t aindx = svd->anon_index + seg_page(seg, a); in segvn_fault_anonpages()
4656 &svd->vpage[seg_page(seg, a)] : NULL; in segvn_fault_anonpages()
4677 ASSERT(SEGVN_LOCK_HELD(seg->s_as, &svd->lock)); in segvn_fault_anonpages()
4720 ASSERT(sameprot(seg, a, maxpgsz)); in segvn_fault_anonpages()
4729 szc = seg->s_szc; in segvn_fault_anonpages()
4742 ierr = anon_map_getpages(amp, aindx, szc, seg, a, in segvn_fault_anonpages()
4772 page_migrate(seg, a, ppa, pages); in segvn_fault_anonpages()
4818 ASSERT(ierr == -1 || szc < seg->s_szc); in segvn_fault_anonpages()
4832 szc = (ierr == -1) ? 0 : seg->s_szc; in segvn_fault_anonpages()
4834 ASSERT(ppa_szc <= seg->s_szc); in segvn_fault_anonpages()
4865 aindx = svd->anon_index + seg_page(seg, a); in segvn_fault_anonpages()
4867 &svd->vpage[seg_page(seg, a)] : NULL; in segvn_fault_anonpages()
4888 aindx = svd->anon_index + seg_page(seg, a); in segvn_fault_anonpages()
4890 &svd->vpage[seg_page(seg, a)] : NULL; in segvn_fault_anonpages()
4904 segvn_softunlock(seg, lpgaddr, a - lpgaddr, S_OTHER); in segvn_fault_anonpages()
4933 segvn_fault(struct hat *hat, struct seg *seg, caddr_t addr, size_t len, in segvn_fault() argument
4936 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_fault()
4954 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_fault()
4963 ASSERT(AS_WRITE_HELD(seg->s_as)); in segvn_fault()
4965 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); in segvn_fault()
4966 pgsz = (seg->s_szc == 0) ? PAGESIZE : in segvn_fault()
4967 page_get_pagesize(seg->s_szc); in segvn_fault()
4969 CALC_LPG_REGION(pgsz, seg, addr, len, lpgaddr, lpgeaddr); in segvn_fault()
4970 segvn_softunlock(seg, lpgaddr, lpgeaddr - lpgaddr, rw); in segvn_fault()
4971 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
4979 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); in segvn_fault()
4984 segvn_textrepl(seg); in segvn_fault()
4989 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
4992 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); in segvn_fault()
4996 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5002 segvn_textunrepl(seg, 0); in segvn_fault()
5009 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5013 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); in segvn_fault()
5041 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5050 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5051 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); in segvn_fault()
5058 hat_leave_region(seg->s_as->a_hat, svd->rcookie, in segvn_fault()
5062 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5093 if (type == F_SOFTLOCK && svd->vp != NULL && seg->s_szc != 0) { in segvn_fault()
5100 pgsz = page_get_pagesize(seg->s_szc); in segvn_fault()
5101 CALC_LPG_REGION(pgsz, seg, addr, len, lpgaddr, in segvn_fault()
5108 ASSERT(demote || AS_WRITE_HELD(seg->s_as)); in segvn_fault()
5111 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5112 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); in segvn_fault()
5113 if (seg->s_szc != 0) { in segvn_fault()
5116 err = segvn_clrszc(seg); in segvn_fault()
5119 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5123 ASSERT(seg->s_szc == 0); in segvn_fault()
5124 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5139 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5140 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); in segvn_fault()
5143 svd->amp = anonmap_alloc(seg->s_size, 0, ANON_SLEEP); in segvn_fault()
5144 svd->amp->a_szc = seg->s_szc; in segvn_fault()
5146 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5162 ASSERT(AS_WRITE_HELD(seg->s_as)); in segvn_fault()
5171 if (seg->s_szc != 0) { in segvn_fault()
5172 pgsz = page_get_pagesize(seg->s_szc); in segvn_fault()
5173 ASSERT(SEGVN_LOCK_HELD(seg->s_as, &svd->lock)); in segvn_fault()
5174 CALC_LPG_REGION(pgsz, seg, addr, len, lpgaddr, lpgeaddr); in segvn_fault()
5176 err = segvn_fault_anonpages(hat, seg, lpgaddr, in segvn_fault()
5179 err = segvn_fault_vnodepages(hat, seg, lpgaddr, in segvn_fault()
5182 ASSERT(seg->s_szc == 0); in segvn_fault()
5183 ASSERT(SEGVN_READ_HELD(seg->s_as, &svd->lock)); in segvn_fault()
5184 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5188 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5192 page = seg_page(seg, addr); in segvn_fault()
5222 hat_chgprot(seg->s_as->a_hat, addr, len, svd->prot); in segvn_fault()
5224 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5235 off = svd->offset + (uintptr_t)(addr - seg->s_base); in segvn_fault()
5380 struct as *as = seg->s_as; in segvn_fault()
5395 (size_t)(seg->s_base + seg->s_size)) && in segvn_fault()
5411 ((seg->s_base + seg->s_size) - addr)); in segvn_fault()
5413 (seg->s_base + seg->s_size)); in segvn_fault()
5436 seg, addr, vp); in segvn_fault()
5438 &vpprot, plp, plsz, seg, addr + (vp_off - off), arw, in segvn_fault()
5441 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5496 err = segvn_faultpage(hat, seg, a, off, vpage, plp, vpprot, in segvn_fault()
5502 segvn_softunlock(seg, addr, (a - addr), in segvn_fault()
5505 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5514 page = seg_page(seg, addr); in segvn_fault()
5557 pp->p_offset < svd->offset + seg->s_size) { in segvn_fault()
5601 seg->s_base + diff, in segvn_fault()
5614 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_fault()
5626 segvn_faulta(struct seg *seg, caddr_t addr) in segvn_faulta() argument
5628 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_faulta()
5633 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_faulta()
5635 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); in segvn_faulta()
5646 svd->anon_index + seg_page(seg, addr))) != NULL) { in segvn_faulta()
5649 0, seg, addr, S_READ, svd->cred); in segvn_faulta()
5652 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_faulta()
5661 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_faulta()
5667 "segvn_getpage:seg %p addr %p vp %p", seg, addr, vp); in segvn_faulta()
5669 (offset_t)(svd->offset + (uintptr_t)(addr - seg->s_base)), in segvn_faulta()
5670 PAGESIZE, NULL, NULL, 0, seg, addr, in segvn_faulta()
5673 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_faulta()
5680 segvn_setprot(struct seg *seg, caddr_t addr, size_t len, uint_t prot) in segvn_setprot() argument
5682 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_setprot()
5690 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_setprot()
5695 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); in segvn_setprot()
5699 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
5716 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
5726 segvn_purge(seg); in segvn_setprot()
5728 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
5736 hat_leave_region(seg->s_as->a_hat, svd->rcookie, in segvn_setprot()
5744 segvn_textunrepl(seg, 0); in segvn_setprot()
5754 if (seg->s_szc != 0) { in segvn_setprot()
5756 pgsz = page_get_pagesize(seg->s_szc); in segvn_setprot()
5760 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
5761 ASSERT(seg->s_base != addr || seg->s_size != len); in segvn_setprot()
5767 if (AS_READ_HELD(seg->s_as)) in segvn_setprot()
5771 err = segvn_demote_range(seg, addr, len, in segvn_setprot()
5774 uint_t szcvec = map_pgszcvec(seg->s_base, in segvn_setprot()
5775 pgsz, (uintptr_t)seg->s_base, in segvn_setprot()
5777 err = segvn_demote_range(seg, addr, len, in segvn_setprot()
5811 if (addr == seg->s_base && in segvn_setprot()
5812 len == seg->s_size && in segvn_setprot()
5815 sz = seg->s_size; in segvn_setprot()
5823 segvn_vpage(seg); in segvn_setprot()
5825 SEGVN_LOCK_EXIT(seg->s_as, in segvn_setprot()
5829 svp = &svd->vpage[seg_page(seg, addr)]; in segvn_setprot()
5830 evp = &svd->vpage[seg_page(seg, in segvn_setprot()
5858 seg->s_as->a_proc->p_zone) == 0) { in segvn_setprot()
5859 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
5867 if (svd->pageswap == 0 && sz == seg->s_size) { in segvn_setprot()
5887 svd->amp == NULL && addr == seg->s_base && in segvn_setprot()
5888 len == seg->s_size && svd->pageprot == 0) { in segvn_setprot()
5891 seg->s_as->a_proc->p_zone); in segvn_setprot()
5894 "anon proc:%p %lu %u", seg, 0, 0); in segvn_setprot()
5899 if (addr == seg->s_base && len == seg->s_size && svd->vpage == NULL) { in segvn_setprot()
5901 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
5921 segvn_vpage(seg); in segvn_setprot()
5923 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
5928 anon_idx = svd->anon_index + seg_page(seg, addr); in segvn_setprot()
5929 ASSERT(seg->s_szc == 0 || in segvn_setprot()
5934 offset = svd->offset + (uintptr_t)(addr - seg->s_base); in segvn_setprot()
5935 evp = &svd->vpage[seg_page(seg, addr + len)]; in segvn_setprot()
5941 for (svp = &svd->vpage[seg_page(seg, addr)]; svp < evp; svp++) { in segvn_setprot()
5943 if (seg->s_szc != 0) { in segvn_setprot()
5949 !segvn_claim_pages(seg, svp, offset, in segvn_setprot()
5983 ASSERT(seg->s_szc == 0); in segvn_setprot()
6016 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
6019 len = (svp - &svd->vpage[seg_page(seg, addr)]) * in segvn_setprot()
6021 ASSERT(seg->s_szc == 0 || IS_P2ALIGNED(len, pgsz)); in segvn_setprot()
6023 hat_unload(seg->s_as->a_hat, addr, in segvn_setprot()
6025 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
6029 segvn_vpage(seg); in segvn_setprot()
6031 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
6035 evp = &svd->vpage[seg_page(seg, addr + len)]; in segvn_setprot()
6036 for (svp = &svd->vpage[seg_page(seg, addr)]; svp < evp; svp++) { in segvn_setprot()
6042 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
6059 hat_unload(seg->s_as->a_hat, addr, len, HAT_UNLOAD); in segvn_setprot()
6068 hat_chgattr(seg->s_as->a_hat, addr, len, prot); in segvn_setprot()
6071 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_setprot()
6081 segvn_setpagesize(struct seg *seg, caddr_t addr, size_t len, uint_t szc) in segvn_setpagesize() argument
6083 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_setpagesize()
6086 struct seg *nseg; in segvn_setpagesize()
6091 u_offset_t off = svd->offset + (uintptr_t)(addr - seg->s_base); in segvn_setpagesize()
6093 ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as)); in segvn_setpagesize()
6094 ASSERT(addr >= seg->s_base && eaddr <= seg->s_base + seg->s_size); in segvn_setpagesize()
6096 if (seg->s_szc == szc || segvn_lpg_disable != 0) { in segvn_setpagesize()
6109 eaddr != seg->s_base + seg->s_size)) { in segvn_setpagesize()
6116 ulong_t an_idx = svd->anon_index + seg_page(seg, addr); in segvn_setpagesize()
6124 if ((svd->flags & MAP_NORESERVE) || seg->s_as == &kas || in segvn_setpagesize()
6135 if (seg->s_szc == 0 && svd->vp != NULL && in segvn_setpagesize()
6147 if (!sameprot(seg, a, eaddr - a)) { in segvn_setpagesize()
6151 if (!sameprot(seg, a, pgsz)) { in segvn_setpagesize()
6180 segvn_purge(seg); in segvn_setpagesize()
6189 hat_leave_region(seg->s_as->a_hat, svd->rcookie, in segvn_setpagesize()
6196 segvn_textunrepl(seg, 1); in segvn_setpagesize()
6204 if (addr != seg->s_base || eaddr != (seg->s_base + seg->s_size)) { in segvn_setpagesize()
6205 if (szc < seg->s_szc) { in segvn_setpagesize()
6207 err = segvn_demote_range(seg, addr, len, SDR_RANGE, 0); in segvn_setpagesize()
6216 if (addr != seg->s_base) { in segvn_setpagesize()
6217 nseg = segvn_split_seg(seg, addr); in segvn_setpagesize()
6224 if (eaddr != (seg->s_base + seg->s_size)) { in segvn_setpagesize()
6226 (void) segvn_split_seg(seg, eaddr); in segvn_setpagesize()
6234 if ((err = segvn_clrszc(seg)) != 0) { in segvn_setpagesize()
6240 ASSERT(seg->s_szc == 0); in segvn_setpagesize()
6247 nseg = AS_SEGNEXT(seg->s_as, seg); in segvn_setpagesize()
6248 if (nseg == NULL || nseg == seg || eaddr != nseg->s_base) { in segvn_setpagesize()
6276 err = segvn_concat(seg, nseg, 1); in segvn_setpagesize()
6304 nahp, 0, btop(seg->s_size), ANON_NOSLEEP)) { in segvn_setpagesize()
6319 eoffpage += seg->s_size; in segvn_setpagesize()
6338 if ((err = anon_fill_cow_holes(seg, seg->s_base, in segvn_setpagesize()
6340 seg->s_size, szc, svd->prot, svd->vpage, in segvn_setpagesize()
6358 seg->s_szc = szc; in segvn_setpagesize()
6364 segvn_clrszc(struct seg *seg) in segvn_clrszc() argument
6366 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_clrszc()
6371 caddr_t a = seg->s_base; in segvn_clrszc()
6372 caddr_t ea = a + seg->s_size; in segvn_clrszc()
6381 ASSERT(AS_WRITE_HELD(seg->s_as) || in segvn_clrszc()
6382 SEGVN_WRITE_HELD(seg->s_as, &svd->lock)); in segvn_clrszc()
6387 seg->s_szc = 0; in segvn_clrszc()
6394 hat_leave_region(seg->s_as->a_hat, svd->rcookie, in segvn_clrszc()
6399 segvn_textunrepl(seg, 1); in segvn_clrszc()
6413 hat_unload(seg->s_as->a_hat, seg->s_base, seg->s_size, in segvn_clrszc()
6418 seg->s_szc = 0; in segvn_clrszc()
6422 pgsz = page_get_pagesize(seg->s_szc); in segvn_clrszc()
6435 ASSERT(sameprot(seg, a, pgsz)); in segvn_clrszc()
6439 if (seg->s_szc != 0) { in segvn_clrszc()
6443 seg, a, prot, vpage, svd->cred)) != 0) { in segvn_clrszc()
6451 anon_pl, PAGESIZE, seg, a, S_READ, in segvn_clrszc()
6455 if ((pp = anon_private(&ap, seg, a, prot, in segvn_clrszc()
6470 seg->s_szc = 0; in segvn_clrszc()
6478 struct seg *seg, in segvn_claim_pages() argument
6484 pgcnt_t pgcnt = page_get_pagecnt(seg->s_szc); in segvn_claim_pages()
6487 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_claim_pages()
6491 + seg->s_base; in segvn_claim_pages()
6502 ASSERT(seg->s_szc != 0); in segvn_claim_pages()
6505 ASSERT(sameprot(seg, addr, pgcnt << PAGESHIFT)); in segvn_claim_pages()
6554 if (ppa[0]->p_szc == seg->s_szc) { in segvn_claim_pages()
6585 static struct seg *
6586 segvn_split_seg(struct seg *seg, caddr_t addr) in segvn_split_seg() argument
6588 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_split_seg()
6589 struct seg *nseg; in segvn_split_seg()
6593 ASSERT(AS_WRITE_HELD(seg->s_as)); in segvn_split_seg()
6596 ASSERT(addr >= seg->s_base); in segvn_split_seg()
6597 ASSERT(addr <= seg->s_base + seg->s_size); in segvn_split_seg()
6600 if (addr == seg->s_base || addr == seg->s_base + seg->s_size) in segvn_split_seg()
6601 return (seg); in segvn_split_seg()
6603 nsize = seg->s_base + seg->s_size - addr; in segvn_split_seg()
6604 seg->s_size = addr - seg->s_base; in segvn_split_seg()
6605 nseg = seg_alloc(seg->s_as, addr, nsize); in segvn_split_seg()
6607 nseg->s_ops = seg->s_ops; in segvn_split_seg()
6610 nseg->s_szc = seg->s_szc; in segvn_split_seg()
6613 nsvd->seg = nseg; in segvn_split_seg()
6619 (uintptr_t)(nseg->s_base - seg->s_base); in segvn_split_seg()
6643 size_t bytes = vpgtob(seg_pages(seg)); in segvn_split_seg()
6650 bcopy(ovpage + seg_pages(seg), nsvd->vpage, nbytes); in segvn_split_seg()
6659 nahp = anon_create(btop(seg->s_size), ANON_SLEEP); in segvn_split_seg()
6661 nahp, 0, btop(seg->s_size), ANON_SLEEP); in segvn_split_seg()
6666 svd->anon_index + btop(seg->s_size), in segvn_split_seg()
6670 oamp->size = seg->s_size; in segvn_split_seg()
6676 pgcnt_t pgcnt = page_get_pagecnt(seg->s_szc); in segvn_split_seg()
6678 ASSERT(seg->s_szc <= svd->amp->a_szc); in segvn_split_seg()
6679 nsvd->anon_index = svd->anon_index + seg_pages(seg); in segvn_split_seg()
6701 svd->anon_index, btop(seg->s_size))); in segvn_split_seg()
6707 svd->swresv = segvn_count_swap_by_vpages(seg); in segvn_split_seg()
6711 ASSERT(svd->swresv == seg->s_size + in segvn_split_seg()
6713 svd->swresv = seg->s_size; in segvn_split_seg()
6731 struct seg *seg, in segvn_demote_range() argument
6739 struct seg *nseg; in segvn_demote_range()
6740 struct seg *badseg1 = NULL; in segvn_demote_range()
6741 struct seg *badseg2 = NULL; in segvn_demote_range()
6743 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_demote_range()
6745 uint_t szc = seg->s_szc; in segvn_demote_range()
6748 ASSERT(AS_WRITE_HELD(seg->s_as)); in segvn_demote_range()
6752 ASSERT(seg->s_base != addr || seg->s_size != len); in segvn_demote_range()
6753 ASSERT(addr >= seg->s_base && eaddr <= seg->s_base + seg->s_size); in segvn_demote_range()
6758 CALC_LPG_REGION(pgsz, seg, addr, len, lpgaddr, lpgeaddr); in segvn_demote_range()
6762 badseg1 = nseg = segvn_split_seg(seg, lpgaddr); in segvn_demote_range()
6768 badseg1 = nseg = segvn_split_seg(seg, lpgaddr); in segvn_demote_range()
6790 badseg1 = nseg = segvn_split_seg(seg, lpgeaddr - pgsz); in segvn_demote_range()
6872 segvn_checkprot(struct seg *seg, caddr_t addr, size_t len, uint_t prot) in segvn_checkprot() argument
6874 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_checkprot()
6877 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_checkprot()
6879 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); in segvn_checkprot()
6887 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_checkprot()
6894 evp = &svd->vpage[seg_page(seg, addr + len)]; in segvn_checkprot()
6895 for (vp = &svd->vpage[seg_page(seg, addr)]; vp < evp; vp++) { in segvn_checkprot()
6897 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_checkprot()
6901 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_checkprot()
6906 segvn_getprot(struct seg *seg, caddr_t addr, size_t len, uint_t *protv) in segvn_getprot() argument
6908 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_getprot()
6909 size_t pgno = seg_page(seg, addr + len) - seg_page(seg, addr) + 1; in segvn_getprot()
6911 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_getprot()
6914 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); in segvn_getprot()
6920 size_t pgoff = seg_page(seg, addr); in segvn_getprot()
6927 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_getprot()
6933 segvn_getoffset(struct seg *seg, caddr_t addr) in segvn_getoffset() argument
6935 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_getoffset()
6937 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_getoffset()
6939 return (svd->offset + (uintptr_t)(addr - seg->s_base)); in segvn_getoffset()
6944 segvn_gettype(struct seg *seg, caddr_t addr) in segvn_gettype() argument
6946 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_gettype()
6948 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_gettype()
6956 segvn_getvp(struct seg *seg, caddr_t addr, struct vnode **vpp) in segvn_getvp() argument
6958 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_getvp()
6960 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_getvp()
6977 segvn_kluster(struct seg *seg, caddr_t addr, ssize_t delta) in segvn_kluster() argument
6979 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_kluster()
6987 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_kluster()
6988 ASSERT(AS_WRITE_HELD(seg->s_as) || in segvn_kluster()
6989 SEGVN_LOCK_HELD(seg->s_as, &svd->lock)); in segvn_kluster()
6991 if (addr + delta < seg->s_base || in segvn_kluster()
6992 addr + delta >= (seg->s_base + seg->s_size)) in segvn_kluster()
6996 page = seg_page(seg, addr); in segvn_kluster()
7084 segvn_swapout(struct seg *seg) in segvn_swapout() argument
7086 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_swapout()
7093 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_swapout()
7095 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); in segvn_swapout()
7102 npages = seg->s_size >> PAGESHIFT; in segvn_swapout()
7238 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_swapout()
7253 segvn_sync(struct seg *seg, caddr_t addr, size_t len, int attr, uint_t flags) in segvn_sync() argument
7255 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_sync()
7272 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_sync()
7274 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); in segvn_sync()
7282 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_sync()
7300 segvn_purge(seg); in segvn_sync()
7302 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_sync()
7312 segvn_purge(seg); in segvn_sync()
7314 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_sync()
7320 offset = svd->offset + (uintptr_t)(addr - seg->s_base); in segvn_sync()
7334 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_sync()
7339 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_sync()
7344 vpp = &svd->vpage[seg_page(seg, addr)]; in segvn_sync()
7355 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_sync()
7360 anon_index = svd->anon_index + seg_page(seg, addr); in segvn_sync()
7407 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_sync()
7470 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_sync()
7479 segvn_incore(struct seg *seg, caddr_t addr, size_t len, char *vec) in segvn_incore() argument
7481 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_incore()
7494 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_incore()
7496 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); in segvn_incore()
7498 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_incore()
7503 p = seg_page(seg, addr); in segvn_incore()
7504 ep = seg_page(seg, addr + len); in segvn_incore()
7532 if ((hat_getattr(seg->s_as->a_hat, addr, in segvn_incore()
7552 offset = svd->offset + (uintptr_t)(addr - seg->s_base); in segvn_incore()
7588 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_incore()
7640 segvn_lockop(struct seg *seg, caddr_t addr, size_t len, in segvn_lockop() argument
7643 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_lockop()
7670 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_lockop()
7686 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); in segvn_lockop()
7697 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_lockop()
7701 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_lockop()
7711 segvn_textunrepl(seg, 0); in segvn_lockop()
7725 segvn_vpage(seg); in segvn_lockop()
7727 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_lockop()
7731 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_lockop()
7743 svd->amp = anonmap_alloc(seg->s_size, 0, ANON_SLEEP); in segvn_lockop()
7744 svd->amp->a_szc = seg->s_szc; in segvn_lockop()
7748 anon_index = svd->anon_index + seg_page(seg, addr); in segvn_lockop()
7751 offset = svd->offset + (uintptr_t)(addr - seg->s_base); in segvn_lockop()
7752 evp = &svd->vpage[seg_page(seg, addr + len)]; in segvn_lockop()
7761 for (vpp = &svd->vpage[seg_page(seg, addr)]; vpp < evp; in segvn_lockop()
7774 i_edx = svd->anon_index + seg_page(seg, addr + len); in segvn_lockop()
7805 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_lockop()
7814 for (vpp = &svd->vpage[seg_page(seg, addr)]; vpp < evp; in segvn_lockop()
7836 pp = anon_zero(seg, addr, &ap, in segvn_lockop()
7901 (uint_t *)NULL, pl, PAGESIZE, seg, addr, in segvn_lockop()
8050 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_lockop()
8074 segvn_advise(struct seg *seg, caddr_t addr, size_t len, uint_t behav) in segvn_advise() argument
8076 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_advise()
8082 struct seg *next; in segvn_advise()
8084 struct seg *prev; in segvn_advise()
8087 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_advise()
8094 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); in segvn_advise()
8096 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8100 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); in segvn_advise()
8112 (seg->s_szc != 0 || HAT_IS_REGION_COOKIE_VALID(svd->rcookie))) || in segvn_advise()
8115 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8134 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8145 segvn_purge(seg); in segvn_advise()
8153 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8163 segvn_purge(seg); in segvn_advise()
8180 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8191 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8195 segvn_purge(seg); in segvn_advise()
8197 page = seg_page(seg, addr); in segvn_advise()
8213 anon_unresv_zone(bytes, seg->s_as->a_proc->p_zone); in segvn_advise()
8215 atomic_add_long(&seg->s_as->a_resvsize, -bytes); in segvn_advise()
8219 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8235 if ((addr == seg->s_base) && (len == seg->s_size)) { in segvn_advise()
8253 if (AS_READ_HELD(seg->s_as)) { in segvn_advise()
8254 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8274 page_mark_migrate(seg, addr, len, amp, svd->anon_index, in segvn_advise()
8291 prev = AS_SEGPREV(seg->s_as, seg); in segvn_advise()
8292 next = AS_SEGNEXT(seg->s_as, seg); in segvn_advise()
8296 (void) segvn_concat(seg, next, 1); in segvn_advise()
8306 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8307 if (!segvn_concat(prev, seg, 1)) in segvn_advise()
8319 ASSERT(seg->s_szc == 0); in segvn_advise()
8321 hat_unload(seg->s_as->a_hat, addr, len, in segvn_advise()
8339 struct seg *new_seg; in segvn_advise()
8344 page = seg_page(seg, addr); in segvn_advise()
8346 segvn_vpage(seg); in segvn_advise()
8348 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8367 if (seg->s_szc != 0) { in segvn_advise()
8370 pgsz = page_get_pagesize(seg->s_szc); in segvn_advise()
8381 off = svd->offset + (uintptr_t)(addr - seg->s_base); in segvn_advise()
8404 AS_READ_HELD(seg->s_as)) { in segvn_advise()
8405 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8413 page_mark_migrate(seg, addr, len, amp, svd->anon_index, in segvn_advise()
8428 hat_leave_region(seg->s_as->a_hat, svd->rcookie, in segvn_advise()
8439 oldeaddr = seg->s_base + seg->s_size; in segvn_advise()
8440 if (addr > seg->s_base) { in segvn_advise()
8446 segvn_purge(seg); in segvn_advise()
8452 new_seg = segvn_split_seg(seg, addr); in segvn_advise()
8491 segvn_purge(seg); in segvn_advise()
8498 if (new_seg != NULL && new_seg != seg) { in segvn_advise()
8516 (void) segvn_split_seg(seg, eaddr); in segvn_advise()
8520 &svd->policy_info, seg->s_size); in segvn_advise()
8527 if (addr == seg->s_base) { in segvn_advise()
8528 prev = AS_SEGPREV(seg->s_as, in segvn_advise()
8529 seg); in segvn_advise()
8542 seg->s_as, in segvn_advise()
8545 prev, seg, 1); in segvn_advise()
8553 ASSERT(seg->s_szc == 0); in segvn_advise()
8555 hat_unload(seg->s_as->a_hat, addr, len, HAT_UNLOAD); in segvn_advise()
8574 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_advise()
8584 segvn_inherit(struct seg *seg, caddr_t addr, size_t len, uint_t behav) in segvn_inherit() argument
8586 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_inherit()
8591 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_inherit()
8597 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_WRITER); in segvn_inherit()
8622 if ((addr == seg->s_base) && (len == seg->s_size)) { in segvn_inherit()
8633 segvn_vpage(seg); in segvn_inherit()
8641 page = seg_page(seg, addr); in segvn_inherit()
8649 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_inherit()
8657 segvn_vpage(struct seg *seg) in segvn_vpage() argument
8659 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_vpage()
8663 ASSERT(SEGVN_WRITE_HELD(seg->s_as, &svd->lock)); in segvn_vpage()
8685 ulong_t mem_needed = seg_pages(seg) * sizeof (struct vpage); in segvn_vpage()
8696 evp = &svd->vpage[seg_page(seg, seg->s_base + seg->s_size)]; in segvn_vpage()
8708 segvn_dump(struct seg *seg) in segvn_dump() argument
8720 npages = seg_pages(seg); in segvn_dump()
8721 svd = (struct segvn_data *)seg->s_data; in segvn_dump()
8724 addr = seg->s_base; in segvn_dump()
8755 dump_addpage(seg->s_as, addr, pfn); in segvn_dump()
8817 segvn_pagelock(struct seg *seg, caddr_t addr, size_t len, struct page ***ppp, in segvn_pagelock() argument
8820 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_pagelock()
8858 "segvn_pagelock: start seg %p addr %p", seg, addr); in segvn_pagelock()
8860 ASSERT(seg->s_as && AS_LOCK_HELD(seg->s_as)); in segvn_pagelock()
8863 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); in segvn_pagelock()
8893 if (seg->s_szc != 0) { in segvn_pagelock()
8918 pgsz = page_get_pagesize(seg->s_szc); in segvn_pagelock()
8919 CALC_LPG_REGION(pgsz, seg, addr, len, lpgaddr, lpgeaddr); in segvn_pagelock()
8959 if (lpgaddr < seg->s_base) { in segvn_pagelock()
8960 lpgaddr = seg->s_base; in segvn_pagelock()
8964 ulong_t aix = svd->anon_index + seg_page(seg, addr); in segvn_pagelock()
8967 lpgaddr = seg->s_base; in segvn_pagelock()
8971 ASSERT(lpgaddr >= seg->s_base); in segvn_pagelock()
8975 struct vpage *vp = &svd->vpage[seg_page(seg, lpgaddr)]; in segvn_pagelock()
8976 struct vpage *evp = &svd->vpage[seg_page(seg, addr)]; in segvn_pagelock()
8996 seg_page(seg, lpgeaddr); in segvn_pagelock()
9006 lpgeaddr > seg->s_base + seg->s_size) { in segvn_pagelock()
9007 lpgeaddr = seg->s_base + seg->s_size; in segvn_pagelock()
9015 vp = &svd->vpage[seg_page(seg, addr + len)]; in segvn_pagelock()
9016 evp = &svd->vpage[seg_page(seg, lpgeaddr)]; in segvn_pagelock()
9039 paddr = (caddr_t)((lpgaddr - seg->s_base) + in segvn_pagelock()
9057 if (seg->s_as->a_vbits) { in segvn_pagelock()
9060 hat_setstat(seg->s_as, a, in segvn_pagelock()
9063 hat_setstat(seg->s_as, a, in segvn_pagelock()
9083 paddr = (caddr_t)((addr - seg->s_base) + in segvn_pagelock()
9086 ptag = (void *)seg; in segvn_pagelock()
9095 seg_pinactive(seg, pamp, paddr, len, in segvn_pagelock()
9122 if (AS_ISUNMAPWAIT(seg->s_as)) { in segvn_pagelock()
9124 mutex_enter(&seg->s_as->a_contents); in segvn_pagelock()
9125 if (AS_ISUNMAPWAIT(seg->s_as)) { in segvn_pagelock()
9126 AS_CLRUNMAPWAIT(seg->s_as); in segvn_pagelock()
9127 cv_broadcast(&seg->s_as->a_cv); in segvn_pagelock()
9129 mutex_exit(&seg->s_as->a_contents); in segvn_pagelock()
9144 segvn_purge(seg); in segvn_pagelock()
9147 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_pagelock()
9149 "segvn_pagelock: unlock seg %p addr %p", seg, addr); in segvn_pagelock()
9175 if (seg->s_szc) { in segvn_pagelock()
9185 ASSERT(seg->s_szc == 0 || in segvn_pagelock()
9186 sameprot(seg, a, pgsz)); in segvn_pagelock()
9187 vp = &svd->vpage[seg_page(seg, a)]; in segvn_pagelock()
9199 pplist = seg_plookup(seg, pamp, paddr, lpgeaddr - lpgaddr, rw, pflags); in segvn_pagelock()
9213 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_pagelock()
9216 "segvn_pagelock: cache hit seg %p addr %p", seg, addr); in segvn_pagelock()
9245 ASSERT(seg->s_szc == 0 || in segvn_pagelock()
9246 sameprot(seg, a, pgsz)); in segvn_pagelock()
9247 vp = &svd->vpage[seg_page(seg, a)]; in segvn_pagelock()
9275 if (seg_pinsert_check(seg, pamp, paddr, in segvn_pagelock()
9302 page = seg_page(seg, addr); in segvn_pagelock()
9307 ASSERT(amp->a_szc >= seg->s_szc); in segvn_pagelock()
9341 if (seg->s_szc) { in segvn_pagelock()
9346 vpage = &svd->vpage[seg_page(seg, a)]; in segvn_pagelock()
9354 error = segvn_faultpage(seg->s_as->a_hat, seg, a, 0, in segvn_pagelock()
9407 (void) seg_pinsert(seg, pamp, paddr, len, wlen, pl, in segvn_pagelock()
9410 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_pagelock()
9412 "segvn_pagelock: cache fill seg %p addr %p", seg, addr); in segvn_pagelock()
9426 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_pagelock()
9429 "segvn_pagelock: cache miss seg %p addr %p", seg, addr); in segvn_pagelock()
9437 segvn_purge(struct seg *seg) in segvn_purge() argument
9439 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_purge()
9455 seg_ppurge(seg, NULL, 0); in segvn_purge()
9458 seg_ppurge(seg, svd->amp, 0); in segvn_purge()
9472 struct seg *seg = (struct seg *)ptag; in segvn_reclaim() local
9473 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_reclaim()
9482 ASSERT(async || AS_LOCK_HELD(seg->s_as)); in segvn_reclaim()
9525 if (async || AS_ISUNMAPWAIT(seg->s_as)) { in segvn_reclaim()
9526 mutex_enter(&seg->s_as->a_contents); in segvn_reclaim()
9528 AS_SETNOUNMAPWAIT(seg->s_as); in segvn_reclaim()
9530 if (AS_ISUNMAPWAIT(seg->s_as)) { in segvn_reclaim()
9531 AS_CLRUNMAPWAIT(seg->s_as); in segvn_reclaim()
9532 cv_broadcast(&seg->s_as->a_cv); in segvn_reclaim()
9534 mutex_exit(&seg->s_as->a_contents); in segvn_reclaim()
9597 segvn_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp) in segvn_getmemid() argument
9599 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_getmemid()
9606 memidp->val[0] = (uintptr_t)seg->s_as; in segvn_getmemid()
9615 (uintptr_t)(addr - seg->s_base); in segvn_getmemid()
9619 SEGVN_LOCK_ENTER(seg->s_as, &svd->lock, RW_READER); in segvn_getmemid()
9622 seg_page(seg, addr); in segvn_getmemid()
9624 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_getmemid()
9634 pp = anon_zero(seg, addr, &ap, svd->cred); in segvn_getmemid()
9659 sameprot(struct seg *seg, caddr_t a, size_t len) in sameprot() argument
9661 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in sameprot()
9671 vpage = &svd->vpage[seg_page(seg, a)]; in sameprot()
9687 segvn_getpolicy(struct seg *seg, caddr_t addr) in segvn_getpolicy() argument
9696 ASSERT(seg != NULL); in segvn_getpolicy()
9698 svn_data = (struct segvn_data *)seg->s_data; in segvn_getpolicy()
9715 anon_index = svn_data->anon_index + seg_page(seg, addr); in segvn_getpolicy()
9717 vn_off = svn_data->offset + (uintptr_t)(addr - seg->s_base); in segvn_getpolicy()
9726 segvn_capable(struct seg *seg, segcapability_t capability) in segvn_capable() argument
9743 segvn_textrepl(struct seg *seg) in segvn_textrepl() argument
9745 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_textrepl()
9748 size_t size = seg->s_size; in segvn_textrepl()
9750 uint_t szc = seg->s_szc; in segvn_textrepl()
9754 proc_t *p = seg->s_as->a_proc; in segvn_textrepl()
9760 ASSERT(AS_LOCK_HELD(seg->s_as)); in segvn_textrepl()
9761 ASSERT(SEGVN_WRITE_HELD(seg->s_as, &svd->lock)); in segvn_textrepl()
9770 ASSERT(seg->s_as != &kas); in segvn_textrepl()
10027 segvn_textunrepl(struct seg *seg, int unload_unmap) in segvn_textunrepl() argument
10029 struct segvn_data *svd = (struct segvn_data *)seg->s_data; in segvn_textunrepl()
10032 size_t size = seg->s_size; in segvn_textunrepl()
10034 uint_t szc = seg->s_szc; in segvn_textunrepl()
10041 ASSERT(AS_LOCK_HELD(seg->s_as)); in segvn_textunrepl()
10042 ASSERT(AS_WRITE_HELD(seg->s_as) || in segvn_textunrepl()
10043 SEGVN_WRITE_HELD(seg->s_as, &svd->lock)); in segvn_textunrepl()
10113 hat_unload_callback(seg->s_as->a_hat, seg->s_base, size, in segvn_textunrepl()
10211 segvn_trupdate_seg(svd->seg, svd, svntrp, in segvn_trupdate()
10220 segvn_trupdate_seg(struct seg *seg, segvn_data_t *svd, svntr_t *svntrp, in segvn_trupdate_seg() argument
10232 ASSERT(svd->offset + seg->s_size == svntrp->tr_eoff); in segvn_trupdate_seg()
10233 ASSERT(seg != NULL); in segvn_trupdate_seg()
10234 ASSERT(svd->seg == seg); in segvn_trupdate_seg()
10235 ASSERT(seg->s_data == (void *)svd); in segvn_trupdate_seg()
10236 ASSERT(seg->s_szc == svntrp->tr_szc); in segvn_trupdate_seg()
10247 as = seg->s_as; in segvn_trupdate_seg()
10272 if (!SEGVN_LOCK_TRYENTER(seg->s_as, &svd->lock, RW_WRITER)) { in segvn_trupdate_seg()
10280 size = seg->s_size; in segvn_trupdate_seg()
10284 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_trupdate_seg()
10291 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_trupdate_seg()
10299 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_trupdate_seg()
10307 amp->a_szc = seg->s_szc; in segvn_trupdate_seg()
10319 hat_unload_callback(as->a_hat, seg->s_base, size, 0, NULL); in segvn_trupdate_seg()
10331 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock); in segvn_trupdate_seg()
10338 ASSERT(svd->seg == seg); in segvn_trupdate_seg()