calling vm_pager_get() doesn't count as a "majflt" unless the pager
returns VM_PAGER_OK. when walking an object chain we can get VM_PAGER_FAIL
(indicating that the requested data does not reside in this object
and we must continue to walk the chain) -- we don't want to count this
as a majflt.
i also added code to count ru_minflt.
string. The actual functional changes are:
1. in vm_page_alloc(), restore some long lost code by Paul Kranenburg
that reserves the last few pages for kernel objects, adding an
additional escape for the pageout daemon.
2. In vm_wait() (replaces VM_WAIT), recognize the amusing fatal
deadlock where the pagedemon sleeps on a channel that only it ever
wakes up, and add a timeout and printf. Mod 1 should generally
prevent this from happening in any case.
3. Fix a livelock in vm_pageout_page() caused by a pre-wakeup of
page consumers prior to the pageout, which can easily fail over
memory issues in NFS and IP code. Also, ++ cnt.v_pageouts only
if the pageout succeeded.
Create macros (with names borrowed from Mach 3) to manipulate
object->paging_in_progress, and use them. When decreasing the
paging count, always make sure to wake up anyone waiting.
Fixes `vospgc', `vosca1', and `vosca2' hangs.
locked page. Make that work. This also obviates the need for vm_fault() to
bogusly activate a page before deactivating it. Finally, make sure the
semantics of vm_object_deactive_pages() don't change.
if it's going to be ifdef'd out until it's tested, it shouldn't
be put in to begin with.
also, minor ansifications and cleanups (mostly so tags would be happier).
to actually fail is currently disabled, as this would enable some new code
in vm_map_pageable() (disabled in this commit) that hasn't been used to
date. I'm fairly confident it is all OK, but shall test it some more once
the rest of the kernel is more stable, before enabling it.
it seems to keep the vm system from deadlocking the system when it runs
out of swap + physical memory.
prevents the system from giving the last page(s) to anything but the
referenced "processes" (especially important is the pager process,
which should never have to wait for a free page).