Hi, In sys/uvm/uvm_fault.c I see three KASSERT's twice:
/* locked: maps(read), amap(if there), uobj(if !null), uobjpage(if !null) */ KASSERT(amap == NULL || mutex_owned(&amap->am_l)); KASSERT(uobj == NULL || mutex_owned(&uobj->vmobjlock)); KASSERT(uobjpage == NULL || (uobjpage->flags & PG_BUSY) != 0); /* * note that at this point we are done with any front or back pages. * we are now going to focus on the center page (i.e. the one we've * faulted on). if we have faulted on the upper (anon) layer * [i.e. case 1], then the anon we want is anons[centeridx] (we have * not touched it yet). if we have faulted on the bottom (uobj) * layer [i.e. case 2] and the page was both present and available, * then we've got a pointer to it as "uobjpage" and we've already * made it BUSY. */ /* * locked: * maps(read), amap(if there), uobj(if !null), uobjpage(if !null) */ KASSERT(amap == NULL || mutex_owned(&amap->am_l)); KASSERT(uobj == NULL || mutex_owned(&uobj->vmobjlock)); KASSERT(uobjpage == NULL || (uobjpage->flags & PG_BUSY) != 0); Alex