freebsd-dev/sys/vm
Kirk McKusick e929c00d23 The buffer queue mechanism has been reformulated. Instead of having
QUEUE_AGE, QUEUE_LRU, and QUEUE_EMPTY we instead have QUEUE_CLEAN,
QUEUE_DIRTY, QUEUE_EMPTY, and QUEUE_EMPTYKVA.  With this patch clean
and dirty buffers have been separated.  Empty buffers with KVM
assignments have been separated from truely empty buffers.  getnewbuf()
has been rewritten and now operates in a 100% optimal fashion.  That is,
it is able to find precisely the right kind of buffer it needs to
allocate a new buffer, defragment KVM, or to free-up an existing buffer
when the buffer cache is full (which is a steady-state situation for
the buffer cache).

Buffer flushing has been reorganized.  Previously buffers were flushed
in the context of whatever process hit the conditions forcing buffer
flushing to occur.  This resulted in processes blocking on conditions
unrelated to what they were doing.  This also resulted in inappropriate
VFS stacking chains due to multiple processes getting stuck trying to
flush dirty buffers or due to a single process getting into a situation
where it might attempt to flush buffers recursively - a situation that
was only partially fixed in prior commits.  We have added a new daemon
called the buf_daemon which is responsible for flushing dirty buffers
when the number of dirty buffers exceeds the vfs.hidirtybuffers limit.
This daemon attempts to dynamically adjust the rate at which dirty buffers
are flushed such that getnewbuf() calls (almost) never block.

The number of nbufs and amount of buffer space is now scaled past the
8MB limit that was previously imposed for systems with over 64MB of
memory, and the vfs.{lo,hi}dirtybuffers limits have been relaxed
somewhat.  The number of physical buffers has been increased with the
intention that we will manage physical I/O differently in the future.

reassignbuf previously attempted to keep the dirtyblkhd list sorted which
could result in non-deterministic operation under certain conditions,
such as when a large number of dirty buffers are being managed.  This
algorithm has been changed.  reassignbuf now keeps buffers locally sorted
if it can do so cheaply, and otherwise gives up and adds buffers to
the head of the dirtyblkhd list.  The new algorithm is deterministic but
not perfect.  The new algorithm greatly reduces problems that previously
occured when write_behind was turned off in the system.

The P_FLSINPROG proc->p_flag bit has been replaced by the more descriptive
P_BUFEXHAUST bit.  This bit allows processes working with filesystem
buffers to use available emergency reserves.  Normal processes do not set
this bit and are not allowed to dig into emergency reserves.  The purpose
of this bit is to avoid low-memory deadlocks.

A small race condition was fixed in getpbuf() in vm/vm_pager.c.

Submitted by:	Matthew Dillon <dillon@apollo.backplane.com>
Reviewed by:	Kirk McKusick <mckusick@mckusick.com>
1999-07-04 00:25:38 +00:00
..
default_pager.c vm_pager_put_pages() is passed an rcval array to hold per-page return 1999-01-24 02:32:15 +00:00
default_pager.h
device_pager.c Casting handles from void * to uintptr_t on the way to dev_t became 1999-05-13 12:55:37 +00:00
pmap.h Make pmap_collect() an official pmap interface. 1999-04-23 20:29:58 +00:00
swap_pager.c Kirk missed a required BUF_KERNPROC(). Even though this is a non-async 1999-06-27 22:08:38 +00:00
swap_pager.h vm_pager_put_pages() is passed an rcval array to hold per-page return 1999-01-24 02:32:15 +00:00
vm_extern.h Add a function kmem_alloc_nofault() - same as kmem_alloc_pageable(), but 1999-06-08 17:03:28 +00:00
vm_fault.c The VFS/BIO subsystem contained a number of hacks in order to optimize 1999-05-02 23:57:16 +00:00
vm_glue.c Remove some unused function and variable declarations. 1999-06-19 18:42:53 +00:00
vm_inherit.h
vm_init.c
vm_kern.c Fix some int/long printf problems for the Alpha 1999-07-01 19:53:43 +00:00
vm_kern.h
vm_map.c Fix some int/long printf problems for the Alpha 1999-07-01 19:53:43 +00:00
vm_map.h Remove some unused function and variable declarations. 1999-06-19 18:42:53 +00:00
vm_meter.c Add sysctl descriptions to many SYSCTL_XXXs 1999-05-03 23:57:32 +00:00
vm_mmap.c vm_mmap: 1999-06-05 18:21:53 +00:00
vm_object.c Fix some int/long printf problems for the Alpha 1999-07-01 19:53:43 +00:00
vm_object.h Remove vm_object::cache_count and vm_object::wired_count. They are 1999-06-20 21:47:02 +00:00
vm_page.c Fix some int/long printf problems for the Alpha 1999-07-01 19:53:43 +00:00
vm_page.h Remove (1) "extern" declarations for variables that were previously 1999-06-22 07:18:20 +00:00
vm_pageout.c The buffer queue mechanism has been reformulated. Instead of having 1999-07-04 00:25:38 +00:00
vm_pageout.h This is a rather large commit that encompasses the new swapper, 1999-01-21 08:29:12 +00:00
vm_pager.c The buffer queue mechanism has been reformulated. Instead of having 1999-07-04 00:25:38 +00:00
vm_pager.h The VFS/BIO subsystem contained a number of hacks in order to optimize 1999-05-02 23:57:16 +00:00
vm_param.h Remove (1) "extern" declarations for variables that were previously 1999-06-22 07:18:20 +00:00
vm_prot.h
vm_swap.c Convert buffer locking from using the B_BUSY and B_WANTED flags to using 1999-06-26 02:47:16 +00:00
vm_unix.c Removed ENOMEM error on swap_pager_full condition which ignored the 1999-02-22 08:42:16 +00:00
vm_zone.c KNFize, by bde. 1999-01-10 01:58:29 +00:00
vm_zone.h KNFize, by bde. 1999-01-10 01:58:29 +00:00
vm.h
vnode_pager.c Fix some int/long printf problems for the Alpha 1999-07-01 19:53:43 +00:00
vnode_pager.h