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);
78 int as_map_locked(struct as *, caddr_t, size_t, int ((*)()), void *);
102 as_add_callback(struct as *as, void (*cb_func)(), void *arg, uint_t events, in as_add_callback() argument
114 if (as == &kas) in as_add_callback()
147 mutex_enter(&as->a_contents); in as_add_callback()
148 current_head = as->a_callbacks; in as_add_callback()
149 as->a_callbacks = cb; in as_add_callback()
158 if ((cb->ascb_events & AS_UNMAPWAIT_EVENT) && AS_ISUNMAPWAIT(as)) { in as_add_callback()
159 AS_CLRUNMAPWAIT(as); in as_add_callback()
160 cv_broadcast(&as->a_cv); in as_add_callback()
163 mutex_exit(&as->a_contents); in as_add_callback()
188 as_delete_callback(struct as *as, void *arg) in as_delete_callback() argument
190 struct as_callback **prevcb = &as->a_callbacks; in as_delete_callback()
194 mutex_enter(&as->a_contents); in as_delete_callback()
195 for (cb = as->a_callbacks; cb; prevcb = &cb->ascb_next, cb = *prevcb) { in as_delete_callback()
212 cv_broadcast(&as->a_cv); in as_delete_callback()
220 mutex_exit(&as->a_contents); in as_delete_callback()
234 as_find_callback(struct as *as, uint_t events, caddr_t event_addr, in as_find_callback() argument
239 ASSERT(MUTEX_HELD(&as->a_contents)); in as_find_callback()
240 for (cb = as->a_callbacks; cb != NULL; cb = cb->ascb_next) { in as_find_callback()
266 as_execute_callback(struct as *as, struct as_callback *cb, in as_execute_callback() argument
272 ASSERT(MUTEX_HELD(&as->a_contents) && (cb->ascb_events & events)); in as_execute_callback()
274 mutex_exit(&as->a_contents); in as_execute_callback()
275 (*cb->ascb_func)(as, cb->ascb_arg, events); in as_execute_callback()
276 mutex_enter(&as->a_contents); in as_execute_callback()
286 cv_wait(&as->a_cv, &as->a_contents); in as_execute_callback()
298 prevcb = &as->a_callbacks; in as_execute_callback()
299 for (cb = as->a_callbacks; cb != NULL; in as_execute_callback()
334 as_do_callbacks(struct as *as, uint_t events, caddr_t event_addr, in as_do_callbacks() argument
339 if ((cb = as_find_callback(as, events, event_addr, event_len))) { in as_do_callbacks()
340 as_execute_callback(as, cb, events); in as_do_callbacks()
358 as_findseg(struct as *as, caddr_t addr, int tail) in as_findseg() argument
360 struct seg *seg = as->a_seglast; in as_findseg()
363 ASSERT(AS_LOCK_HELD(as)); in as_findseg()
370 seg = avl_find(&as->a_segtree, &addr, &where); in as_findseg()
372 return (as->a_seglast = seg); in as_findseg()
374 seg = avl_nearest(&as->a_segtree, where, AVL_AFTER); in as_findseg()
376 seg = avl_last(&as->a_segtree); in as_findseg()
377 return (as->a_seglast = seg); in as_findseg()
385 as_verify(struct as *as) in as_verify() argument
393 seglast = as->a_seglast; in as_verify()
395 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) { in as_verify()
396 ASSERT(seg->s_as == as); in as_verify()
397 p = AS_SEGPREV(as, seg); in as_verify()
398 n = AS_SEGNEXT(as, seg); in as_verify()
399 ASSERT(p == NULL || p->s_as == as); in as_verify()
402 ASSERT(n != NULL || seg == avl_last(&as->a_segtree)); in as_verify()
408 ASSERT(avl_numnodes(&as->a_segtree) == nsegs); in as_verify()
418 as_addseg(struct as *as, struct seg *newseg) in as_addseg() argument
425 ASSERT(AS_WRITE_HELD(as)); in as_addseg()
427 as->a_updatedir = 1; /* inform /proc */ in as_addseg()
428 gethrestime(&as->a_updatetime); in as_addseg()
430 if (as->a_lastgaphl != NULL) { in as_addseg()
434 if (as->a_lastgaphl->s_base > newseg->s_base) { in as_addseg()
435 hseg = as->a_lastgaphl; in as_addseg()
436 lseg = AVL_PREV(&as->a_segtree, hseg); in as_addseg()
438 lseg = as->a_lastgaphl; in as_addseg()
439 hseg = AVL_NEXT(&as->a_segtree, lseg); in as_addseg()
444 avl_insert_here(&as->a_segtree, newseg, lseg, in as_addseg()
446 as->a_lastgaphl = NULL; in as_addseg()
447 as->a_seglast = newseg; in as_addseg()
450 as->a_lastgaphl = NULL; in as_addseg()
457 seg = avl_find(&as->a_segtree, &addr, &where); in as_addseg()
460 seg = avl_nearest(&as->a_segtree, where, AVL_AFTER); in as_addseg()
463 seg = avl_last(&as->a_segtree); in as_addseg()
493 as->a_seglast = newseg; in as_addseg()
494 avl_insert(&as->a_segtree, newseg, where); in as_addseg()
497 as_verify(as); in as_addseg()
503 as_removeseg(struct as *as, struct seg *seg) in as_removeseg() argument
507 ASSERT(AS_WRITE_HELD(as)); in as_removeseg()
509 as->a_updatedir = 1; /* inform /proc */ in as_removeseg()
510 gethrestime(&as->a_updatetime); in as_removeseg()
515 t = &as->a_segtree; in as_removeseg()
516 if (as->a_seglast == seg) in as_removeseg()
517 as->a_seglast = NULL; in as_removeseg()
518 as->a_lastgaphl = NULL; in as_removeseg()
524 if (as->a_lastgap && in as_removeseg()
525 (seg == as->a_lastgap || seg->s_base > as->a_lastgap->s_base)) in as_removeseg()
526 as->a_lastgap = AVL_NEXT(t, seg); in as_removeseg()
534 as_verify(as); in as_removeseg()
543 as_segat(struct as *as, caddr_t addr) in as_segat() argument
545 struct seg *seg = as->a_seglast; in as_segat()
547 ASSERT(AS_LOCK_HELD(as)); in as_segat()
553 seg = avl_find(&as->a_segtree, &addr, NULL); in as_segat()
564 as_rangelock(struct as *as) in as_rangelock() argument
566 mutex_enter(&as->a_contents); in as_rangelock()
567 while (AS_ISCLAIMGAP(as)) in as_rangelock()
568 cv_wait(&as->a_cv, &as->a_contents); in as_rangelock()
569 AS_SETCLAIMGAP(as); in as_rangelock()
570 mutex_exit(&as->a_contents); in as_rangelock()
577 as_rangeunlock(struct as *as) in as_rangeunlock() argument
579 mutex_enter(&as->a_contents); in as_rangeunlock()
580 AS_CLRCLAIMGAP(as); in as_rangeunlock()
581 cv_signal(&as->a_cv); in as_rangeunlock()
582 mutex_exit(&as->a_contents); in as_rangeunlock()
603 as_avlinit(struct as *as) in as_avlinit() argument
605 avl_create(&as->a_segtree, as_segcompar, sizeof (struct seg), in as_avlinit()
607 avl_create(&as->a_wpage, wp_compare, sizeof (struct watched_page), in as_avlinit()
615 struct as *as = buf; in as_constructor() local
617 mutex_init(&as->a_contents, NULL, MUTEX_DEFAULT, NULL); in as_constructor()
618 cv_init(&as->a_cv, NULL, CV_DEFAULT, NULL); in as_constructor()
619 rw_init(&as->a_lock, NULL, RW_DEFAULT, NULL); in as_constructor()
620 as_avlinit(as); in as_constructor()
628 struct as *as = buf; in as_destructor() local
630 avl_destroy(&as->a_segtree); in as_destructor()
631 mutex_destroy(&as->a_contents); in as_destructor()
632 cv_destroy(&as->a_cv); in as_destructor()
633 rw_destroy(&as->a_lock); in as_destructor()
639 as_cache = kmem_cache_create("as_cache", sizeof (struct as), 0, in as_init()
648 struct as *
651 struct as *as; in as_alloc() local
653 as = kmem_cache_alloc(as_cache, KM_SLEEP); in as_alloc()
655 as->a_flags = 0; in as_alloc()
656 as->a_vbits = 0; in as_alloc()
657 as->a_hrm = NULL; in as_alloc()
658 as->a_seglast = NULL; in as_alloc()
659 as->a_size = 0; in as_alloc()
660 as->a_resvsize = 0; in as_alloc()
661 as->a_updatedir = 0; in as_alloc()
662 gethrestime(&as->a_updatetime); in as_alloc()
663 as->a_objectdir = NULL; in as_alloc()
664 as->a_sizedir = 0; in as_alloc()
665 as->a_userlimit = (caddr_t)USERLIMIT; in as_alloc()
666 as->a_lastgap = NULL; in as_alloc()
667 as->a_lastgaphl = NULL; in as_alloc()
668 as->a_callbacks = NULL; in as_alloc()
670 AS_LOCK_ENTER(as, RW_WRITER); in as_alloc()
671 as->a_hat = hat_alloc(as); /* create hat for default system mmu */ in as_alloc()
672 AS_LOCK_EXIT(as); in as_alloc()
674 as->a_xhat = NULL; in as_alloc()
676 return (as); in as_alloc()
686 as_free(struct as *as) in as_free() argument
688 struct hat *hat = as->a_hat; in as_free()
698 mutex_enter(&as->a_contents); in as_free()
699 while (as->a_callbacks && as_do_callbacks(as, AS_ALL_EVENT, 0, 0)) in as_free()
704 AS_SETBUSY(as); in as_free()
705 mutex_exit(&as->a_contents); in as_free()
706 AS_LOCK_ENTER(as, RW_WRITER); in as_free()
711 if (as->a_xhat != NULL) in as_free()
712 xhat_free_start_all(as); in as_free()
714 for (seg = AS_SEGFIRST(as); seg != NULL; seg = next) { in as_free()
717 next = AS_SEGNEXT(as, seg); in as_free()
721 mutex_enter(&as->a_contents); in as_free()
722 if (as->a_callbacks) { in as_free()
723 AS_LOCK_EXIT(as); in as_free()
724 } else if (!AS_ISNOUNMAPWAIT(as)) { in as_free()
730 if (AS_ISUNMAPWAIT(as) == 0) in as_free()
731 cv_broadcast(&as->a_cv); in as_free()
732 AS_SETUNMAPWAIT(as); in as_free()
733 AS_LOCK_EXIT(as); in as_free()
734 while (AS_ISUNMAPWAIT(as)) in as_free()
735 cv_wait(&as->a_cv, &as->a_contents); in as_free()
747 AS_CLRNOUNMAPWAIT(as); in as_free()
748 mutex_exit(&as->a_contents); in as_free()
751 mutex_exit(&as->a_contents); in as_free()
762 if (as->a_xhat != NULL) in as_free()
763 xhat_free_end_all(as); in as_free()
764 AS_LOCK_EXIT(as); in as_free()
767 ASSERT(avl_numnodes(&as->a_wpage) == 0); in as_free()
768 if (as->a_objectdir) { in as_free()
769 kmem_free(as->a_objectdir, as->a_sizedir * sizeof (vnode_t *)); in as_free()
770 as->a_objectdir = NULL; in as_free()
771 as->a_sizedir = 0; in as_free()
777 ASSERT(avl_numnodes(&as->a_segtree) == 0); in as_free()
778 kmem_cache_free(as_cache, as); in as_free()
782 as_dup(struct as *as, struct proc *forkedproc) in as_dup() argument
784 struct as *newas; in as_dup()
789 AS_LOCK_ENTER(as, RW_WRITER); in as_dup()
790 as_clearwatch(as); in as_dup()
792 newas->a_userlimit = as->a_userlimit; in as_dup()
798 mutex_enter(&as->a_contents); in as_dup()
799 AS_SETBUSY(as); in as_dup()
800 mutex_exit(&as->a_contents); in as_dup()
805 (void) hat_dup(as->a_hat, newas->a_hat, NULL, 0, HAT_DUP_SRD); in as_dup()
807 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) { in as_dup()
817 as_setwatch(as); in as_dup()
818 mutex_enter(&as->a_contents); in as_dup()
819 AS_CLRBUSY(as); in as_dup()
820 mutex_exit(&as->a_contents); in as_dup()
821 AS_LOCK_EXIT(as); in as_dup()
831 as_setwatch(as); in as_dup()
832 mutex_enter(&as->a_contents); in as_dup()
833 AS_CLRBUSY(as); in as_dup()
834 mutex_exit(&as->a_contents); in as_dup()
835 AS_LOCK_EXIT(as); in as_dup()
843 newas->a_resvsize = as->a_resvsize - purgesize; in as_dup()
845 error = hat_dup(as->a_hat, newas->a_hat, NULL, 0, HAT_DUP_ALL); in as_dup()
846 if (as->a_xhat != NULL) in as_dup()
847 error |= xhat_dup_all(as, newas, NULL, 0, HAT_DUP_ALL); in as_dup()
854 as_setwatch(as); in as_dup()
855 mutex_enter(&as->a_contents); in as_dup()
856 AS_CLRBUSY(as); in as_dup()
857 mutex_exit(&as->a_contents); in as_dup()
858 AS_LOCK_EXIT(as); in as_dup()
871 as_fault(struct hat *hat, struct as *as, caddr_t addr, size_t size, in as_fault() argument
889 if (as->a_hat != hat) { in as_fault()
893 if ((type != F_INVAL) || (as == &kas)) in as_fault()
929 if (as == &kas) in as_fault()
953 if (as == &kas && segkmap && segkmap->s_base <= raddr && in as_fault()
962 AS_LOCK_ENTER(as, RW_READER); in as_fault()
963 if (is_xhat && avl_numnodes(&as->a_wpage) != 0) { in as_fault()
976 AS_LOCK_EXIT(as); in as_fault()
977 AS_LOCK_ENTER(as, RW_WRITER); in as_fault()
980 seg = as_segat(as, raddr); in as_fault()
982 AS_LOCK_EXIT(as); in as_fault()
996 seg = AS_SEGNEXT(as, seg); in as_fault()
1009 if (is_xhat && avl_numnodes(&as->a_wpage) != 0 && in as_fault()
1010 pr_is_watchpage_as(raddr, rw, as)) { in as_fault()
1017 as_clearwatch(as); in as_fault()
1025 as_setwatch(as); in as_fault()
1047 seg = AS_SEGNEXT(as, seg); in as_fault()
1063 AS_LOCK_EXIT(as); in as_fault()
1090 as_faulta(struct as *as, caddr_t addr, size_t size) in as_faulta() argument
1111 AS_LOCK_ENTER(as, RW_READER); in as_faulta()
1112 seg = as_segat(as, raddr); in as_faulta()
1114 AS_LOCK_EXIT(as); in as_faulta()
1122 seg = AS_SEGNEXT(as, seg); in as_faulta()
1132 AS_LOCK_EXIT(as); in as_faulta()
1159 as_setprot(struct as *as, caddr_t addr, size_t size, uint_t prot) in as_setprot() argument
1191 if (writer || avl_numnodes(&as->a_wpage) != 0) { in as_setprot()
1192 AS_LOCK_ENTER(as, RW_WRITER); in as_setprot()
1194 AS_LOCK_ENTER(as, RW_READER); in as_setprot()
1197 as_clearwatchprot(as, raddr, rsize); in as_setprot()
1198 seg = as_segat(as, raddr); in as_setprot()
1200 as_setwatch(as); in as_setprot()
1201 AS_LOCK_EXIT(as); in as_setprot()
1207 seg = AS_SEGNEXT(as, seg); in as_setprot()
1226 AS_LOCK_EXIT(as); in as_setprot()
1236 AS_LOCK_EXIT(as); in as_setprot()
1273 mutex_enter(&as->a_contents); in as_setprot()
1274 if (as->a_callbacks && in as_setprot()
1275 (cb = as_find_callback(as, AS_SETPROT_EVENT, in as_setprot()
1277 AS_LOCK_EXIT(as); in as_setprot()
1278 as_execute_callback(as, cb, AS_SETPROT_EVENT); in as_setprot()
1279 } else if (!AS_ISNOUNMAPWAIT(as)) { in as_setprot()
1280 if (AS_ISUNMAPWAIT(as) == 0) in as_setprot()
1281 cv_broadcast(&as->a_cv); in as_setprot()
1282 AS_SETUNMAPWAIT(as); in as_setprot()
1283 AS_LOCK_EXIT(as); in as_setprot()
1284 while (AS_ISUNMAPWAIT(as)) in as_setprot()
1285 cv_wait(&as->a_cv, &as->a_contents); in as_setprot()
1297 AS_CLRNOUNMAPWAIT(as); in as_setprot()
1298 mutex_exit(&as->a_contents); in as_setprot()
1301 mutex_exit(&as->a_contents); in as_setprot()
1307 as_setwatch(as); in as_setprot()
1309 as_setwatchprot(as, saveraddr, saversize, prot); in as_setprot()
1311 AS_LOCK_EXIT(as); in as_setprot()
1322 as_checkprot(struct as *as, caddr_t addr, size_t size, uint_t prot) in as_checkprot() argument
1344 if (avl_numnodes(&as->a_wpage) != 0) in as_checkprot()
1345 AS_LOCK_ENTER(as, RW_WRITER); in as_checkprot()
1347 AS_LOCK_ENTER(as, RW_READER); in as_checkprot()
1348 as_clearwatchprot(as, raddr, rsize); in as_checkprot()
1349 seg = as_segat(as, raddr); in as_checkprot()
1351 as_setwatch(as); in as_checkprot()
1352 AS_LOCK_EXIT(as); in as_checkprot()
1358 seg = AS_SEGNEXT(as, seg); in as_checkprot()
1373 as_setwatch(as); in as_checkprot()
1374 AS_LOCK_EXIT(as); in as_checkprot()
1379 as_unmap(struct as *as, caddr_t addr, size_t size) in as_unmap() argument
1392 AS_LOCK_ENTER(as, RW_WRITER); in as_unmap()
1394 as->a_updatedir = 1; /* inform /proc */ in as_unmap()
1395 gethrestime(&as->a_updatetime); in as_unmap()
1401 as_clearwatchprot(as, raddr, eaddr - raddr); in as_unmap()
1403 for (seg = as_findseg(as, raddr, 0); seg != NULL; seg = seg_next) { in as_unmap()
1422 seg_next = AS_SEGNEXT(as, seg); in as_unmap()
1469 mutex_enter(&as->a_contents); in as_unmap()
1470 if (as->a_callbacks && in as_unmap()
1471 (cb = as_find_callback(as, AS_UNMAP_EVENT, in as_unmap()
1473 AS_LOCK_EXIT(as); in as_unmap()
1474 as_execute_callback(as, cb, AS_UNMAP_EVENT); in as_unmap()
1475 } else if (!AS_ISNOUNMAPWAIT(as)) { in as_unmap()
1476 if (AS_ISUNMAPWAIT(as) == 0) in as_unmap()
1477 cv_broadcast(&as->a_cv); in as_unmap()
1478 AS_SETUNMAPWAIT(as); in as_unmap()
1479 AS_LOCK_EXIT(as); in as_unmap()
1480 while (AS_ISUNMAPWAIT(as)) in as_unmap()
1481 cv_wait(&as->a_cv, &as->a_contents); in as_unmap()
1493 AS_CLRNOUNMAPWAIT(as); in as_unmap()
1494 mutex_exit(&as->a_contents); in as_unmap()
1497 mutex_exit(&as->a_contents); in as_unmap()
1500 AS_LOCK_EXIT(as); in as_unmap()
1503 as_setwatch(as); in as_unmap()
1504 AS_LOCK_EXIT(as); in as_unmap()
1508 as->a_size -= ssize; in as_unmap()
1510 as->a_resvsize -= rsize; in as_unmap()
1513 AS_LOCK_EXIT(as); in as_unmap()
1518 as_map_segvn_segs(struct as *as, caddr_t addr, size_t size, uint_t szcvec, in as_map_segvn_segs() argument
1532 ASSERT(AS_WRITE_HELD(as)); in as_map_segvn_segs()
1541 seg = seg_alloc(as, addr, size); in as_map_segvn_segs()
1550 as->a_size += size; in as_map_segvn_segs()
1551 as->a_resvsize += size; in as_map_segvn_segs()
1573 seg = seg_alloc(as, addr, segsize); in as_map_segvn_segs()
1583 as->a_size += segsize; in as_map_segvn_segs()
1584 as->a_resvsize += segsize; in as_map_segvn_segs()
1602 seg = seg_alloc(as, addr, segsize); in as_map_segvn_segs()
1612 as->a_size += segsize; in as_map_segvn_segs()
1613 as->a_resvsize += segsize; in as_map_segvn_segs()
1632 as_map_vnsegs(struct as *as, caddr_t addr, size_t size, in as_map_vnsegs() argument
1646 ASSERT(AS_WRITE_HELD(as)); in as_map_vnsegs()
1654 seg = seg_alloc(as, addr, size); in as_map_vnsegs()
1663 as->a_size += size; in as_map_vnsegs()
1664 as->a_resvsize += size; in as_map_vnsegs()
1695 error = as_map_segvn_segs(as, addr, size, szcvec, crfp, vn_a, in as_map_vnsegs()
1714 as_map_ansegs(struct as *as, caddr_t addr, size_t size, in as_map_ansegs() argument
1735 ASSERT(AS_WRITE_HELD(as)); in as_map_ansegs()
1740 return (as_map_segvn_segs(as, addr, size, szcvec, in as_map_ansegs()
1745 as_map(struct as *as, caddr_t addr, size_t size, int (*crfp)(), void *argsp) in as_map() argument
1747 AS_LOCK_ENTER(as, RW_WRITER); in as_map()
1748 return (as_map_locked(as, addr, size, crfp, argsp)); in as_map()
1752 as_map_locked(struct as *as, caddr_t addr, size_t size, int (*crfp)(), in as_map_locked() argument
1770 if ((raddr + rsize < raddr) || (as->a_size > (ULONG_MAX - size))) { in as_map_locked()
1771 AS_LOCK_EXIT(as); in as_map_locked()
1775 as->a_updatedir = 1; /* inform /proc */ in as_map_locked()
1776 gethrestime(&as->a_updatetime); in as_map_locked()
1778 if (as != &kas && as->a_size + rsize > (size_t)p->p_vmem_ctl) { in as_map_locked()
1779 AS_LOCK_EXIT(as); in as_map_locked()
1789 error = as_map_vnsegs(as, raddr, rsize, crfp, &crargs, &unmap); in as_map_locked()
1791 AS_LOCK_EXIT(as); in as_map_locked()
1793 (void) as_unmap(as, addr, size); in as_map_locked()
1799 error = as_map_ansegs(as, raddr, rsize, crfp, &crargs, &unmap); in as_map_locked()
1801 AS_LOCK_EXIT(as); in as_map_locked()
1803 (void) as_unmap(as, addr, size); in as_map_locked()
1808 seg = seg_alloc(as, addr, size); in as_map_locked()
1810 AS_LOCK_EXIT(as); in as_map_locked()
1817 AS_LOCK_EXIT(as); in as_map_locked()
1823 as->a_size += rsize; in as_map_locked()
1824 as->a_resvsize += rsize; in as_map_locked()
1827 as_setwatch(as); in as_map_locked()
1833 mutex_enter(&as->a_contents); in as_map_locked()
1834 if (AS_ISPGLCK(as)) { in as_map_locked()
1835 mutex_exit(&as->a_contents); in as_map_locked()
1836 AS_LOCK_EXIT(as); in as_map_locked()
1837 error = as_ctl(as, addr, size, MC_LOCK, 0, 0, NULL, 0); in as_map_locked()
1839 (void) as_unmap(as, addr, size); in as_map_locked()
1841 mutex_exit(&as->a_contents); in as_map_locked()
1842 AS_LOCK_EXIT(as); in as_map_locked()
1855 as_purge(struct as *as) in as_purge() argument
1864 if ((as->a_flags & AS_NEEDSPURGE) == 0) in as_purge()
1867 AS_LOCK_ENTER(as, RW_WRITER); in as_purge()
1869 seg = AS_SEGFIRST(as); in as_purge()
1871 next_seg = AS_SEGNEXT(as, seg); in as_purge()
1876 AS_LOCK_EXIT(as); in as_purge()
1878 mutex_enter(&as->a_contents); in as_purge()
1879 as->a_flags &= ~AS_NEEDSPURGE; in as_purge()
1880 mutex_exit(&as->a_contents); in as_purge()
1905 as_gap_aligned(struct as *as, size_t minlen, caddr_t *basep, size_t *lenp, in as_gap_aligned() argument
1939 AS_LOCK_ENTER(as, RW_READER); in as_gap_aligned()
1940 if (AS_SEGFIRST(as) == NULL) { in as_gap_aligned()
1943 AS_LOCK_EXIT(as); in as_gap_aligned()
1946 AS_LOCK_EXIT(as); in as_gap_aligned()
1962 hseg = as_findseg(as, lobound, 1); in as_gap_aligned()
1963 lseg = AS_SEGPREV(as, hseg); in as_gap_aligned()
1970 if (as->a_lastgap && in as_gap_aligned()
1971 minlen >= as->a_lastgap->s_size && in as_gap_aligned()
1972 hibound >= as->a_lastgap->s_base) in as_gap_aligned()
1973 hibound = as->a_lastgap->s_base; in as_gap_aligned()
1975 hseg = as_findseg(as, hibound, 1); in as_gap_aligned()
1980 lseg = AS_SEGPREV(as, hseg); in as_gap_aligned()
2022 as->a_lastgap = hseg; in as_gap_aligned()
2024 as->a_lastgaphl = hseg; in as_gap_aligned()
2026 as->a_lastgaphl = lseg; in as_gap_aligned()
2027 AS_LOCK_EXIT(as); in as_gap_aligned()
2038 hseg = AS_SEGNEXT(as, hseg); in as_gap_aligned()
2043 lseg = AS_SEGPREV(as, lseg); in as_gap_aligned()
2054 AS_LOCK_EXIT(as); in as_gap_aligned()
2076 as_gap(struct as *as, size_t minlen, caddr_t *basep, size_t *lenp, uint_t flags, in as_gap() argument
2080 return (as_gap_aligned(as, minlen, basep, lenp, flags, addr, 0, 0, 0)); in as_gap()
2089 as_memory(struct as *as, caddr_t *basep, size_t *lenp) in as_memory() argument
2096 AS_LOCK_ENTER(as, RW_READER); in as_memory()
2101 seg = as_findseg(as, addr, 0); in as_memory()
2107 AS_LOCK_EXIT(as); in as_memory()
2126 seg = AS_SEGNEXT(as, seg); in as_memory()
2139 AS_LOCK_EXIT(as); in as_memory()
2154 as_swapout(struct as *as) in as_swapout() argument
2164 if (as == NULL) in as_swapout()
2167 AS_LOCK_ENTER(as, RW_READER); in as_swapout()
2170 mutex_enter(&as->a_contents); in as_swapout()
2171 AS_SETBUSY(as); in as_swapout()
2172 mutex_exit(&as->a_contents); in as_swapout()
2181 hat_swapout(as->a_hat); in as_swapout()
2182 if (as->a_xhat != NULL) in as_swapout()
2183 xhat_swapout_all(as); in as_swapout()
2185 mutex_enter(&as->a_contents); in as_swapout()
2186 AS_CLRBUSY(as); in as_swapout()
2187 mutex_exit(&as->a_contents); in as_swapout()
2194 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) { in as_swapout()
2206 AS_LOCK_EXIT(as); in as_swapout()
2215 as_incore(struct as *as, caddr_t addr, in as_incore() argument
2233 AS_LOCK_ENTER(as, RW_READER); in as_incore()
2234 seg = as_segat(as, raddr); in as_incore()
2236 AS_LOCK_EXIT(as); in as_incore()
2242 seg = AS_SEGNEXT(as, seg); in as_incore()
2259 AS_LOCK_EXIT(as); in as_incore()
2285 as_unlockerr(struct as *as, int attr, ulong_t *mlock_map, in as_unlockerr() argument
2288 struct seg *seg = as_segat(as, raddr); in as_unlockerr()
2293 seg = AS_SEGNEXT(as, seg); in as_unlockerr()
2313 as_ctl(struct as *as, caddr_t addr, size_t size, int func, int attr, in as_ctl() argument
2329 AS_LOCK_ENTER(as, RW_WRITER); in as_ctl()
2331 AS_LOCK_ENTER(as, RW_READER); in as_ctl()
2344 mutex_enter(&as->a_contents); in as_ctl()
2345 AS_SETPGLCK(as); in as_ctl()
2346 mutex_exit(&as->a_contents); in as_ctl()
2349 AS_LOCK_EXIT(as); in as_ctl()
2353 seg = AS_SEGFIRST(as); in as_ctl()
2355 AS_LOCK_EXIT(as); in as_ctl()
2364 } while ((seg = AS_SEGNEXT(as, seg)) != NULL); in as_ctl()
2369 AS_LOCK_EXIT(as); in as_ctl()
2373 for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) { in as_ctl()
2382 for (seg = AS_SEGFIRST(as); seg != NULL; in as_ctl()
2383 seg = AS_SEGNEXT(as, seg)) { in as_ctl()
2395 AS_LOCK_EXIT(as); in as_ctl()
2398 mutex_enter(&as->a_contents); in as_ctl()
2399 AS_CLRPGLCK(as); in as_ctl()
2400 mutex_exit(&as->a_contents); in as_ctl()
2402 for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) { in as_ctl()
2409 AS_LOCK_EXIT(as); in as_ctl()
2421 AS_LOCK_EXIT(as); in as_ctl()
2428 if ((seg = as_segat(as, raddr)) == NULL) { in as_ctl()
2429 AS_LOCK_EXIT(as); in as_ctl()
2437 AS_LOCK_EXIT(as); in as_ctl()
2454 seg = AS_SEGNEXT(as, seg); in as_ctl()
2457 as_unlockerr(as, attr, mlock_map, in as_ctl()
2462 AS_LOCK_EXIT(as); in as_ctl()
2483 AS_LOCK_EXIT(as); in as_ctl()
2494 as_unlockerr(as, attr, mlock_map, initraddr, in as_ctl()
2498 AS_LOCK_EXIT(as); in as_ctl()
2527 AS_LOCK_EXIT(as); in as_ctl()
2535 seg = as_segat(as, raddr); in as_ctl()
2537 AS_LOCK_EXIT(as); in as_ctl()
2544 AS_LOCK_EXIT(as); in as_ctl()
2558 AS_LOCK_EXIT(as); in as_ctl()
2577 AS_LOCK_EXIT(as); in as_ctl()
2624 as_pagelock_segs(struct as *as, struct seg *seg, struct page ***ppp, in as_pagelock_segs() argument
2642 ASSERT(AS_LOCK_HELD(as)); in as_pagelock_segs()
2657 seg = AS_SEGNEXT(as, seg); in as_pagelock_segs()
2659 AS_LOCK_EXIT(as); in as_pagelock_segs()
2671 AS_LOCK_EXIT(as); in as_pagelock_segs()
2675 AS_LOCK_EXIT(as); in as_pagelock_segs()
2696 seg = AS_SEGNEXT(as, seg); in as_pagelock_segs()
2720 AS_LOCK_EXIT(as); in as_pagelock_segs()
2738 seg = AS_SEGNEXT(as, seg); in as_pagelock_segs()
2754 AS_LOCK_EXIT(as); in as_pagelock_segs()
2769 fault_err = as_fault(as->a_hat, as, sv_addr, sv_size, F_SOFTLOCK, rw); in as_pagelock_segs()
2783 as_pagelock(struct as *as, struct page ***ppp, caddr_t addr, in as_pagelock() argument
2803 AS_LOCK_ENTER(as, RW_READER); in as_pagelock()
2805 seg = as_segat(as, raddr); in as_pagelock()
2807 AS_LOCK_EXIT(as); in as_pagelock()
2812 return (as_pagelock_segs(as, seg, ppp, raddr, rsize, rw)); in as_pagelock()
2815 AS_LOCK_EXIT(as); in as_pagelock()
2829 AS_LOCK_EXIT(as); in as_pagelock()
2842 fault_err = as_fault(as->a_hat, as, addr, size, F_SOFTLOCK, rw); in as_pagelock()
2858 as_pageunlock_segs(struct as *as, struct seg *seg, caddr_t addr, size_t size, in as_pageunlock_segs() argument
2867 ASSERT(AS_LOCK_HELD(as)); in as_pageunlock_segs()
2877 seg = AS_SEGNEXT(as, seg); in as_pageunlock_segs()
2892 AS_LOCK_EXIT(as); in as_pageunlock_segs()
2902 as_pageunlock(struct as *as, struct page **pp, caddr_t addr, size_t size, in as_pageunlock() argument
2917 (void) as_fault(as->a_hat, as, addr, size, F_SOFTUNLOCK, rw); in as_pageunlock()
2925 AS_LOCK_ENTER(as, RW_READER); in as_pageunlock()
2926 seg = as_segat(as, raddr); in as_pageunlock()
2936 as_pageunlock_segs(as, seg, raddr, rsize, pp, rw); in as_pageunlock()
2939 AS_LOCK_EXIT(as); in as_pageunlock()
2944 as_setpagesize(struct as *as, caddr_t addr, size_t size, uint_t szc, in as_setpagesize() argument
2965 AS_LOCK_ENTER(as, RW_WRITER); in as_setpagesize()
2966 as_clearwatchprot(as, raddr, rsize); in as_setpagesize()
2967 seg = as_segat(as, raddr); in as_setpagesize()
2969 as_setwatch(as); in as_setpagesize()
2970 AS_LOCK_EXIT(as); in as_setpagesize()
2976 seg = AS_SEGNEXT(as, seg); in as_setpagesize()
2997 AS_LOCK_EXIT(as); in as_setpagesize()
3031 mutex_enter(&as->a_contents); in as_setpagesize()
3032 if (!AS_ISNOUNMAPWAIT(as)) { in as_setpagesize()
3033 if (AS_ISUNMAPWAIT(as) == 0) { in as_setpagesize()
3034 cv_broadcast(&as->a_cv); in as_setpagesize()
3036 AS_SETUNMAPWAIT(as); in as_setpagesize()
3037 AS_LOCK_EXIT(as); in as_setpagesize()
3038 while (AS_ISUNMAPWAIT(as)) { in as_setpagesize()
3039 cv_wait(&as->a_cv, &as->a_contents); in as_setpagesize()
3052 AS_CLRNOUNMAPWAIT(as); in as_setpagesize()
3053 mutex_exit(&as->a_contents); in as_setpagesize()
3056 mutex_exit(&as->a_contents); in as_setpagesize()
3062 as_setwatch(as); in as_setpagesize()
3063 AS_LOCK_EXIT(as); in as_setpagesize()
3072 as_iset3_default_lpsize(struct as *as, caddr_t raddr, size_t rsize, uint_t szc, in as_iset3_default_lpsize() argument
3079 ASSERT(AS_WRITE_HELD(as)); in as_iset3_default_lpsize()
3081 seg = as_segat(as, raddr); in as_iset3_default_lpsize()
3088 seg = AS_SEGNEXT(as, seg); in as_iset3_default_lpsize()
3130 as_iset2_default_lpsize(struct as *as, caddr_t addr, size_t size, uint_t szc, in as_iset2_default_lpsize() argument
3136 ASSERT(AS_WRITE_HELD(as)); in as_iset2_default_lpsize()
3139 error = as_iset3_default_lpsize(as, addr, size, szc, &retry); in as_iset2_default_lpsize()
3158 as_iset1_default_lpsize(struct as *as, caddr_t raddr, size_t rsize, uint_t szc, in as_iset1_default_lpsize() argument
3168 ASSERT(AS_WRITE_HELD(as)); in as_iset1_default_lpsize()
3170 seg = as_segat(as, raddr); in as_iset1_default_lpsize()
3182 seg = AS_SEGNEXT(as, seg); in as_iset1_default_lpsize()
3188 error = as_iset2_default_lpsize(as, in as_iset1_default_lpsize()
3209 error = as_iset2_default_lpsize(as, setaddr, setsize, in as_iset1_default_lpsize()
3221 as_iset_default_lpsize(struct as *as, caddr_t addr, size_t size, int flags, in as_iset_default_lpsize() argument
3236 ASSERT(AS_WRITE_HELD(as)); in as_iset_default_lpsize()
3268 error = as_iset1_default_lpsize(as, addr, segsize, szc, in as_iset_default_lpsize()
3287 error = as_iset1_default_lpsize(as, addr, segsize, szc, in as_iset_default_lpsize()
3312 as_set_default_lpsize(struct as *as, caddr_t addr, size_t size) in as_set_default_lpsize() argument
3328 AS_LOCK_ENTER(as, RW_WRITER); in as_set_default_lpsize()
3337 AS_LOCK_EXIT(as); in as_set_default_lpsize()
3340 as_clearwatchprot(as, raddr, rsize); in as_set_default_lpsize()
3341 seg = as_segat(as, raddr); in as_set_default_lpsize()
3343 as_setwatch(as); in as_set_default_lpsize()
3344 AS_LOCK_EXIT(as); in as_set_default_lpsize()
3360 seg = AS_SEGNEXT(as, seg); in as_set_default_lpsize()
3376 error = as_iset_default_lpsize(as, in as_set_default_lpsize()
3395 error = as_iset_default_lpsize(as, in as_set_default_lpsize()
3412 error = as_iset_default_lpsize(as, setaddr, setsize, in as_set_default_lpsize()
3423 mutex_enter(&as->a_contents); in as_set_default_lpsize()
3424 if (!AS_ISNOUNMAPWAIT(as)) { in as_set_default_lpsize()
3425 if (AS_ISUNMAPWAIT(as) == 0) { in as_set_default_lpsize()
3426 cv_broadcast(&as->a_cv); in as_set_default_lpsize()
3428 AS_SETUNMAPWAIT(as); in as_set_default_lpsize()
3429 AS_LOCK_EXIT(as); in as_set_default_lpsize()
3430 while (AS_ISUNMAPWAIT(as)) { in as_set_default_lpsize()
3431 cv_wait(&as->a_cv, &as->a_contents); in as_set_default_lpsize()
3433 mutex_exit(&as->a_contents); in as_set_default_lpsize()
3434 AS_LOCK_ENTER(as, RW_WRITER); in as_set_default_lpsize()
3445 AS_CLRNOUNMAPWAIT(as); in as_set_default_lpsize()
3446 mutex_exit(&as->a_contents); in as_set_default_lpsize()
3451 as_setwatch(as); in as_set_default_lpsize()
3452 AS_LOCK_EXIT(as); in as_set_default_lpsize()
3460 as_setwatch(struct as *as) in as_setwatch() argument
3468 if (avl_numnodes(&as->a_wpage) == 0) in as_setwatch()
3471 ASSERT(AS_WRITE_HELD(as)); in as_setwatch()
3473 for (pwp = avl_first(&as->a_wpage); pwp != NULL; in as_setwatch()
3474 pwp = AVL_NEXT(&as->a_wpage, pwp)) { in as_setwatch()
3479 (seg = as_segat(as, vaddr)) == NULL || in as_setwatch()
3507 as_clearwatch(struct as *as) in as_clearwatch() argument
3515 if (avl_numnodes(&as->a_wpage) == 0) in as_clearwatch()
3518 ASSERT(AS_WRITE_HELD(as)); in as_clearwatch()
3520 for (pwp = avl_first(&as->a_wpage); pwp != NULL; in as_clearwatch()
3521 pwp = AVL_NEXT(&as->a_wpage, pwp)) { in as_clearwatch()
3526 (seg = as_segat(as, vaddr)) == NULL) in as_clearwatch()
3546 as_setwatchprot(struct as *as, caddr_t addr, size_t size, uint_t prot) in as_setwatchprot() argument
3557 if (avl_numnodes(&as->a_wpage) == 0) in as_setwatchprot()
3560 ASSERT(AS_WRITE_HELD(as)); in as_setwatchprot()
3563 if ((pwp = avl_find(&as->a_wpage, &tpw, &where)) == NULL) in as_setwatchprot()
3564 pwp = avl_nearest(&as->a_wpage, where, AVL_AFTER); in as_setwatchprot()
3579 seg = as_segat(as, vaddr); in as_setwatchprot()
3594 pwp = AVL_NEXT(&as->a_wpage, pwp); in as_setwatchprot()
3602 as_clearwatchprot(struct as *as, caddr_t addr, size_t size) in as_clearwatchprot() argument
3612 if (avl_numnodes(&as->a_wpage) == 0) in as_clearwatchprot()
3616 if ((pwp = avl_find(&as->a_wpage, &tpw, &where)) == NULL) in as_clearwatchprot()
3617 pwp = avl_nearest(&as->a_wpage, where, AVL_AFTER); in as_clearwatchprot()
3619 ASSERT(AS_WRITE_HELD(as)); in as_clearwatchprot()
3628 seg = as_segat(as, pwp->wp_vaddr); in as_clearwatchprot()
3644 pwp = AVL_NEXT(&as->a_wpage, pwp); in as_clearwatchprot()
3649 as_signal_proc(struct as *as, k_siginfo_t *siginfo) in as_signal_proc() argument
3655 if (p->p_as == as) { in as_signal_proc()
3657 if (p->p_as == as) in as_signal_proc()
3669 as_getmemid(struct as *as, caddr_t addr, memid_t *memidp) in as_getmemid() argument
3674 AS_LOCK_ENTER(as, RW_READER); in as_getmemid()
3675 seg = as_segat(as, addr); in as_getmemid()
3677 AS_LOCK_EXIT(as); in as_getmemid()
3684 AS_LOCK_EXIT(as); in as_getmemid()
3690 AS_LOCK_EXIT(as); in as_getmemid()