uvm
struct uvmexp uvm;
len = sizeof(uvm);
if (sysctl(mib, nitems(mib), &uvm, &len, NULL, 0) == -1) {
units = uvm.pagesize;
size = physmem / uvm.pagesize;
used = size - uvm.free;
units = uvm.pagesize;
size = realmem / uvm.pagesize;
used = size - uvm.free;
units = uvm.pagesize;
size = uvm.swpages;
used = uvm.swpginuse;
if (uvm.page_init_done == FALSE) {
if (uvm.page_init_done == FALSE) {
if (uvm.page_init_done == TRUE)
if (uvm.page_init_done == 0) {
if (uvm.page_init_done == 0) {
if (!uvm.page_init_done && !pmap_virtual_space_called) {
if (!uvm.page_init_done && !pmap_virtual_space_called) {
if (uvm.page_init_done == 0) {
if (uvm.page_init_done == 0) {
if (__predict_true(uvm.page_init_done)) {
if (uvm.page_init_done) {
if (!uvm.page_init_done && !pmap_virtual_space_called) {
if (!uvm.page_init_done && !pmap_virtual_space_called) {
KDASSERT(!uvm.page_init_done);
if (uvm.page_init_done) {
if (uvm.page_init_done) {
&_DT_STATIC_P(uvm, fault),
&_DT_STATIC_P(uvm, map_insert),
&_DT_STATIC_P(uvm, map_remove),
&_DT_STATIC_P(uvm, malloc),
&_DT_STATIC_P(uvm, free),
&_DT_STATIC_P(uvm, pool_get),
&_DT_STATIC_P(uvm, pool_put),
DT_STATIC_PROBE3(uvm, fault, "vaddr_t", "vm_fault_t", "vm_prot_t");
DT_STATIC_PROBE3(uvm, map_insert, "vaddr_t", "vaddr_t", "vm_prot_t");
DT_STATIC_PROBE3(uvm, map_remove, "vaddr_t", "vaddr_t", "vm_prot_t");
DT_STATIC_PROBE4(uvm, malloc, "int", "void *", "size_t", "int");
DT_STATIC_PROBE3(uvm, free, "int", "void *", "size_t");
DT_STATIC_PROBE3(uvm, pool_get, "void *", "void *", "int");
DT_STATIC_PROBE2(uvm, pool_put, "void *", "void *");
TRACEPOINT(uvm, malloc, type, va, size, flags);
TRACEPOINT(uvm, free, type, addr, freedsize);
TAILQ_FOREACH(pmr, &uvm.pmr_control.use, pmr_use) {
TRACEPOINT(uvm, pool_get, pp, v, flags);
TRACEPOINT(uvm, pool_put, pp, v);
extern struct uvm uvm;
TRACEPOINT(uvm, fault, vaddr, fault_type, access_type, NULL);
struct uvm uvm; /* decl */
uvm.kernel_object = uao_create(VM_KERNEL_SPACE_SIZE, UAO_FLAG_KERNOBJ);
.kp_object = &uvm.kernel_object,
if (SLIST_EMPTY(&uvm.kentry_free)) {
SLIST_INSERT_HEAD(&uvm.kentry_free,
me = SLIST_FIRST(&uvm.kentry_free);
SLIST_REMOVE_HEAD(&uvm.kentry_free, daddrs.addr_kentry);
SLIST_INSERT_HEAD(&uvm.kentry_free, me, daddrs.addr_kentry);
SLIST_INIT(&uvm.kentry_free);
SLIST_INSERT_HEAD(&uvm.kentry_free,
pgl = &uvm.page_inactive;
pgl = &uvm.page_active;
TRACEPOINT(uvm, map_insert,
TRACEPOINT(uvm, map_remove,
(*pr)(" objs(kern)=%p\n", uvm.kernel_object);
TAILQ_INSERT_TAIL(&uvm.page_inactive, pg, pageq);
TAILQ_INSERT_TAIL(&uvm.page_active, pg, pageq);
MUTEX_ASSERT_LOCKED(&uvm.pageqlock);
TAILQ_REMOVE(&uvm.page_active, pg, pageq);
TAILQ_REMOVE(&uvm.page_inactive, pg, pageq);
TAILQ_INIT(&uvm.page_active);
TAILQ_INIT(&uvm.page_inactive);
mtx_init(&uvm.pageqlock, IPL_VM);
mtx_init(&uvm.fpageqlock, IPL_VM);
mtx_init(&uvm.aiodoned_lock, IPL_BIO);
uvm.page_init_done = TRUE;
if (uvm.page_init_done == TRUE)
#define uvm_lock_pageq() mtx_enter(&uvm.pageqlock)
#define uvm_unlock_pageq() mtx_leave(&uvm.pageqlock)
#define uvm_lock_fpageq() mtx_enter(&uvm.fpageqlock)
#define uvm_unlock_fpageq() mtx_leave(&uvm.fpageqlock)
KASSERT(curproc == uvm.pagedaemon_proc);
if (curproc == uvm.pagedaemon_proc && !use_reserve) {
mtx_enter(&uvm.aiodoned_lock);
TAILQ_INSERT_TAIL(&uvm.aio_done, bp, b_freelist);
wakeup(&uvm.aiodoned);
mtx_leave(&uvm.aiodoned_lock);
TAILQ_INIT(&uvm.aio_done);
if (curproc == uvm.pagedaemon_proc) {
wakeup(&uvm.pagedaemon); /* wake the daemon! */
msleep_nsec(&uvmexp.free, &uvm.fpageqlock, PVM | PNORELOCK, wmsg, timo);
uvm.pagedaemon_proc = curproc;
msleep_nsec(&uvm.pagedaemon, &uvm.fpageqlock, PVM,
uvm.aiodoned_proc = curproc;
mtx_enter(&uvm.aiodoned_lock);
while ((bp = TAILQ_FIRST(&uvm.aio_done)) == NULL)
msleep_nsec(&uvm.aiodoned, &uvm.aiodoned_lock,
TAILQ_INIT(&uvm.aio_done);
mtx_leave(&uvm.aiodoned_lock);
wakeup(free <= uvmexp.reserve_kernel ? &uvm.pagedaemon :
MUTEX_ASSERT_LOCKED(&uvm.pageqlock);
struct pglist *pglst = &uvm.page_inactive;
struct pglist *pglst = &uvm.page_active;
MUTEX_ASSERT_LOCKED(&uvm.pageqlock);
uvmpd_drop(&uvm.page_inactive);
uvmpd_drop(&uvm.page_active);
TAILQ_FOREACH(pmr, &uvm.pmr_control.use, pmr_use) {
wakeup(&uvm.pagedaemon);
RBT_INSERT(uvm_pmemrange_addr, &uvm.pmr_control.addr, drain);
uvm_pmemrange_use_insert(&uvm.pmr_control.use, drain);
RBT_FOREACH(pmr, uvm_pmemrange_addr, &uvm.pmr_control.addr) {
TAILQ_REMOVE(&uvm.pmr_control.use, pmr, pmr_use);
uvm_pmemrange_use_insert(&uvm.pmr_control.use, pmr);
if (!uvm.page_init_done) {
TAILQ_INIT(&uvm.pmr_control.use);
RBT_INIT(uvm_pmemrange_addr, &uvm.pmr_control.addr);
RBT_INSERT(uvm_pmemrange_addr, &uvm.pmr_control.addr, new_pmr);
uvm_pmemrange_use_insert(&uvm.pmr_control.use, new_pmr);
pmr = RBT_ROOT(uvm_pmemrange_addr, &uvm.pmr_control.addr);
TAILQ_FOREACH(pmr, &uvm.pmr_control.use, pmr_use) {
TAILQ_FOREACH(pmr, &uvm.pmr_control.use, pmr_use) {
msleep_nsec(&uvmexp.zeropages, &uvm.fpageqlock,
if (curproc == uvm.pagedaemon_proc)
wakeup(&uvm.pagedaemon);
pflag = (async || curproc == uvm.pagedaemon_proc) ? PR_NOWAIT :
bp->b_flags |= B_CALL | (curproc == uvm.pagedaemon_proc ?