Lines Matching defs:hat
53 #include <vm/hat.h>
120 * instead of putting them in a hat's htable cache.
359 ht->ht_hat = NULL; /* no longer tied to a hat */
436 htable_steal_active(hat_t *hat, uint_t cnt, uint_t threshold,
445 h = h_start = h_seed++ % hat->hat_num_hash;
449 for (ht = hat->hat_ht_hash[h]; ht; ht = ht->ht_next) {
511 ASSERT(hat->hat_ht_hash[h] == ht);
512 hat->hat_ht_hash[h] = ht->ht_next;
529 if (++h == hat->hat_num_hash)
535 * Move hat to the end of the kas list
538 move_victim(hat_t *hat)
542 /* unlink victim hat */
543 if (hat->hat_prev)
544 hat->hat_prev->hat_next = hat->hat_next;
546 kas.a_hat->hat_next = hat->hat_next;
548 if (hat->hat_next)
549 hat->hat_next->hat_prev = hat->hat_prev;
551 kas.a_hat->hat_prev = hat->hat_prev;
552 /* relink at end of hat list */
553 hat->hat_next = NULL;
554 hat->hat_prev = kas.a_hat->hat_prev;
555 if (hat->hat_prev)
556 hat->hat_prev->hat_next = hat;
558 kas.a_hat->hat_next = hat;
560 kas.a_hat->hat_prev = hat;
570 hat_t *hat = kas.a_hat; /* list starts with khat */
610 /* skip the first hat (kernel) */
611 hat = kas.a_hat->hat_next;
614 * Skip any hat that is already being stolen from.
625 while (hat != NULL &&
626 (hat->hat_flags &
628 hat = hat->hat_next;
630 if (hat == NULL)
637 hat->hat_flags |= HAT_VICTIM;
641 * Take any htables from the hat's cached "free" list.
643 hat_enter(hat);
644 while ((ht = hat->hat_ht_cached) != NULL &&
646 hat->hat_ht_cached = ht->ht_next;
651 hat_exit(hat);
657 htable_steal_active(hat, cnt, threshold,
662 * we can forget hat; at this time, hat is
669 ASSERT(ht->ht_hat == hat);
673 ptable_free(hat->hat_user_ptable);
674 hat->hat_user_ptable = PFN_INVALID;
678 * forget the hat
694 kas.a_hat->hat_prev != hat)
695 move_victim(hat);
702 * Clear the victim flag, hat can go away now (once
705 if (hat->hat_flags & HAT_VICTIM) {
706 ASSERT(hat != kas.a_hat);
707 hat->hat_flags &= ~HAT_VICTIM;
711 /* move on to the next hat */
712 hat = hat->hat_next;
776 hat_t *hat,
787 if (level < 0 || level > TOP_LEVEL(hat))
790 is_vlp = (hat->hat_flags & HAT_VLP) && level == VLP_LEVEL;
798 if (hat->hat_ht_cached != NULL && !is_bare) {
799 hat_enter(hat);
800 ht = hat->hat_ht_cached;
802 hat->hat_ht_cached = ht->ht_next;
807 hat_exit(hat);
836 ht->ht_hat = hat;
900 hat->hat_user_ptable = ptable_alloc((uintptr_t)ht + 1);
901 if (hat->hat_user_ptable != PFN_INVALID)
908 block_zero_no_xmm(kpm_vbase + pfn_to_pa(hat->hat_user_ptable),
944 ht->ht_hat = hat;
962 (void) xen_kpm_page(hat->hat_user_ptable, PT_VALID);
970 * Free up an htable, either to a hat's cached list, the reserves or
976 hat_t *hat = ht->ht_hat;
979 * If the process isn't exiting, cache the free htable in the hat
981 * do this if the hat is exiting or we are stealing/reaping htables.
983 if (hat != NULL &&
986 (!(hat->hat_flags & HAT_FREEING) && !htable_dont_cache))) {
989 hat_enter(hat);
990 ht->ht_next = hat->hat_ht_cached;
991 hat->hat_ht_cached = ht;
992 hat_exit(hat);
1005 if (ht->ht_level == mmu.max_level && hat != NULL) {
1006 ptable_free(hat->hat_user_ptable);
1007 hat->hat_user_ptable = PFN_INVALID;
1026 * This is called when a hat is being destroyed or swapped out. We reap all
1027 * the remaining htables in the hat cache. If destroying all left over
1033 htable_purge_hat(hat_t *hat)
1041 if (!(hat->hat_flags & HAT_FREEING)) {
1044 hat_enter(hat);
1045 ht = hat->hat_ht_cached;
1047 hat_exit(hat);
1050 hat->hat_ht_cached = ht->ht_next;
1051 hat_exit(hat);
1061 while ((ht = hat->hat_ht_cached) != NULL) {
1062 hat->hat_ht_cached = ht->ht_next;
1069 for (h = 0; h < hat->hat_num_hash; ++h) {
1070 while ((ht = hat->hat_ht_hash[h]) != NULL) {
1077 ASSERT(hat->hat_ht_hash[h] == ht);
1078 hat->hat_ht_hash[h] = ht->ht_next;
1095 hat_t *hat = old->ht_hat;
1121 if (!(hat->hat_flags & HAT_FREEING)) {
1122 hat_tlb_inval(hat, (higher->ht_flags & HTABLE_VLP) ?
1153 * We also need to do this for the kernel hat on PAE 32 bit kernel.
1180 hat_t *hat;
1187 hat = ht->ht_hat;
1190 hashval = HTABLE_HASH(hat, va, level);
1214 if (hat->hat_flags & HAT_FREEING)
1222 (hat != kas.a_hat || va >= kernelbase))
1258 ASSERT(hat->hat_ht_hash[hashval] == ht);
1259 hat->hat_ht_hash[hashval] = ht->ht_next;
1283 htable_lookup(hat_t *hat, uintptr_t vaddr, level_t level)
1290 ASSERT(level <= TOP_LEVEL(hat));
1292 if (level == TOP_LEVEL(hat)) {
1298 if ((hat->hat_flags & HAT_VLP) && vaddr >= ((uint64_t)1 << 32))
1306 hashval = HTABLE_HASH(hat, base, level);
1308 for (ht = hat->hat_ht_hash[hashval]; ht; ht = ht->ht_next) {
1309 if (ht->ht_hat == hat &&
1327 hat_t *hat = ht->ht_hat;
1330 uint_t hashval = HTABLE_HASH(hat, base, level);
1340 for (h = hat->hat_ht_hash[hashval];
1362 hat_t *hat,
1374 if (level < 0 || level > TOP_LEVEL(hat))
1380 for (l = TOP_LEVEL(hat); l >= level; --l) {
1382 if (l == TOP_LEVEL(hat))
1387 h = HTABLE_HASH(hat, base, l);
1393 if (l == TOP_LEVEL(hat)) {
1394 ht = hat->hat_htable;
1396 for (ht = hat->hat_ht_hash[h]; ht; ht = ht->ht_next) {
1397 ASSERT(ht->ht_hat == hat);
1433 new = htable_alloc(hat, base, l,
1447 ht->ht_next = hat->hat_ht_hash[h];
1449 if (hat->hat_ht_hash[h])
1450 hat->hat_ht_hash[h]->ht_prev = ht;
1451 hat->hat_ht_hash[h] = ht;
1484 hat_t *hat,
1501 ht->ht_hat = hat;
1515 h = HTABLE_HASH(hat, base, level);
1517 ht->ht_next = hat->hat_ht_hash[h];
1519 if (hat->hat_ht_hash[h])
1520 hat->hat_ht_hash[h]->ht_prev = ht;
1521 hat->hat_ht_hash[h] = ht;
1573 htable_attach(hat, base, level - 1,
1672 struct hat *hat,
1690 ASSERT(hat == kas.a_hat || eaddr <= kernelbase ||
1692 if (hat != kas.a_hat && eaddr == HTABLE_WALK_TO_END)
1723 if (hat->hat_ism_pgcnt > 0) {
1728 if (hat->hat_pages_mapped[l] != 0)
1736 for (l = 0; l <= TOP_LEVEL(hat); ++l) {
1737 ht = htable_lookup(hat, va, l);
1755 ASSERT(l < TOP_LEVEL(hat));
1777 struct hat *hat,
1790 ht = htable_lookup(hat, vaddr, l);
1810 htable_getpage(struct hat *hat, uintptr_t vaddr, uint_t *entry)
1816 ht = htable_getpte(hat, vaddr, &e, &pte, mmu.max_page_level);
2103 hat_t *hat = ht->ht_hat;
2163 hat_tlb_inval(hat, addr);
2497 hat_t *hat;
2504 for (hat = kas.a_hat; hat != NULL; hat = hat->hat_next) {
2505 for (h = 0; h < hat->hat_num_hash; ++h) {
2506 for (ht = hat->hat_ht_hash[h]; ht; ht = ht->ht_next) {