Lines Matching refs:as

76 static void as_setwatchprot(struct as *, caddr_t, size_t, uint_t);
77 static void as_clearwatchprot(struct as *, caddr_t, size_t);
101 as_add_callback(struct as *as, void (*cb_func)(), void *arg, uint_t events, in as_add_callback() argument
113 if (as == &kas) in as_add_callback()
146 mutex_enter(&as->a_contents); in as_add_callback()
147 current_head = as->a_callbacks; in as_add_callback()
148 as->a_callbacks = cb; in as_add_callback()
157 if ((cb->ascb_events & AS_UNMAPWAIT_EVENT) && AS_ISUNMAPWAIT(as)) { in as_add_callback()
158 AS_CLRUNMAPWAIT(as); in as_add_callback()
159 cv_broadcast(&as->a_cv); in as_add_callback()
162 mutex_exit(&as->a_contents); in as_add_callback()
187 as_delete_callback(struct as *as, void *arg) in as_delete_callback() argument
189 struct as_callback **prevcb = &as->a_callbacks; in as_delete_callback()
193 mutex_enter(&as->a_contents); in as_delete_callback()
194 for (cb = as->a_callbacks; cb; prevcb = &cb->ascb_next, cb = *prevcb) { in as_delete_callback()
211 cv_broadcast(&as->a_cv); in as_delete_callback()
219 mutex_exit(&as->a_contents); in as_delete_callback()
233 as_find_callback(struct as *as, uint_t events, caddr_t event_addr, in as_find_callback() argument
238 ASSERT(MUTEX_HELD(&as->a_contents)); in as_find_callback()
239 for (cb = as->a_callbacks; cb != NULL; cb = cb->ascb_next) { in as_find_callback()
265 as_execute_callback(struct as *as, struct as_callback *cb, in as_execute_callback() argument
271 ASSERT(MUTEX_HELD(&as->a_contents) && (cb->ascb_events & events)); in as_execute_callback()
273 mutex_exit(&as->a_contents); in as_execute_callback()
274 (*cb->ascb_func)(as, cb->ascb_arg, events); in as_execute_callback()
275 mutex_enter(&as->a_contents); in as_execute_callback()
285 cv_wait(&as->a_cv, &as->a_contents); in as_execute_callback()
297 prevcb = &as->a_callbacks; in as_execute_callback()
298 for (cb = as->a_callbacks; cb != NULL; in as_execute_callback()
333 as_do_callbacks(struct as *as, uint_t events, caddr_t event_addr, in as_do_callbacks() argument
338 if ((cb = as_find_callback(as, events, event_addr, event_len))) { in as_do_callbacks()
339 as_execute_callback(as, cb, events); in as_do_callbacks()
357 as_findseg(struct as *as, caddr_t addr, int tail) in as_findseg() argument
359 struct seg *seg = as->a_seglast; in as_findseg()
362 ASSERT(AS_LOCK_HELD(as)); in as_findseg()
369 seg = avl_find(&as->a_segtree, &addr, &where); in as_findseg()
371 return (as->a_seglast = seg); in as_findseg()
373 seg = avl_nearest(&as->a_segtree, where, AVL_AFTER); in as_findseg()
375 seg = avl_last(&as->a_segtree); in as_findseg()
376 return (as->a_seglast = seg); in as_findseg()
384 as_verify(struct as *as) in as_verify() argument
392 seglast = as->a_seglast; in as_verify()
394 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) { in as_verify()
395 ASSERT(seg->s_as == as); in as_verify()
396 p = AS_SEGPREV(as, seg); in as_verify()
397 n = AS_SEGNEXT(as, seg); in as_verify()
398 ASSERT(p == NULL || p->s_as == as); in as_verify()
401 ASSERT(n != NULL || seg == avl_last(&as->a_segtree)); in as_verify()
407 ASSERT(avl_numnodes(&as->a_segtree) == nsegs); in as_verify()
417 as_addseg(struct as *as, struct seg *newseg) in as_addseg() argument
424 ASSERT(AS_WRITE_HELD(as)); in as_addseg()
426 as->a_updatedir = 1; /* inform /proc */ in as_addseg()
427 gethrestime(&as->a_updatetime); in as_addseg()
429 if (as->a_lastgaphl != NULL) { in as_addseg()
433 if (as->a_lastgaphl->s_base > newseg->s_base) { in as_addseg()
434 hseg = as->a_lastgaphl; in as_addseg()
435 lseg = AVL_PREV(&as->a_segtree, hseg); in as_addseg()
437 lseg = as->a_lastgaphl; in as_addseg()
438 hseg = AVL_NEXT(&as->a_segtree, lseg); in as_addseg()
443 avl_insert_here(&as->a_segtree, newseg, lseg, in as_addseg()
445 as->a_lastgaphl = NULL; in as_addseg()
446 as->a_seglast = newseg; in as_addseg()
449 as->a_lastgaphl = NULL; in as_addseg()
455 seg = avl_find(&as->a_segtree, &addr, &where); in as_addseg()
458 seg = avl_nearest(&as->a_segtree, where, AVL_AFTER); in as_addseg()
461 seg = avl_last(&as->a_segtree); in as_addseg()
478 as->a_seglast = newseg; in as_addseg()
479 avl_insert(&as->a_segtree, newseg, where); in as_addseg()
482 as_verify(as); in as_addseg()
488 as_removeseg(struct as *as, struct seg *seg) in as_removeseg() argument
492 ASSERT(AS_WRITE_HELD(as)); in as_removeseg()
494 as->a_updatedir = 1; /* inform /proc */ in as_removeseg()
495 gethrestime(&as->a_updatetime); in as_removeseg()
500 t = &as->a_segtree; in as_removeseg()
501 if (as->a_seglast == seg) in as_removeseg()
502 as->a_seglast = NULL; in as_removeseg()
503 as->a_lastgaphl = NULL; in as_removeseg()
509 if (as->a_lastgap && in as_removeseg()
510 (seg == as->a_lastgap || seg->s_base > as->a_lastgap->s_base)) in as_removeseg()
511 as->a_lastgap = AVL_NEXT(t, seg); in as_removeseg()
519 as_verify(as); in as_removeseg()
528 as_segat(struct as *as, caddr_t addr) in as_segat() argument
530 struct seg *seg = as->a_seglast; in as_segat()
532 ASSERT(AS_LOCK_HELD(as)); in as_segat()
538 seg = avl_find(&as->a_segtree, &addr, NULL); in as_segat()
549 as_rangelock(struct as *as) in as_rangelock() argument
551 mutex_enter(&as->a_contents); in as_rangelock()
552 while (AS_ISCLAIMGAP(as)) in as_rangelock()
553 cv_wait(&as->a_cv, &as->a_contents); in as_rangelock()
554 AS_SETCLAIMGAP(as); in as_rangelock()
555 mutex_exit(&as->a_contents); in as_rangelock()
562 as_rangeunlock(struct as *as) in as_rangeunlock() argument
564 mutex_enter(&as->a_contents); in as_rangeunlock()
565 AS_CLRCLAIMGAP(as); in as_rangeunlock()
566 cv_signal(&as->a_cv); in as_rangeunlock()
567 mutex_exit(&as->a_contents); in as_rangeunlock()
588 as_avlinit(struct as *as) in as_avlinit() argument
590 avl_create(&as->a_segtree, as_segcompar, sizeof (struct seg), in as_avlinit()
592 avl_create(&as->a_wpage, wp_compare, sizeof (struct watched_page), in as_avlinit()
600 struct as *as = buf; in as_constructor() local
602 mutex_init(&as->a_contents, NULL, MUTEX_DEFAULT, NULL); in as_constructor()
603 cv_init(&as->a_cv, NULL, CV_DEFAULT, NULL); in as_constructor()
604 rw_init(&as->a_lock, NULL, RW_DEFAULT, NULL); in as_constructor()
605 as_avlinit(as); in as_constructor()
613 struct as *as = buf; in as_destructor() local
615 avl_destroy(&as->a_segtree); in as_destructor()
616 mutex_destroy(&as->a_contents); in as_destructor()
617 cv_destroy(&as->a_cv); in as_destructor()
618 rw_destroy(&as->a_lock); in as_destructor()
624 as_cache = kmem_cache_create("as_cache", sizeof (struct as), 0, in as_init()
633 struct as *
636 struct as *as; in as_alloc() local
638 as = kmem_cache_alloc(as_cache, KM_SLEEP); in as_alloc()
640 as->a_flags = 0; in as_alloc()
641 as->a_vbits = 0; in as_alloc()
642 as->a_hrm = NULL; in as_alloc()
643 as->a_seglast = NULL; in as_alloc()
644 as->a_size = 0; in as_alloc()
645 as->a_resvsize = 0; in as_alloc()
646 as->a_updatedir = 0; in as_alloc()
647 gethrestime(&as->a_updatetime); in as_alloc()
648 as->a_objectdir = NULL; in as_alloc()
649 as->a_sizedir = 0; in as_alloc()
650 as->a_userlimit = (caddr_t)USERLIMIT; in as_alloc()
651 as->a_lastgap = NULL; in as_alloc()
652 as->a_lastgaphl = NULL; in as_alloc()
653 as->a_callbacks = NULL; in as_alloc()
654 as->a_proc = NULL; in as_alloc()
656 AS_LOCK_ENTER(as, RW_WRITER); in as_alloc()
657 as->a_hat = hat_alloc(as); /* create hat for default system mmu */ in as_alloc()
658 AS_LOCK_EXIT(as); in as_alloc()
660 return (as); in as_alloc()
670 as_free(struct as *as) in as_free() argument
672 struct hat *hat = as->a_hat; in as_free()
682 mutex_enter(&as->a_contents); in as_free()
683 while (as->a_callbacks && as_do_callbacks(as, AS_ALL_EVENT, 0, 0)) in as_free()
686 mutex_exit(&as->a_contents); in as_free()
687 AS_LOCK_ENTER(as, RW_WRITER); in as_free()
693 for (seg = AS_SEGFIRST(as); seg != NULL; seg = next) { in as_free()
696 next = AS_SEGNEXT(as, seg); in as_free()
700 mutex_enter(&as->a_contents); in as_free()
701 if (as->a_callbacks) { in as_free()
702 AS_LOCK_EXIT(as); in as_free()
703 } else if (!AS_ISNOUNMAPWAIT(as)) { in as_free()
709 if (AS_ISUNMAPWAIT(as) == 0) in as_free()
710 cv_broadcast(&as->a_cv); in as_free()
711 AS_SETUNMAPWAIT(as); in as_free()
712 AS_LOCK_EXIT(as); in as_free()
713 while (AS_ISUNMAPWAIT(as)) in as_free()
714 cv_wait(&as->a_cv, &as->a_contents); in as_free()
726 AS_CLRNOUNMAPWAIT(as); in as_free()
727 mutex_exit(&as->a_contents); in as_free()
730 mutex_exit(&as->a_contents); in as_free()
741 AS_LOCK_EXIT(as); in as_free()
744 ASSERT(avl_numnodes(&as->a_wpage) == 0); in as_free()
745 if (as->a_objectdir) { in as_free()
746 kmem_free(as->a_objectdir, as->a_sizedir * sizeof (vnode_t *)); in as_free()
747 as->a_objectdir = NULL; in as_free()
748 as->a_sizedir = 0; in as_free()
754 ASSERT(avl_numnodes(&as->a_segtree) == 0); in as_free()
755 kmem_cache_free(as_cache, as); in as_free()
759 as_dup(struct as *as, struct proc *forkedproc) in as_dup() argument
761 struct as *newas; in as_dup()
766 AS_LOCK_ENTER(as, RW_WRITER); in as_dup()
767 as_clearwatch(as); in as_dup()
769 newas->a_userlimit = as->a_userlimit; in as_dup()
774 (void) hat_dup(as->a_hat, newas->a_hat, NULL, 0, HAT_DUP_SRD); in as_dup()
776 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) { in as_dup()
786 as_setwatch(as); in as_dup()
787 AS_LOCK_EXIT(as); in as_dup()
797 as_setwatch(as); in as_dup()
798 AS_LOCK_EXIT(as); in as_dup()
808 newas->a_resvsize = as->a_resvsize - purgesize; in as_dup()
810 error = hat_dup(as->a_hat, newas->a_hat, NULL, 0, HAT_DUP_ALL); in as_dup()
814 as_setwatch(as); in as_dup()
815 AS_LOCK_EXIT(as); in as_dup()
828 as_fault(struct hat *hat, struct as *as, caddr_t addr, size_t size, in as_fault() argument
874 if (as == &kas) in as_fault()
891 if (as == &kas && segkmap && segkmap->s_base <= raddr && in as_fault()
896 AS_LOCK_ENTER(as, RW_READER); in as_fault()
898 seg = as_segat(as, raddr); in as_fault()
900 AS_LOCK_EXIT(as); in as_fault()
914 seg = AS_SEGNEXT(as, seg); in as_fault()
939 seg = AS_SEGNEXT(as, seg); in as_fault()
955 AS_LOCK_EXIT(as); in as_fault()
982 as_faulta(struct as *as, caddr_t addr, size_t size) in as_faulta() argument
1003 AS_LOCK_ENTER(as, RW_READER); in as_faulta()
1004 seg = as_segat(as, raddr); in as_faulta()
1006 AS_LOCK_EXIT(as); in as_faulta()
1014 seg = AS_SEGNEXT(as, seg); in as_faulta()
1024 AS_LOCK_EXIT(as); in as_faulta()
1051 as_setprot(struct as *as, caddr_t addr, size_t size, uint_t prot) in as_setprot() argument
1083 if (writer || avl_numnodes(&as->a_wpage) != 0) { in as_setprot()
1084 AS_LOCK_ENTER(as, RW_WRITER); in as_setprot()
1086 AS_LOCK_ENTER(as, RW_READER); in as_setprot()
1089 as_clearwatchprot(as, raddr, rsize); in as_setprot()
1090 seg = as_segat(as, raddr); in as_setprot()
1092 as_setwatch(as); in as_setprot()
1093 AS_LOCK_EXIT(as); in as_setprot()
1099 seg = AS_SEGNEXT(as, seg); in as_setprot()
1118 AS_LOCK_EXIT(as); in as_setprot()
1128 AS_LOCK_EXIT(as); in as_setprot()
1165 mutex_enter(&as->a_contents); in as_setprot()
1166 if (as->a_callbacks && in as_setprot()
1167 (cb = as_find_callback(as, AS_SETPROT_EVENT, in as_setprot()
1169 AS_LOCK_EXIT(as); in as_setprot()
1170 as_execute_callback(as, cb, AS_SETPROT_EVENT); in as_setprot()
1171 } else if (!AS_ISNOUNMAPWAIT(as)) { in as_setprot()
1172 if (AS_ISUNMAPWAIT(as) == 0) in as_setprot()
1173 cv_broadcast(&as->a_cv); in as_setprot()
1174 AS_SETUNMAPWAIT(as); in as_setprot()
1175 AS_LOCK_EXIT(as); in as_setprot()
1176 while (AS_ISUNMAPWAIT(as)) in as_setprot()
1177 cv_wait(&as->a_cv, &as->a_contents); in as_setprot()
1189 AS_CLRNOUNMAPWAIT(as); in as_setprot()
1190 mutex_exit(&as->a_contents); in as_setprot()
1193 mutex_exit(&as->a_contents); in as_setprot()
1199 as_setwatch(as); in as_setprot()
1201 as_setwatchprot(as, saveraddr, saversize, prot); in as_setprot()
1203 AS_LOCK_EXIT(as); in as_setprot()
1214 as_checkprot(struct as *as, caddr_t addr, size_t size, uint_t prot) in as_checkprot() argument
1236 if (avl_numnodes(&as->a_wpage) != 0) in as_checkprot()
1237 AS_LOCK_ENTER(as, RW_WRITER); in as_checkprot()
1239 AS_LOCK_ENTER(as, RW_READER); in as_checkprot()
1240 as_clearwatchprot(as, raddr, rsize); in as_checkprot()
1241 seg = as_segat(as, raddr); in as_checkprot()
1243 as_setwatch(as); in as_checkprot()
1244 AS_LOCK_EXIT(as); in as_checkprot()
1250 seg = AS_SEGNEXT(as, seg); in as_checkprot()
1265 as_setwatch(as); in as_checkprot()
1266 AS_LOCK_EXIT(as); in as_checkprot()
1271 as_unmap(struct as *as, caddr_t addr, size_t size) in as_unmap() argument
1284 AS_LOCK_ENTER(as, RW_WRITER); in as_unmap()
1286 as->a_updatedir = 1; /* inform /proc */ in as_unmap()
1287 gethrestime(&as->a_updatetime); in as_unmap()
1293 as_clearwatchprot(as, raddr, eaddr - raddr); in as_unmap()
1295 for (seg = as_findseg(as, raddr, 0); seg != NULL; seg = seg_next) { in as_unmap()
1316 seg_next = AS_SEGNEXT(as, seg); in as_unmap()
1363 mutex_enter(&as->a_contents); in as_unmap()
1364 if (as->a_callbacks && in as_unmap()
1365 (cb = as_find_callback(as, AS_UNMAP_EVENT, in as_unmap()
1367 AS_LOCK_EXIT(as); in as_unmap()
1368 as_execute_callback(as, cb, AS_UNMAP_EVENT); in as_unmap()
1369 } else if (!AS_ISNOUNMAPWAIT(as)) { in as_unmap()
1370 if (AS_ISUNMAPWAIT(as) == 0) in as_unmap()
1371 cv_broadcast(&as->a_cv); in as_unmap()
1372 AS_SETUNMAPWAIT(as); in as_unmap()
1373 AS_LOCK_EXIT(as); in as_unmap()
1374 while (AS_ISUNMAPWAIT(as)) in as_unmap()
1375 cv_wait(&as->a_cv, &as->a_contents); in as_unmap()
1387 AS_CLRNOUNMAPWAIT(as); in as_unmap()
1388 mutex_exit(&as->a_contents); in as_unmap()
1391 mutex_exit(&as->a_contents); in as_unmap()
1394 AS_LOCK_EXIT(as); in as_unmap()
1397 as_setwatch(as); in as_unmap()
1398 AS_LOCK_EXIT(as); in as_unmap()
1403 as->a_size -= ssize; in as_unmap()
1405 as->a_resvsize -= rsize; in as_unmap()
1409 AS_LOCK_EXIT(as); in as_unmap()
1414 as_map_segvn_segs(struct as *as, caddr_t addr, size_t size, uint_t szcvec, in as_map_segvn_segs() argument
1423 ASSERT(AS_WRITE_HELD(as)); in as_map_segvn_segs()
1435 seg = segref = seg_alloc(as, addr, size); in as_map_segvn_segs()
1445 as->a_size += size; in as_map_segvn_segs()
1446 as->a_resvsize += size; in as_map_segvn_segs()
1472 seg = segref = seg_alloc(as, addr, segsize); in as_map_segvn_segs()
1483 as->a_size += segsize; in as_map_segvn_segs()
1484 as->a_resvsize += segsize; in as_map_segvn_segs()
1505 seg = segref = seg_alloc(as, addr, segsize); in as_map_segvn_segs()
1516 as->a_size += segsize; in as_map_segvn_segs()
1517 as->a_resvsize += segsize; in as_map_segvn_segs()
1536 as_map_vnsegs(struct as *as, caddr_t addr, size_t size, in as_map_vnsegs() argument
1549 ASSERT(AS_WRITE_HELD(as)); in as_map_vnsegs()
1559 seg = segref = seg_alloc(as, addr, size); in as_map_vnsegs()
1569 as->a_size += size; in as_map_vnsegs()
1570 as->a_resvsize += size; in as_map_vnsegs()
1601 error = as_map_segvn_segs(as, addr, size, szcvec, crfp, vn_a, in as_map_vnsegs()
1620 as_map_ansegs(struct as *as, caddr_t addr, size_t size, in as_map_ansegs() argument
1641 ASSERT(AS_WRITE_HELD(as)); in as_map_ansegs()
1646 return (as_map_segvn_segs(as, addr, size, szcvec, in as_map_ansegs()
1651 as_map(struct as *as, caddr_t addr, size_t size, segcreate_func_t crfp, in as_map() argument
1654 AS_LOCK_ENTER(as, RW_WRITER); in as_map()
1655 return (as_map_locked(as, addr, size, crfp, argsp)); in as_map()
1659 as_map_locked(struct as *as, caddr_t addr, size_t size, segcreate_func_t crfp, in as_map_locked() argument
1673 struct proc *p = (as->a_proc == NULL) ? curproc : as->a_proc; in as_map_locked()
1683 if ((raddr + rsize < raddr) || (as->a_size > (ULONG_MAX - size))) { in as_map_locked()
1684 AS_LOCK_EXIT(as); in as_map_locked()
1688 as->a_updatedir = 1; /* inform /proc */ in as_map_locked()
1689 gethrestime(&as->a_updatetime); in as_map_locked()
1691 if (as != &kas) { in as_map_locked()
1698 if (as->a_size + rsize > (size_t)p->p_vmem_ctl && in as_map_locked()
1700 AS_LOCK_EXIT(as); in as_map_locked()
1712 error = as_map_vnsegs(as, raddr, rsize, crfp, &crargs, in as_map_locked()
1715 AS_LOCK_EXIT(as); in as_map_locked()
1717 (void) as_unmap(as, addr, size); in as_map_locked()
1725 error = as_map_ansegs(as, raddr, rsize, crfp, &crargs, in as_map_locked()
1728 AS_LOCK_EXIT(as); in as_map_locked()
1730 (void) as_unmap(as, addr, size); in as_map_locked()
1737 seg = segref = seg_alloc(as, addr, size); in as_map_locked()
1739 AS_LOCK_EXIT(as); in as_map_locked()
1757 AS_LOCK_EXIT(as); in as_map_locked()
1769 as->a_size += rsize; in as_map_locked()
1770 as->a_resvsize += rsize; in as_map_locked()
1774 as_setwatch(as); in as_map_locked()
1780 mutex_enter(&as->a_contents); in as_map_locked()
1781 if (AS_ISPGLCK(as) && !is_hole) { in as_map_locked()
1782 mutex_exit(&as->a_contents); in as_map_locked()
1783 AS_LOCK_EXIT(as); in as_map_locked()
1784 error = as_ctl(as, addr, size, MC_LOCK, 0, 0, NULL, 0); in as_map_locked()
1786 (void) as_unmap(as, addr, size); in as_map_locked()
1788 mutex_exit(&as->a_contents); in as_map_locked()
1789 AS_LOCK_EXIT(as); in as_map_locked()
1802 as_purge(struct as *as) in as_purge() argument
1811 if ((as->a_flags & AS_NEEDSPURGE) == 0) in as_purge()
1814 AS_LOCK_ENTER(as, RW_WRITER); in as_purge()
1816 seg = AS_SEGFIRST(as); in as_purge()
1818 next_seg = AS_SEGNEXT(as, seg); in as_purge()
1823 AS_LOCK_EXIT(as); in as_purge()
1825 mutex_enter(&as->a_contents); in as_purge()
1826 as->a_flags &= ~AS_NEEDSPURGE; in as_purge()
1827 mutex_exit(&as->a_contents); in as_purge()
1852 as_gap_aligned(struct as *as, size_t minlen, caddr_t *basep, size_t *lenp, in as_gap_aligned() argument
1886 AS_LOCK_ENTER(as, RW_READER); in as_gap_aligned()
1887 if (AS_SEGFIRST(as) == NULL) { in as_gap_aligned()
1890 AS_LOCK_EXIT(as); in as_gap_aligned()
1893 AS_LOCK_EXIT(as); in as_gap_aligned()
1909 hseg = as_findseg(as, lobound, 1); in as_gap_aligned()
1910 lseg = AS_SEGPREV(as, hseg); in as_gap_aligned()
1917 if (as->a_lastgap && in as_gap_aligned()
1918 minlen >= as->a_lastgap->s_size && in as_gap_aligned()
1919 hibound >= as->a_lastgap->s_base) in as_gap_aligned()
1920 hibound = as->a_lastgap->s_base; in as_gap_aligned()
1922 hseg = as_findseg(as, hibound, 1); in as_gap_aligned()
1927 lseg = AS_SEGPREV(as, hseg); in as_gap_aligned()
1969 as->a_lastgap = hseg; in as_gap_aligned()
1971 as->a_lastgaphl = hseg; in as_gap_aligned()
1973 as->a_lastgaphl = lseg; in as_gap_aligned()
1974 AS_LOCK_EXIT(as); in as_gap_aligned()
1985 hseg = AS_SEGNEXT(as, hseg); in as_gap_aligned()
1990 lseg = AS_SEGPREV(as, lseg); in as_gap_aligned()
2001 AS_LOCK_EXIT(as); in as_gap_aligned()
2023 as_gap(struct as *as, size_t minlen, caddr_t *basep, size_t *lenp, uint_t flags, in as_gap() argument
2027 return (as_gap_aligned(as, minlen, basep, lenp, flags, addr, 0, 0, 0)); in as_gap()
2036 as_memory(struct as *as, caddr_t *basep, size_t *lenp) in as_memory() argument
2043 AS_LOCK_ENTER(as, RW_READER); in as_memory()
2048 seg = as_findseg(as, addr, 0); in as_memory()
2054 AS_LOCK_EXIT(as); in as_memory()
2073 seg = AS_SEGNEXT(as, seg); in as_memory()
2086 AS_LOCK_EXIT(as); in as_memory()
2101 as_swapout(struct as *as) in as_swapout() argument
2111 if (as == NULL) in as_swapout()
2114 AS_LOCK_ENTER(as, RW_READER); in as_swapout()
2122 hat_swapout(as->a_hat); in as_swapout()
2129 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) { in as_swapout()
2141 AS_LOCK_EXIT(as); in as_swapout()
2150 as_incore(struct as *as, caddr_t addr, in as_incore() argument
2168 AS_LOCK_ENTER(as, RW_READER); in as_incore()
2169 seg = as_segat(as, raddr); in as_incore()
2171 AS_LOCK_EXIT(as); in as_incore()
2177 seg = AS_SEGNEXT(as, seg); in as_incore()
2194 AS_LOCK_EXIT(as); in as_incore()
2220 as_unlockerr(struct as *as, int attr, ulong_t *mlock_map, in as_unlockerr() argument
2223 struct seg *seg = as_segat(as, raddr); in as_unlockerr()
2228 seg = AS_SEGNEXT(as, seg); in as_unlockerr()
2248 as_ctl(struct as *as, caddr_t addr, size_t size, int func, int attr, in as_ctl() argument
2267 AS_LOCK_ENTER(as, RW_WRITER); in as_ctl()
2269 AS_LOCK_ENTER(as, RW_READER); in as_ctl()
2282 mutex_enter(&as->a_contents); in as_ctl()
2283 AS_SETPGLCK(as); in as_ctl()
2284 mutex_exit(&as->a_contents); in as_ctl()
2287 AS_LOCK_EXIT(as); in as_ctl()
2291 seg = AS_SEGFIRST(as); in as_ctl()
2293 AS_LOCK_EXIT(as); in as_ctl()
2302 } while ((seg = AS_SEGNEXT(as, seg)) != NULL); in as_ctl()
2307 AS_LOCK_EXIT(as); in as_ctl()
2311 for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) { in as_ctl()
2323 for (seg = AS_SEGFIRST(as); seg != NULL; in as_ctl()
2324 seg = AS_SEGNEXT(as, seg)) { in as_ctl()
2336 AS_LOCK_EXIT(as); in as_ctl()
2339 mutex_enter(&as->a_contents); in as_ctl()
2340 AS_CLRPGLCK(as); in as_ctl()
2341 mutex_exit(&as->a_contents); in as_ctl()
2343 for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) { in as_ctl()
2353 AS_LOCK_EXIT(as); in as_ctl()
2365 AS_LOCK_EXIT(as); in as_ctl()
2372 if ((seg = as_segat(as, raddr)) == NULL) { in as_ctl()
2373 AS_LOCK_EXIT(as); in as_ctl()
2381 AS_LOCK_EXIT(as); in as_ctl()
2398 seg = AS_SEGNEXT(as, seg); in as_ctl()
2401 as_unlockerr(as, attr, mlock_map, in as_ctl()
2406 AS_LOCK_EXIT(as); in as_ctl()
2427 AS_LOCK_EXIT(as); in as_ctl()
2438 as_unlockerr(as, attr, mlock_map, initraddr, in as_ctl()
2442 AS_LOCK_EXIT(as); in as_ctl()
2471 AS_LOCK_EXIT(as); in as_ctl()
2479 seg = as_segat(as, raddr); in as_ctl()
2481 AS_LOCK_EXIT(as); in as_ctl()
2488 AS_LOCK_EXIT(as); in as_ctl()
2502 AS_LOCK_EXIT(as); in as_ctl()
2521 AS_LOCK_EXIT(as); in as_ctl()
2568 as_pagelock_segs(struct as *as, struct seg *seg, struct page ***ppp, in as_pagelock_segs() argument
2586 ASSERT(AS_LOCK_HELD(as)); in as_pagelock_segs()
2601 seg = AS_SEGNEXT(as, seg); in as_pagelock_segs()
2603 AS_LOCK_EXIT(as); in as_pagelock_segs()
2615 AS_LOCK_EXIT(as); in as_pagelock_segs()
2619 AS_LOCK_EXIT(as); in as_pagelock_segs()
2640 seg = AS_SEGNEXT(as, seg); in as_pagelock_segs()
2664 AS_LOCK_EXIT(as); in as_pagelock_segs()
2682 seg = AS_SEGNEXT(as, seg); in as_pagelock_segs()
2698 AS_LOCK_EXIT(as); in as_pagelock_segs()
2713 fault_err = as_fault(as->a_hat, as, sv_addr, sv_size, F_SOFTLOCK, rw); in as_pagelock_segs()
2727 as_pagelock(struct as *as, struct page ***ppp, caddr_t addr, in as_pagelock() argument
2747 AS_LOCK_ENTER(as, RW_READER); in as_pagelock()
2749 seg = as_segat(as, raddr); in as_pagelock()
2751 AS_LOCK_EXIT(as); in as_pagelock()
2756 return (as_pagelock_segs(as, seg, ppp, raddr, rsize, rw)); in as_pagelock()
2759 AS_LOCK_EXIT(as); in as_pagelock()
2773 AS_LOCK_EXIT(as); in as_pagelock()
2786 fault_err = as_fault(as->a_hat, as, addr, size, F_SOFTLOCK, rw); in as_pagelock()
2802 as_pageunlock_segs(struct as *as, struct seg *seg, caddr_t addr, size_t size, in as_pageunlock_segs() argument
2811 ASSERT(AS_LOCK_HELD(as)); in as_pageunlock_segs()
2821 seg = AS_SEGNEXT(as, seg); in as_pageunlock_segs()
2836 AS_LOCK_EXIT(as); in as_pageunlock_segs()
2846 as_pageunlock(struct as *as, struct page **pp, caddr_t addr, size_t size, in as_pageunlock() argument
2861 (void) as_fault(as->a_hat, as, addr, size, F_SOFTUNLOCK, rw); in as_pageunlock()
2869 AS_LOCK_ENTER(as, RW_READER); in as_pageunlock()
2870 seg = as_segat(as, raddr); in as_pageunlock()
2880 as_pageunlock_segs(as, seg, raddr, rsize, pp, rw); in as_pageunlock()
2883 AS_LOCK_EXIT(as); in as_pageunlock()
2888 as_setpagesize(struct as *as, caddr_t addr, size_t size, uint_t szc, in as_setpagesize() argument
2909 AS_LOCK_ENTER(as, RW_WRITER); in as_setpagesize()
2910 as_clearwatchprot(as, raddr, rsize); in as_setpagesize()
2911 seg = as_segat(as, raddr); in as_setpagesize()
2913 as_setwatch(as); in as_setpagesize()
2914 AS_LOCK_EXIT(as); in as_setpagesize()
2920 seg = AS_SEGNEXT(as, seg); in as_setpagesize()
2941 AS_LOCK_EXIT(as); in as_setpagesize()
2975 mutex_enter(&as->a_contents); in as_setpagesize()
2976 if (!AS_ISNOUNMAPWAIT(as)) { in as_setpagesize()
2977 if (AS_ISUNMAPWAIT(as) == 0) { in as_setpagesize()
2978 cv_broadcast(&as->a_cv); in as_setpagesize()
2980 AS_SETUNMAPWAIT(as); in as_setpagesize()
2981 AS_LOCK_EXIT(as); in as_setpagesize()
2982 while (AS_ISUNMAPWAIT(as)) { in as_setpagesize()
2983 cv_wait(&as->a_cv, &as->a_contents); in as_setpagesize()
2996 AS_CLRNOUNMAPWAIT(as); in as_setpagesize()
2997 mutex_exit(&as->a_contents); in as_setpagesize()
3000 mutex_exit(&as->a_contents); in as_setpagesize()
3006 as_setwatch(as); in as_setpagesize()
3007 AS_LOCK_EXIT(as); in as_setpagesize()
3016 as_iset3_default_lpsize(struct as *as, caddr_t raddr, size_t rsize, uint_t szc, in as_iset3_default_lpsize() argument
3023 ASSERT(AS_WRITE_HELD(as)); in as_iset3_default_lpsize()
3025 seg = as_segat(as, raddr); in as_iset3_default_lpsize()
3032 seg = AS_SEGNEXT(as, seg); in as_iset3_default_lpsize()
3074 as_iset2_default_lpsize(struct as *as, caddr_t addr, size_t size, uint_t szc, in as_iset2_default_lpsize() argument
3080 ASSERT(AS_WRITE_HELD(as)); in as_iset2_default_lpsize()
3083 error = as_iset3_default_lpsize(as, addr, size, szc, &retry); in as_iset2_default_lpsize()
3102 as_iset1_default_lpsize(struct as *as, caddr_t raddr, size_t rsize, uint_t szc, in as_iset1_default_lpsize() argument
3112 ASSERT(AS_WRITE_HELD(as)); in as_iset1_default_lpsize()
3114 seg = as_segat(as, raddr); in as_iset1_default_lpsize()
3126 seg = AS_SEGNEXT(as, seg); in as_iset1_default_lpsize()
3132 error = as_iset2_default_lpsize(as, in as_iset1_default_lpsize()
3153 error = as_iset2_default_lpsize(as, setaddr, setsize, in as_iset1_default_lpsize()
3165 as_iset_default_lpsize(struct as *as, caddr_t addr, size_t size, int flags, in as_iset_default_lpsize() argument
3180 ASSERT(AS_WRITE_HELD(as)); in as_iset_default_lpsize()
3212 error = as_iset1_default_lpsize(as, addr, segsize, szc, in as_iset_default_lpsize()
3231 error = as_iset1_default_lpsize(as, addr, segsize, szc, in as_iset_default_lpsize()
3256 as_set_default_lpsize(struct as *as, caddr_t addr, size_t size) in as_set_default_lpsize() argument
3272 AS_LOCK_ENTER(as, RW_WRITER); in as_set_default_lpsize()
3281 AS_LOCK_EXIT(as); in as_set_default_lpsize()
3284 as_clearwatchprot(as, raddr, rsize); in as_set_default_lpsize()
3285 seg = as_segat(as, raddr); in as_set_default_lpsize()
3287 as_setwatch(as); in as_set_default_lpsize()
3288 AS_LOCK_EXIT(as); in as_set_default_lpsize()
3304 seg = AS_SEGNEXT(as, seg); in as_set_default_lpsize()
3320 error = as_iset_default_lpsize(as, in as_set_default_lpsize()
3339 error = as_iset_default_lpsize(as, in as_set_default_lpsize()
3356 error = as_iset_default_lpsize(as, setaddr, setsize, in as_set_default_lpsize()
3367 mutex_enter(&as->a_contents); in as_set_default_lpsize()
3368 if (!AS_ISNOUNMAPWAIT(as)) { in as_set_default_lpsize()
3369 if (AS_ISUNMAPWAIT(as) == 0) { in as_set_default_lpsize()
3370 cv_broadcast(&as->a_cv); in as_set_default_lpsize()
3372 AS_SETUNMAPWAIT(as); in as_set_default_lpsize()
3373 AS_LOCK_EXIT(as); in as_set_default_lpsize()
3374 while (AS_ISUNMAPWAIT(as)) { in as_set_default_lpsize()
3375 cv_wait(&as->a_cv, &as->a_contents); in as_set_default_lpsize()
3377 mutex_exit(&as->a_contents); in as_set_default_lpsize()
3378 AS_LOCK_ENTER(as, RW_WRITER); in as_set_default_lpsize()
3389 AS_CLRNOUNMAPWAIT(as); in as_set_default_lpsize()
3390 mutex_exit(&as->a_contents); in as_set_default_lpsize()
3395 as_setwatch(as); in as_set_default_lpsize()
3396 AS_LOCK_EXIT(as); in as_set_default_lpsize()
3404 as_setwatch(struct as *as) in as_setwatch() argument
3412 if (avl_numnodes(&as->a_wpage) == 0) in as_setwatch()
3415 ASSERT(AS_WRITE_HELD(as)); in as_setwatch()
3417 for (pwp = avl_first(&as->a_wpage); pwp != NULL; in as_setwatch()
3418 pwp = AVL_NEXT(&as->a_wpage, pwp)) { in as_setwatch()
3423 (seg = as_segat(as, vaddr)) == NULL || in as_setwatch()
3451 as_clearwatch(struct as *as) in as_clearwatch() argument
3459 if (avl_numnodes(&as->a_wpage) == 0) in as_clearwatch()
3462 ASSERT(AS_WRITE_HELD(as)); in as_clearwatch()
3464 for (pwp = avl_first(&as->a_wpage); pwp != NULL; in as_clearwatch()
3465 pwp = AVL_NEXT(&as->a_wpage, pwp)) { in as_clearwatch()
3470 (seg = as_segat(as, vaddr)) == NULL) in as_clearwatch()
3490 as_setwatchprot(struct as *as, caddr_t addr, size_t size, uint_t prot) in as_setwatchprot() argument
3501 if (avl_numnodes(&as->a_wpage) == 0) in as_setwatchprot()
3504 ASSERT(AS_WRITE_HELD(as)); in as_setwatchprot()
3507 if ((pwp = avl_find(&as->a_wpage, &tpw, &where)) == NULL) in as_setwatchprot()
3508 pwp = avl_nearest(&as->a_wpage, where, AVL_AFTER); in as_setwatchprot()
3523 seg = as_segat(as, vaddr); in as_setwatchprot()
3538 pwp = AVL_NEXT(&as->a_wpage, pwp); in as_setwatchprot()
3546 as_clearwatchprot(struct as *as, caddr_t addr, size_t size) in as_clearwatchprot() argument
3556 if (avl_numnodes(&as->a_wpage) == 0) in as_clearwatchprot()
3560 if ((pwp = avl_find(&as->a_wpage, &tpw, &where)) == NULL) in as_clearwatchprot()
3561 pwp = avl_nearest(&as->a_wpage, where, AVL_AFTER); in as_clearwatchprot()
3563 ASSERT(AS_WRITE_HELD(as)); in as_clearwatchprot()
3572 seg = as_segat(as, pwp->wp_vaddr); in as_clearwatchprot()
3588 pwp = AVL_NEXT(&as->a_wpage, pwp); in as_clearwatchprot()
3593 as_signal_proc(struct as *as, k_siginfo_t *siginfo) in as_signal_proc() argument
3599 if (p->p_as == as) { in as_signal_proc()
3601 if (p->p_as == as) in as_signal_proc()
3613 as_getmemid(struct as *as, caddr_t addr, memid_t *memidp) in as_getmemid() argument
3618 AS_LOCK_ENTER(as, RW_READER); in as_getmemid()
3619 seg = as_segat(as, addr); in as_getmemid()
3621 AS_LOCK_EXIT(as); in as_getmemid()
3628 AS_LOCK_EXIT(as); in as_getmemid()
3634 AS_LOCK_EXIT(as); in as_getmemid()