Lines Matching full:amp
336 * replica's are represented by anon maps (amp). There's one amp per text file
337 * region per lgroup. A process chooses the amp for each of its text mappings
340 * mapping share the same amp. amp's are looked up in svntr_hashtab hash table
343 * forcing COW faults from vnode to amp and mapping amp pages instead of vnode
344 * pages. Replication amp is assigned to a segment when it gets its first
346 * rechecks periodically if the process still maps an amp local to the main
347 * thread. If not async thread forces process to remap to an amp in the new
357 * amp pages are used instead of vnode pages as long as segment has a very
363 * (unmap segment's address range and set svd->amp to NULL).
365 * The original file can be changed after amp is inserted into
549 struct anon_map *amp; in segvn_create() local
567 if (a->amp != NULL && a->vp != NULL) { in segvn_create()
584 (a->amp != NULL && a->type == MAP_PRIVATE) || in segvn_create()
606 } else if (a->amp != NULL) { in segvn_create()
619 if (!(a->flags & MAP_NORESERVE) && ((a->vp == NULL && a->amp == NULL) || in segvn_create()
694 if (a->amp == NULL && !use_rgn && !trok) { in segvn_create()
744 segvn_comb_thrshld || psvd->amp == NULL) && in segvn_create()
858 amp = a->amp; in segvn_create()
859 if ((svd->amp = amp) == NULL) { 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()
906 ANON_LOCK_ENTER(&->a_rwlock, RW_WRITER); in segvn_create()
907 amp->refcnt++; in segvn_create()
908 if (a->szc > amp->a_szc) { in segvn_create()
909 amp->a_szc = a->szc; in segvn_create()
911 ANON_LOCK_EXIT(&->a_rwlock); 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()
943 ANON_LOCK_ENTER(&->a_rwlock, RW_WRITER); in segvn_create()
950 if ((ap = anon_get_ptr(amp->ahp, in segvn_create()
969 ASSERT(anon_get_ptr(amp->ahp, in segvn_create()
971 (void) anon_set_ptr(amp->ahp, anon_idx, ap, in segvn_create()
984 anon_dup(amp->ahp, anon_num, svd->amp->ahp, in segvn_create()
986 ANON_LOCK_EXIT(&->a_rwlock); in segvn_create()
999 (void) lgrp_shm_policy_set(mpolicy, svd->amp, svd->anon_index, in segvn_create()
1004 ASSERT(svd->amp == NULL); in segvn_create()
1028 struct anon_map *amp1 = svd1->amp; in segvn_concat()
1029 struct anon_map *amp2 = svd2->amp; in segvn_concat()
1072 * segments with non NULL amp. in segvn_concat()
1158 svd2->amp = NULL; in segvn_concat()
1221 svd2->amp = NULL; /* needed for seg_free */ in segvn_concat()
1225 svd1->amp = namp; in segvn_concat()
1302 amp1 = svd1->amp; in segvn_extend_prev()
1419 amp2 = svd2->amp; in segvn_extend_next()
1528 if ((ap = anon_get_ptr(svd->amp->ahp, old_idx)) != NULL) { in segvn_dup_pages()
1562 (void) anon_set_ptr(newsvd->amp->ahp, new_idx, newap, in segvn_dup_pages()
1582 struct anon_map *amp; in segvn_dup() local
1634 if ((amp = svd->amp) == NULL || svd->tr_state == SEGVN_TR_ON) { in segvn_dup()
1641 ASSERT(newsvd->vp != NULL && amp != NULL); in segvn_dup()
1646 newsvd->amp = NULL; in segvn_dup()
1655 newsvd->amp = amp; in segvn_dup()
1656 ANON_LOCK_ENTER(&->a_rwlock, RW_WRITER); in segvn_dup()
1657 amp->refcnt++; in segvn_dup()
1658 ANON_LOCK_EXIT(&->a_rwlock); in segvn_dup()
1666 newsvd->amp = anonmap_alloc(newseg->s_size, 0, in segvn_dup()
1668 newsvd->amp->a_szc = newseg->s_szc; in segvn_dup()
1735 anon_dup_fill_holes(amp->ahp, in segvn_dup()
1736 svd->anon_index, newsvd->amp->ahp, in segvn_dup()
1740 anon_dup(amp->ahp, svd->anon_index, in segvn_dup()
1741 newsvd->amp->ahp, 0, seg->s_size); in segvn_dup()
1775 ASSERT(newsvd->amp == NULL); in segvn_dup()
1866 struct anon_map *amp; in segvn_unmap() local
1927 ASSERT(svd->amp == NULL); in segvn_unmap()
1941 ASSERT(svd->amp != NULL); in segvn_unmap()
1943 ASSERT(svd->amp == NULL); in segvn_unmap()
1978 ASSERT(svd->amp == NULL); in segvn_unmap()
1985 ASSERT(svd->amp != NULL); in segvn_unmap()
1988 ASSERT(svd->amp == NULL && svd->tr_state == SEGVN_TR_OFF); in segvn_unmap()
2024 amp = svd->amp; in segvn_unmap()
2025 ASSERT(amp == NULL || amp->a_szc >= seg->s_szc); in segvn_unmap()
2044 if (amp != NULL) { in segvn_unmap()
2045 ANON_LOCK_ENTER(&->a_rwlock, RW_WRITER); in segvn_unmap()
2046 if (amp->refcnt == 1 || svd->type == MAP_PRIVATE) { in segvn_unmap()
2050 * pcache that belong to this amp. in segvn_unmap()
2053 ASSERT(amp->refcnt == 1); in segvn_unmap()
2055 anonmap_purge(amp); in segvn_unmap()
2060 if (amp->a_szc == seg->s_szc) { in segvn_unmap()
2062 anon_free_pages(amp->ahp, in segvn_unmap()
2066 anon_free(amp->ahp, in segvn_unmap()
2072 ASSERT(amp->a_szc > seg->s_szc); in segvn_unmap()
2073 anon_shmap_free_pages(amp, in segvn_unmap()
2085 amp->swresv -= len; in segvn_unmap()
2088 ANON_LOCK_EXIT(&->a_rwlock); in segvn_unmap()
2099 ASSERT(amp); in segvn_unmap()
2102 svd->swresv = ptob(anon_pages(amp->ahp, in segvn_unmap()
2151 if (amp != NULL) { in segvn_unmap()
2152 ANON_LOCK_ENTER(&->a_rwlock, RW_WRITER); in segvn_unmap()
2153 if (amp->refcnt == 1 || svd->type == MAP_PRIVATE) { in segvn_unmap()
2162 * pcache that belong to this amp. in segvn_unmap()
2165 ASSERT(amp->refcnt == 1); in segvn_unmap()
2167 anonmap_purge(amp); in segvn_unmap()
2170 if (amp->a_szc == seg->s_szc) { in segvn_unmap()
2172 anon_free_pages(amp->ahp, in segvn_unmap()
2176 anon_free(amp->ahp, an_idx, in segvn_unmap()
2181 ASSERT(amp->a_szc > seg->s_szc); in segvn_unmap()
2182 anon_shmap_free_pages(amp, in segvn_unmap()
2194 amp->swresv -= len; in segvn_unmap()
2197 ANON_LOCK_EXIT(&->a_rwlock); in segvn_unmap()
2204 ASSERT(amp); in segvn_unmap()
2206 svd->swresv = ptob(anon_pages(amp->ahp, in segvn_unmap()
2296 if (amp == NULL) { in segvn_unmap()
2297 nsvd->amp = NULL; in segvn_unmap()
2306 ANON_LOCK_ENTER(&->a_rwlock, RW_WRITER); in segvn_unmap()
2307 if (amp->refcnt == 1 || svd->type == MAP_PRIVATE) { in segvn_unmap()
2316 * pcache that belong to this amp. in segvn_unmap()
2319 ASSERT(amp->refcnt == 1); in segvn_unmap()
2321 anonmap_purge(amp); in segvn_unmap()
2324 if (amp->a_szc == seg->s_szc) { in segvn_unmap()
2326 anon_free_pages(amp->ahp, an_idx, len, in segvn_unmap()
2329 anon_free(amp->ahp, an_idx, in segvn_unmap()
2334 ASSERT(amp->a_szc > seg->s_szc); in segvn_unmap()
2335 anon_shmap_free_pages(amp, an_idx, len); in segvn_unmap()
2346 amp->swresv -= len; in segvn_unmap()
2352 amp->refcnt++; in segvn_unmap()
2353 nsvd->amp = amp; in segvn_unmap()
2362 (void) anon_copy_ptr(amp->ahp, svd->anon_index, nahp, in segvn_unmap()
2364 (void) anon_copy_ptr(amp->ahp, nsvd->anon_index, in segvn_unmap()
2366 anon_release(amp->ahp, btop(amp->size)); in segvn_unmap()
2369 amp->ahp = nahp; in segvn_unmap()
2370 amp->size = seg->s_size; in segvn_unmap()
2371 nsvd->amp = namp; in segvn_unmap()
2373 ANON_LOCK_EXIT(&->a_rwlock); in segvn_unmap()
2377 ASSERT(amp); in segvn_unmap()
2379 svd->swresv = ptob(anon_pages(amp->ahp, in segvn_unmap()
2381 nsvd->swresv = ptob(anon_pages(nsvd->amp->ahp, in segvn_unmap()
2424 struct anon_map *amp; in segvn_free() local
2450 if ((amp = svd->amp) != NULL) { in segvn_free()
2456 ANON_LOCK_ENTER(&->a_rwlock, RW_WRITER); in segvn_free()
2457 ASSERT(amp->a_szc >= seg->s_szc); in segvn_free()
2458 if (--amp->refcnt == 0) { in segvn_free()
2465 anon_free_pages(amp->ahp, in segvn_free()
2469 anon_free(amp->ahp, svd->anon_index, in segvn_free()
2477 * pcache that belong to this amp. in segvn_free()
2480 anonmap_purge(amp); in segvn_free()
2487 if (amp->a_szc != 0) { in segvn_free()
2488 anon_shmap_free_pages(amp, 0, in segvn_free()
2489 amp->size); in segvn_free()
2491 anon_free(amp->ahp, 0, amp->size); in segvn_free()
2493 if ((len = amp->swresv) != 0) { in segvn_free()
2500 svd->amp = NULL; in segvn_free()
2501 ANON_LOCK_EXIT(&->a_rwlock); in segvn_free()
2502 anonmap_free(amp); in segvn_free()
2510 anon_free_pages(amp->ahp, svd->anon_index, in segvn_free()
2513 anon_free(amp->ahp, svd->anon_index, in segvn_free()
2516 ANON_LOCK_EXIT(&->a_rwlock); in segvn_free()
2518 ANON_LOCK_EXIT(&->a_rwlock); in segvn_free()
2578 struct anon_map *amp; in segvn_softunlock() local
2584 if ((amp = svd->amp) != NULL) in segvn_softunlock()
2594 if (amp != NULL) { in segvn_softunlock()
2595 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_softunlock()
2596 if ((ap = anon_get_ptr(amp->ahp, anon_index++)) in segvn_softunlock()
2604 ANON_LOCK_EXIT(&->a_rwlock); in segvn_softunlock()
2730 struct anon_map *amp; in segvn_faultpage() local
2782 if ((amp = svd->amp) != NULL) { in segvn_faultpage()
2783 ASSERT(RW_READ_HELD(&->a_rwlock)); in segvn_faultpage()
2785 anon_array_enter(amp, anon_index, &cookie); in segvn_faultpage()
2789 if (svd->vp == NULL && amp != NULL) { in segvn_faultpage()
2790 if ((ap = anon_get_ptr(amp->ahp, anon_index)) == NULL) { in segvn_faultpage()
2815 (void) anon_set_ptr(amp->ahp, anon_index, ap, in segvn_faultpage()
2901 if (amp != NULL) { in segvn_faultpage()
2902 if ((ap = anon_get_ptr(amp->ahp, anon_index)) != NULL) { in segvn_faultpage()
2965 ASSERT(amp != NULL); in segvn_faultpage()
2994 ASSERT(amp == NULL || in segvn_faultpage()
3012 ASSERT(amp != NULL && anon_lock); in segvn_faultpage()
3018 if ((ap = anon_get_ptr(amp->ahp, anon_index)) == NULL) in segvn_faultpage()
3103 (void) anon_set_ptr(amp->ahp, anon_index, ap, ANON_SLEEP); in segvn_faultpage()
3834 struct anon_map *amp = svd->amp; in segvn_fault_vnodepages() local
3873 ASSERT(brkcow == 0 || amp != NULL); in segvn_fault_vnodepages()
3874 ASSERT(tron == 0 || amp != NULL); in segvn_fault_vnodepages()
3879 ASSERT(amp == NULL || IS_P2ALIGNED(aindx, maxpages)); in segvn_fault_vnodepages()
3924 VM_STAT_COND_ADD(amp != NULL, segvnvmstats.fltvnpages[3]); in segvn_fault_vnodepages()
3951 if (IS_P2ALIGNED(a, maxpgsz) && amp != NULL) { in segvn_fault_vnodepages()
3953 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_fault_vnodepages()
3954 anon_array_enter(amp, aindx, &an_cookie); in segvn_fault_vnodepages()
3955 if (anon_get_ptr(amp->ahp, aindx) != NULL) { in segvn_fault_vnodepages()
3957 ASSERT(anon_pages(amp->ahp, aindx, in segvn_fault_vnodepages()
3960 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
3977 ASSERT(anon_pages(amp->ahp, aindx, in segvn_fault_vnodepages()
3981 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
4116 if (amp != NULL) { in segvn_fault_vnodepages()
4117 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_fault_vnodepages()
4118 anon_array_enter(amp, aindx, &an_cookie); in segvn_fault_vnodepages()
4120 if (amp != NULL && in segvn_fault_vnodepages()
4121 anon_get_ptr(amp->ahp, aindx) != NULL) { in segvn_fault_vnodepages()
4125 ASSERT(anon_pages(amp->ahp, taindx, in segvn_fault_vnodepages()
4131 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
4163 if (amp != NULL) { in segvn_fault_vnodepages()
4165 ASSERT(!anon_pages(amp->ahp, taindx, maxpages)); in segvn_fault_vnodepages()
4170 ASSERT(amp != NULL); in segvn_fault_vnodepages()
4176 ierr = anon_map_privatepages(amp, aindx, szc, in segvn_fault_vnodepages()
4182 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
4205 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
4280 if (amp != NULL) { in segvn_fault_vnodepages()
4282 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
4313 if (amp != NULL) { in segvn_fault_vnodepages()
4315 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
4352 if (amp != NULL) { in segvn_fault_vnodepages()
4354 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
4387 if (amp != NULL) { in segvn_fault_vnodepages()
4389 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
4445 if (amp != NULL) { in segvn_fault_vnodepages()
4447 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
4464 if (amp != NULL) { in segvn_fault_vnodepages()
4466 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
4506 if (amp != NULL) { in segvn_fault_vnodepages()
4508 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_vnodepages()
4646 struct anon_map *amp = svd->amp; in segvn_fault_anonpages() local
4669 ASSERT(amp != NULL); in segvn_fault_anonpages()
4711 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_fault_anonpages()
4740 anon_array_enter(amp, aindx, &cookie); in segvn_fault_anonpages()
4742 ierr = anon_map_getpages(amp, aindx, szc, seg, a, in segvn_fault_anonpages()
4895 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_anonpages()
4900 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault_anonpages()
4947 struct anon_map *amp; in segvn_fault() local
4955 ASSERT(svd->amp == NULL || svd->rcookie == HAT_INVALID_REGION_COOKIE); in segvn_fault()
4981 ASSERT(svd->vp != NULL && svd->amp == NULL); in segvn_fault()
4987 svd->amp != NULL); in segvn_fault()
5001 ASSERT(svd->vp != NULL && svd->amp != NULL); in segvn_fault()
5003 ASSERT(svd->amp == NULL && in segvn_fault()
5008 ASSERT(svd->amp == NULL && svd->tr_state == SEGVN_TR_OFF); in segvn_fault()
5048 ASSERT(svd->amp == NULL); in segvn_fault()
5132 if (svd->amp == NULL && (svd->vp == NULL || brkcow)) { in segvn_fault()
5142 if (svd->amp == NULL) { 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()
5166 amp = svd->amp; in segvn_fault()
5193 if (amp != NULL) { in segvn_fault()
5203 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_fault()
5214 anon_array_enter(amp, index, &cookie); in segvn_fault()
5215 ap = anon_get_ptr(amp->ahp, index); in segvn_fault()
5218 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault()
5223 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault()
5258 if (amp != NULL) in segvn_fault()
5272 if (amp != NULL) { in segvn_fault()
5273 ANON_LOCK_ENTER(&->a_rwlock, in segvn_fault()
5275 anon_array_enter(amp, fanon_index, in segvn_fault()
5277 fap = anon_get_ptr(amp->ahp, in segvn_fault()
5286 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault()
5358 if (amp == NULL) in segvn_fault()
5362 * Only acquire reader lock to prevent amp->ahp in segvn_fault()
5366 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_fault()
5367 ap = anon_get_ptr(amp->ahp, anon_index); in segvn_fault()
5373 dogetpage = non_anon(amp->ahp, anon_index, in segvn_fault()
5375 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault()
5479 * locking scheme with per amp rwlock and a global set of hash in segvn_fault()
5489 if (amp != NULL) in segvn_fault()
5490 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_fault()
5499 if (amp != NULL) in segvn_fault()
5500 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault()
5578 if (amp != NULL) { in segvn_fault()
5580 anon_array_enter(amp, anon_index, &cookie); in segvn_fault()
5581 ap = anon_get_ptr(amp->ahp, anon_index); in segvn_fault()
5583 if ((amp == NULL) || (ap == NULL)) { in segvn_fault()
5597 ASSERT(amp == NULL || in segvn_fault()
5606 if (amp != NULL) in segvn_fault()
5612 if (amp != NULL) in segvn_fault()
5613 ANON_LOCK_EXIT(&->a_rwlock); in segvn_fault()
5630 struct anon_map *amp; in segvn_faulta() local
5636 if ((amp = svd->amp) != NULL) { in segvn_faulta()
5640 * Reader lock to prevent amp->ahp from being changed. in segvn_faulta()
5644 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_faulta()
5645 if ((ap = anon_get_ptr(amp->ahp, in segvn_faulta()
5651 ANON_LOCK_EXIT(&->a_rwlock); in segvn_faulta()
5657 ANON_LOCK_EXIT(&->a_rwlock); in segvn_faulta()
5734 ASSERT(svd->amp == NULL); in segvn_setprot()
5743 ASSERT(svd->amp != NULL); in segvn_setprot()
5745 ASSERT(svd->amp == NULL && svd->tr_state == SEGVN_TR_OFF); in segvn_setprot()
5887 svd->amp == NULL && addr == seg->s_base && in segvn_setprot()
5909 struct anon_map *amp; in segvn_setprot() local
5927 if ((amp = svd->amp) != NULL) { in segvn_setprot()
5931 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_setprot()
5944 if (amp != NULL) { in segvn_setprot()
5945 anon_array_enter(amp, anon_idx, in segvn_setprot()
5951 if (amp != NULL) { in segvn_setprot()
5956 if (amp != NULL) { in segvn_setprot()
5961 if (amp != NULL) { in segvn_setprot()
5962 anon_array_enter(amp, anon_idx, in segvn_setprot()
5964 ap = anon_get_ptr(amp->ahp, anon_idx++); in segvn_setprot()
5970 if (amp == NULL || ap == NULL) { in segvn_setprot()
5975 if (amp != NULL) in segvn_setprot()
6001 } else if (amp != NULL) in segvn_setprot()
6007 if (amp != NULL) in segvn_setprot()
6008 ANON_LOCK_EXIT(&->a_rwlock); in segvn_setprot()
6085 struct anon_map *amp = svd->amp; in segvn_setpagesize() local
6115 if (amp != NULL && svd->type == MAP_SHARED) { in segvn_setpagesize()
6187 ASSERT(svd->amp == NULL); in segvn_setpagesize()
6195 ASSERT(svd->amp != NULL); in segvn_setpagesize()
6197 ASSERT(svd->amp == NULL && svd->tr_state == SEGVN_TR_OFF); in segvn_setpagesize()
6198 amp = NULL; in segvn_setpagesize()
6290 if (amp != NULL) { in segvn_setpagesize()
6296 ANON_LOCK_ENTER(&->a_rwlock, RW_WRITER); in segvn_setpagesize()
6297 ASSERT(amp->refcnt == 1); in segvn_setpagesize()
6298 nahp = anon_create(btop(amp->size), ANON_NOSLEEP); in segvn_setpagesize()
6300 ANON_LOCK_EXIT(&->a_rwlock); in segvn_setpagesize()
6303 if (anon_copy_ptr(amp->ahp, svd->anon_index, in segvn_setpagesize()
6305 anon_release(nahp, btop(amp->size)); in segvn_setpagesize()
6306 ANON_LOCK_EXIT(&->a_rwlock); in segvn_setpagesize()
6309 anon_release(amp->ahp, btop(amp->size)); in segvn_setpagesize()
6310 amp->ahp = nahp; in segvn_setpagesize()
6312 ANON_LOCK_EXIT(&->a_rwlock); in segvn_setpagesize()
6329 if (amp != NULL) { in segvn_setpagesize()
6339 amp->ahp, svd->anon_index, svd->vp, svd->offset, in segvn_setpagesize()
6348 if (amp != NULL) { in segvn_setpagesize()
6349 ANON_LOCK_ENTER(&->a_rwlock, RW_WRITER); in segvn_setpagesize()
6351 amp->a_szc = szc; in segvn_setpagesize()
6352 } else if (szc > amp->a_szc) { in segvn_setpagesize()
6353 amp->a_szc = szc; in segvn_setpagesize()
6355 ANON_LOCK_EXIT(&->a_rwlock); in segvn_setpagesize()
6367 struct anon_map *amp = svd->amp; in segvn_clrszc() local
6385 if (vp == NULL && amp == NULL) { in segvn_clrszc()
6392 ASSERT(svd->amp == NULL); in segvn_clrszc()
6398 ASSERT(svd->amp != NULL); in segvn_clrszc()
6400 ASSERT(svd->amp == NULL && svd->tr_state == SEGVN_TR_OFF); in segvn_clrszc()
6401 amp = NULL; in segvn_clrszc()
6417 if (amp == NULL || svd->type == MAP_SHARED) { in segvn_clrszc()
6429 ANON_LOCK_ENTER(&->a_rwlock, RW_WRITER); in segvn_clrszc()
6432 if ((oldap = anon_get_ptr(amp->ahp, an_idx)) != NULL) { in segvn_clrszc()
6440 ASSERT(vp == NULL || anon_pages(amp->ahp, in segvn_clrszc()
6442 if ((err = anon_map_demotepages(amp, an_idx, in segvn_clrszc()
6461 (void) anon_set_ptr(amp->ahp, an_idx, ap, in segvn_clrszc()
6469 amp->a_szc = 0; in segvn_clrszc()
6472 ANON_LOCK_EXIT(&->a_rwlock); in segvn_clrszc()
6488 struct anon_map *amp = svd->amp; in segvn_claim_pages() local
6498 int anon = (amp != NULL) ? 1 : 0; in segvn_claim_pages()
6504 ASSERT(amp == NULL || IS_P2ALIGNED(anon_idx, pgcnt)); in segvn_claim_pages()
6514 if (anon_get_ptr(amp->ahp, anon_idx) == NULL) { in segvn_claim_pages()
6516 ASSERT(!anon_pages(amp->ahp, anon_idx, pgcnt)); in segvn_claim_pages()
6519 anon_pages(amp->ahp, anon_idx, pgcnt) == pgcnt); in segvn_claim_pages()
6526 ap = anon_get_ptr(amp->ahp, anon_idx); in segvn_claim_pages()
6653 if (svd->amp != NULL && svd->type == MAP_PRIVATE) { in segvn_split_seg()
6654 struct anon_map *oamp = svd->amp, *namp; in segvn_split_seg()
6672 nsvd->amp = namp; in segvn_split_seg()
6675 } else if (svd->amp != NULL) { in segvn_split_seg()
6677 ASSERT(svd->amp == nsvd->amp); in segvn_split_seg()
6678 ASSERT(seg->s_szc <= svd->amp->a_szc); in segvn_split_seg()
6681 ANON_LOCK_ENTER(&svd->amp->a_rwlock, RW_WRITER); in segvn_split_seg()
6682 svd->amp->refcnt++; in segvn_split_seg()
6683 ANON_LOCK_EXIT(&svd->amp->a_rwlock); in segvn_split_seg()
6698 ASSERT(svd->amp); in segvn_split_seg()
6700 svd->swresv = ptob(anon_pages(svd->amp->ahp, in segvn_split_seg()
6702 nsvd->swresv = ptob(anon_pages(nsvd->amp->ahp, in segvn_split_seg()
6985 struct anon_map *amp; in segvn_kluster() local
7023 if ((amp = svd->amp) == NULL) in segvn_kluster()
7028 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_kluster()
7030 oap = anon_get_ptr(amp->ahp, page); in segvn_kluster()
7031 ap = anon_get_ptr(amp->ahp, page + pd); in segvn_kluster()
7033 ANON_LOCK_EXIT(&->a_rwlock); in segvn_kluster()
7087 struct anon_map *amp; in segvn_swapout() local
7100 if ((amp = svd->amp) != NULL) in segvn_swapout()
7117 if (amp != NULL) { in segvn_swapout()
7118 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_swapout()
7119 if (anon_array_try_enter(amp, anon_index + page, in segvn_swapout()
7121 ANON_LOCK_EXIT(&->a_rwlock); in segvn_swapout()
7124 ap = anon_get_ptr(amp->ahp, anon_index + page); in segvn_swapout()
7132 ANON_LOCK_EXIT(&->a_rwlock); in segvn_swapout()
7268 struct anon_map *amp; in segvn_sync() local
7305 } else if (svd->type == MAP_SHARED && svd->amp != NULL && in segvn_sync()
7306 svd->amp->a_softlockcnt > 0) { in segvn_sync()
7308 * Try to purge this amp's entries from pcache. It will in segvn_sync()
7309 * succeed only if other segments that share the amp have no in segvn_sync()
7313 if (svd->amp->a_softlockcnt > 0 || svd->softlockcnt > 0) { in segvn_sync()
7346 } else if (svd->vp && svd->amp == NULL && in segvn_sync()
7359 if ((amp = svd->amp) != NULL) in segvn_sync()
7364 if (amp != NULL) { in segvn_sync()
7365 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_sync()
7366 anon_array_enter(amp, anon_index, &cookie); in segvn_sync()
7367 ap = anon_get_ptr(amp->ahp, anon_index++); in segvn_sync()
7375 ANON_LOCK_EXIT(&->a_rwlock); in segvn_sync()
7428 } else if (svd->type == MAP_SHARED && amp != NULL) { in segvn_sync()
7489 struct anon_map *amp; /* XXX - for locknest */ in segvn_incore() local
7497 if (svd->amp == NULL && svd->vp == NULL) { in segvn_incore()
7507 amp = svd->amp; in segvn_incore()
7514 if (amp != NULL) { in segvn_incore()
7515 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_incore()
7516 anon_array_enter(amp, svd->anon_index + p, &cookie); in segvn_incore()
7517 ap = anon_get_ptr(amp->ahp, svd->anon_index + p); in segvn_incore()
7522 ANON_LOCK_EXIT(&->a_rwlock); in segvn_incore()
7654 struct anon_map *amp; in segvn_lockop() local
7678 if (svd->amp != NULL && svd->amp->a_sp != NULL) { in segvn_lockop()
7681 sp = svd->amp->a_sp; in segvn_lockop()
7710 ASSERT(svd->amp != NULL); in segvn_lockop()
7712 ASSERT(svd->amp == NULL && in segvn_lockop()
7741 if (op == MC_LOCK && svd->amp == NULL && svd->vp == NULL) { 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()
7747 if ((amp = svd->amp) != NULL) { in segvn_lockop()
7775 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_lockop()
7777 anon_array_enter(amp, i_idx, &i_cookie); in segvn_lockop()
7778 i_ap = anon_get_ptr(amp->ahp, i_idx); in segvn_lockop()
7794 ANON_LOCK_EXIT(&->a_rwlock); in segvn_lockop()
7820 if (amp != NULL) in segvn_lockop()
7821 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_lockop()
7829 amp != NULL && in segvn_lockop()
7830 ((ap = anon_get_ptr(amp->ahp, anon_index)) in segvn_lockop()
7832 anon_array_enter(amp, anon_index, &cookie); in segvn_lockop()
7834 if ((ap = anon_get_ptr(amp->ahp, in segvn_lockop()
7840 ANON_LOCK_EXIT(&->a_rwlock); in segvn_lockop()
7844 ASSERT(anon_get_ptr(amp->ahp, in segvn_lockop()
7846 (void) anon_set_ptr(amp->ahp, in segvn_lockop()
7858 if (amp != NULL) { in segvn_lockop()
7859 anon_array_enter(amp, anon_index, &cookie); in segvn_lockop()
7860 ap = anon_get_ptr(amp->ahp, anon_index); in segvn_lockop()
7867 ANON_LOCK_EXIT(&->a_rwlock); in segvn_lockop()
7875 ANON_LOCK_EXIT(&->a_rwlock); in segvn_lockop()
7906 ANON_LOCK_EXIT(&->a_rwlock); in segvn_lockop()
7985 ANON_LOCK_EXIT(&->a_rwlock); in segvn_lockop()
8080 struct anon_map *amp; in segvn_advise() local
8156 } else if (svd->type == MAP_SHARED && svd->amp != NULL && in segvn_advise()
8157 svd->amp->a_softlockcnt > 0) { in segvn_advise()
8159 * Try to purge this amp's entries from pcache. It in segvn_advise()
8161 * amp have no outstanding softlock's. in segvn_advise()
8167 amp = svd->amp; in segvn_advise()
8172 if (behav == MADV_FREE && (vp != NULL || amp == NULL)) { in segvn_advise()
8184 if (amp == NULL) { in segvn_advise()
8198 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_advise()
8199 err = anon_disclaim(amp, in segvn_advise()
8218 ANON_LOCK_EXIT(&->a_rwlock); in segvn_advise()
8245 already_set = lgrp_shm_policy_set(policy, amp, in segvn_advise()
8274 page_mark_migrate(seg, addr, len, amp, svd->anon_index, in segvn_advise()
8384 already_set = lgrp_shm_policy_set(policy, amp, in segvn_advise()
8413 page_mark_migrate(seg, addr, len, amp, svd->anon_index, in segvn_advise()
8425 ASSERT(svd->amp == NULL); in segvn_advise()
8712 struct anon_map *amp; in segvn_dump() local
8726 if ((amp = svd->amp) != NULL) { in segvn_dump()
8728 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_dump()
8735 if (amp && (ap = anon_get_ptr(svd->amp->ahp, anon_index++))) { in segvn_dump()
8763 if (amp != NULL) in segvn_dump()
8764 ANON_LOCK_EXIT(&->a_rwlock); in segvn_dump()
8827 struct anon_map *amp; in segvn_pagelock() local
8878 if ((amp = svd->amp) == NULL) { in segvn_pagelock()
8883 panic("segvn_pagelock(L_PAGEUNLOCK): amp == NULL"); in segvn_pagelock()
9032 * For MAP_SHARED segments we create pcache entries tagged by amp and in segvn_pagelock()
9034 * that map this amp. For private segments pcache entries are tagged in segvn_pagelock()
9038 pamp = amp; in segvn_pagelock()
9306 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_pagelock()
9307 ASSERT(amp->a_szc >= seg->s_szc); in segvn_pagelock()
9308 anpgcnt = page_get_pagecnt(amp->a_szc); in segvn_pagelock()
9324 anon_array_enter(amp, anon_index, &cookie); in segvn_pagelock()
9327 ap = anon_get_ptr(amp->ahp, anon_index); in segvn_pagelock()
9360 anon_array_enter(amp, anon_index, &cookie); in segvn_pagelock()
9362 ap = anon_get_ptr(amp->ahp, anon_index); in segvn_pagelock()
9390 ANON_LOCK_EXIT(&->a_rwlock); in segvn_pagelock()
9444 if (svd->amp == NULL || svd->vp != NULL) { in segvn_purge()
9457 } else if (svd->softlockcnt == 0 && svd->amp->a_softlockcnt != 0) { in segvn_purge()
9458 seg_ppurge(seg, svd->amp, 0); in segvn_purge()
9480 ASSERT(svd->vp == NULL && svd->amp != NULL); in segvn_reclaim()
9549 amp_t *amp = (amp_t *)ptag; in shamp_reclaim() local
9555 ASSERT(amp->a_softlockcnt >= npages); in shamp_reclaim()
9580 mutex_enter(&->a_purgemtx); in shamp_reclaim()
9581 if (!atomic_add_long_nv((ulong_t *)&->a_softlockcnt, -npages) && in shamp_reclaim()
9582 amp->a_purgewait) { in shamp_reclaim()
9583 amp->a_purgewait = 0; in shamp_reclaim()
9584 cv_broadcast(&->a_purgecv); in shamp_reclaim()
9586 mutex_exit(&->a_purgemtx); in shamp_reclaim()
9602 struct anon_map *amp; in segvn_getmemid() local
9620 if ((amp = svd->amp) != NULL) { in segvn_getmemid()
9626 ASSERT(amp != NULL); in segvn_getmemid()
9628 ANON_LOCK_ENTER(&->a_rwlock, RW_READER); in segvn_getmemid()
9629 anon_array_enter(amp, anon_index, &cookie); in segvn_getmemid()
9630 ap = anon_get_ptr(amp->ahp, anon_index); in segvn_getmemid()
9637 ANON_LOCK_EXIT(&->a_rwlock); in segvn_getmemid()
9640 ASSERT(anon_get_ptr(amp->ahp, anon_index) in segvn_getmemid()
9642 (void) anon_set_ptr(amp->ahp, anon_index, in segvn_getmemid()
9648 ANON_LOCK_EXIT(&->a_rwlock); in segvn_getmemid()
9689 struct anon_map *amp; in segvn_getpolicy() local
9714 amp = svn_data->amp; in segvn_getpolicy()
9718 policy_info = lgrp_shm_policy_get(amp, anon_index, vp, vn_off); in segvn_getpolicy()
9732 * Bind text vnode segment to an amp. If we bind successfully mappings will be
9733 * established to per vnode mapping per lgroup amp pages instead of to vnode
9734 * pages. There's one amp per vnode text mapping per lgroup. Many processes
9735 * may share the same text replication amp. If a suitable amp doesn't already
9736 * exist in svntr hash table create a new one. We may fail to bind to amp if
9739 * and svd->amp points to the amp to use. Otherwise tr_state is set to off and
9740 * svd->amp remains as NULL.
9758 struct anon_map *amp; in segvn_textrepl() local
9767 ASSERT(vp != NULL && svd->amp == NULL); in segvn_textrepl()
9839 * replication amp's can be used most of the time. in segvn_textrepl()
9959 * If no amp was created yet for lgrp_id create a new one as long as in segvn_textrepl()
9962 if ((amp = svntrp->tr_amp[lgrp_id]) == NULL) { in segvn_textrepl()
9972 amp = anonmap_alloc(size, size, ANON_NOSLEEP); in segvn_textrepl()
9973 if (amp == NULL) { in segvn_textrepl()
9978 ASSERT(amp->refcnt == 1); in segvn_textrepl()
9979 amp->a_szc = szc; in segvn_textrepl()
9980 svntrp->tr_amp[lgrp_id] = amp; in segvn_textrepl()
9992 ASSERT(amp->a_szc == szc && amp->size == size && amp->swresv == size); in segvn_textrepl()
9993 ASSERT(amp->refcnt >= 1); in segvn_textrepl()
9994 svd->amp = amp; in segvn_textrepl()
10020 * replication amp. This routine is most typically called when segment is
10046 ASSERT(svd->amp != NULL); in segvn_textunrepl()
10047 ASSERT(svd->amp->refcnt >= 1); in segvn_textunrepl()
10064 if (svntrp->tr_amp[lgrp_id] != svd->amp) { in segvn_textunrepl()
10065 panic("segvn_textunrepl: amp mismatch"); in segvn_textunrepl()
10068 svd->amp = NULL; in segvn_textunrepl()
10091 struct anon_map *amp = svntrp->tr_amp[i]; in segvn_textunrepl() local
10092 if (amp == NULL) { in segvn_textunrepl()
10095 ASSERT(amp->refcnt == 1); in segvn_textunrepl()
10096 ASSERT(amp->swresv == size); in segvn_textunrepl()
10097 ASSERT(amp->size == size); in segvn_textunrepl()
10098 ASSERT(amp->a_szc == szc); in segvn_textunrepl()
10099 if (amp->a_szc != 0) { in segvn_textunrepl()
10100 anon_free_pages(amp->ahp, 0, size, szc); in segvn_textunrepl()
10102 anon_free(amp->ahp, 0, size); in segvn_textunrepl()
10107 anon_unresv_zone(amp->swresv, NULL); in segvn_textunrepl()
10108 amp->refcnt = 0; in segvn_textunrepl()
10109 anonmap_free(amp); in segvn_textunrepl()
10227 struct anon_map *amp; in segvn_trupdate_seg() local
10239 ASSERT(svd->amp != NULL); in segvn_trupdate_seg()
10243 ASSERT(svntrp->tr_amp[svd->tr_policy_info.mem_lgrpid] == svd->amp); in segvn_trupdate_seg()
10297 amp = anonmap_alloc(size, size, KM_NOSLEEP); in segvn_trupdate_seg()
10298 if (amp == NULL) { in segvn_trupdate_seg()
10306 ASSERT(amp->refcnt == 1); in segvn_trupdate_seg()
10307 amp->a_szc = seg->s_szc; in segvn_trupdate_seg()
10308 svntrp->tr_amp[lgrp_id] = amp; in segvn_trupdate_seg()
10323 ASSERT(svd->amp != NULL); in segvn_trupdate_seg()
10326 ASSERT(svd->amp != svntrp->tr_amp[lgrp_id]); in segvn_trupdate_seg()
10329 svd->amp = svntrp->tr_amp[lgrp_id]; in segvn_trupdate_seg()
10337 ASSERT(svd->amp != NULL && svd->amp == svntrp->tr_amp[lgrp_id]); in segvn_trupdate_seg()