Print this page
remove whole-process swapping
Long before Unix supported paging, it used process swapping to reclaim
memory. The code is there and in theory it runs when we get *extremely* low
on memory. In practice, it never runs since the definition of low-on-memory
is antiquated. (XXX: define what antiquated means)
You can check the number of swapout/swapin events with kstats:
$ kstat -p ::vm:swapin ::vm:swapout
*** 1123,1214 ****
ASSERT(old != kas.a_hat);
return (0);
}
/*
- * Allocate any hat resources required for a process being swapped in.
- */
- /*ARGSUSED*/
- void
- hat_swapin(hat_t *hat)
- {
- /* do nothing - we let everything fault back in */
- }
-
- /*
- * Unload all translations associated with an address space of a process
- * that is being swapped out.
- */
- void
- hat_swapout(hat_t *hat)
- {
- uintptr_t vaddr = (uintptr_t)0;
- uintptr_t eaddr = _userlimit;
- htable_t *ht = NULL;
- level_t l;
-
- XPV_DISALLOW_MIGRATE();
- /*
- * We can't just call hat_unload(hat, 0, _userlimit...) here, because
- * seg_spt and shared pagetables can't be swapped out.
- * Take a look at segspt_shmswapout() - it's a big no-op.
- *
- * Instead we'll walk through all the address space and unload
- * any mappings which we are sure are not shared, not locked.
- */
- ASSERT(IS_PAGEALIGNED(vaddr));
- ASSERT(IS_PAGEALIGNED(eaddr));
- ASSERT(AS_LOCK_HELD(hat->hat_as, &hat->hat_as->a_lock));
- if ((uintptr_t)hat->hat_as->a_userlimit < eaddr)
- eaddr = (uintptr_t)hat->hat_as->a_userlimit;
-
- while (vaddr < eaddr) {
- (void) htable_walk(hat, &ht, &vaddr, eaddr);
- if (ht == NULL)
- break;
-
- ASSERT(!IN_VA_HOLE(vaddr));
-
- /*
- * If the page table is shared skip its entire range.
- */
- l = ht->ht_level;
- if (ht->ht_flags & HTABLE_SHARED_PFN) {
- vaddr = ht->ht_vaddr + LEVEL_SIZE(l + 1);
- htable_release(ht);
- ht = NULL;
- continue;
- }
-
- /*
- * If the page table has no locked entries, unload this one.
- */
- if (ht->ht_lock_cnt == 0)
- hat_unload(hat, (caddr_t)vaddr, LEVEL_SIZE(l),
- HAT_UNLOAD_UNMAP);
-
- /*
- * If we have a level 0 page table with locked entries,
- * skip the entire page table, otherwise skip just one entry.
- */
- if (ht->ht_lock_cnt > 0 && l == 0)
- vaddr = ht->ht_vaddr + LEVEL_SIZE(1);
- else
- vaddr += LEVEL_SIZE(l);
- }
- if (ht)
- htable_release(ht);
-
- /*
- * We're in swapout because the system is low on memory, so
- * go back and flush all the htables off the cached list.
- */
- htable_purge_hat(hat);
- XPV_ALLOW_MIGRATE();
- }
-
- /*
* returns number of bytes that have valid mappings in hat.
*/
size_t
hat_get_mapped_size(hat_t *hat)
{
--- 1123,1132 ----