Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 3 Jul 1999 17:25:39 -0700 (PDT)
From:      Kirk McKusick <mckusick@FreeBSD.org>
To:        cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/sys/i386/i386 machdep.c src/sys/kern vfs_bio.c vfs_subr.c src/sys/sys buf.h kernel.h proc.h src/sys/vm vm_pageout.c vm_pager.c
Message-ID:  <199907040025.RAA83209@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
mckusick    1999/07/03 17:25:39 PDT

  Modified files:
    sys/i386/i386        machdep.c 
    sys/kern             vfs_bio.c vfs_subr.c 
    sys/sys              buf.h kernel.h proc.h 
    sys/vm               vm_pageout.c vm_pager.c 
  Log:
  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>
  
  Revision  Changes    Path
  1.350     +4 -2      src/sys/i386/i386/machdep.c
  1.220     +282 -199  src/sys/kern/vfs_bio.c
  1.206     +42 -10    src/sys/kern/vfs_subr.c
  1.75      +5 -5      src/sys/sys/buf.h
  1.57      +2 -1      src/sys/sys/kernel.h
  1.85      +2 -2      src/sys/sys/proc.h
  1.144     +9 -11     src/sys/vm/vm_pageout.c
  1.50      +3 -1      src/sys/vm/vm_pager.c



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199907040025.RAA83209>