DragonFly commits List (threaded) for 2008-01
cvs commit: src/sys/kern vfs_bio.c src/sys/sys buf.h src/sys/vfs/nfs nfs_bio.c
dillon 2008/01/09 23:34:04 PST
DragonFly src repository
Fix buffer cache deadlocks by splitting dirty buffers into two categories:
Light weight dirty buffers and heavy weight dirty buffers. Add a second
buffer cache flushing daemon to deal with the heavy weight dirty buffers.
Currently only HAMMER uses the new feature, but it can also easily be used
by UFS in the future.
Buffer cache deadlocks can occur in low memory situations where the buffer
cache tries to flush out dirty buffers and deadlocks when the act of
flushing a dirty buffer requires additional buffers to be acquired. Because
there was only one buffer flushing daemon, a deadlock on a heavy weight buffer
prevented any further buffer flushes, whether light or heavy weight, and
wound up deadlocking the entire system.
Giving the heavy weight buffers their own daemon solves the problem by
allowing light weight buffers to continue to be flushed even if a stall
occurs on a heavy weight buffer. The numbers of dirty heavy weight buffers
is limited to ensure that enough light weight buffers are available.
This is primarily implemented by changing getblk()'s mostly unused slpflag
parameter to a new blkflags parameter and adding a new buffer cache queue
Revision Changes Path
1.96 +200 -59 src/sys/kern/vfs_bio.c
1.42 +15 -1 src/sys/sys/buf.h
1.42 +1 -1 src/sys/vfs/nfs/nfs_bio.c