summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_bio.c
diff options
context:
space:
mode:
authortruckman <truckman@FreeBSD.org>2005-09-30 01:30:01 +0000
committertruckman <truckman@FreeBSD.org>2005-09-30 01:30:01 +0000
commit414043e88df9287115e6133263316c8346532605 (patch)
tree1f814a73e0737d738ff28d17be42b438cdc748d5 /sys/kern/vfs_bio.c
parent3ddc14f22ce145bcd209c232cb62a7086e4e285d (diff)
downloadFreeBSD-src-414043e88df9287115e6133263316c8346532605.zip
FreeBSD-src-414043e88df9287115e6133263316c8346532605.tar.gz
Un-staticize runningbufwakeup() and staticize updateproc.
Add a new private thread flag to indicate that the thread should not sleep if runningbufspace is too large. Set this flag on the bufdaemon and syncer threads so that they skip the waitrunningbufspace() call in bufwrite() rather than than checking the proc pointer vs. the known proc pointers for these two threads. A way of preventing these threads from being starved for I/O but still placing limits on their outstanding I/O would be desirable. Set this flag in ffs_copyonwrite() to prevent bufwrite() calls from blocking on the runningbufspace check while holding snaplk. This prevents snaplk from being held for an arbitrarily long period of time if runningbufspace is high and greatly reduces the contention for snaplk. The disadvantage is that ffs_copyonwrite() can start a large amount of I/O if there are a large number of snapshots, which could cause a deadlock in other parts of the code. Call runningbufwakeup() in ffs_copyonwrite() to decrement runningbufspace before attempting to grab snaplk so that I/O requests waiting on snaplk are not counted in runningbufspace as being in-progress. Increment runningbufspace again before actually launching the original I/O request. Prior to the above two changes, the system could deadlock if enough I/O requests were blocked by snaplk to prevent runningbufspace from falling below lorunningspace and one of the bawrite() calls in ffs_copyonwrite() blocked in waitrunningbufspace() while holding snaplk. See <http://www.holm.cc/stress/log/cons143.html>
Diffstat (limited to 'sys/kern/vfs_bio.c')
-rw-r--r--sys/kern/vfs_bio.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index 80e4d10..945d95d 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -318,7 +318,7 @@ bufspacewakeup(void)
* runningbufwakeup() - in-progress I/O accounting.
*
*/
-static __inline void
+void
runningbufwakeup(struct buf *bp)
{
@@ -847,8 +847,7 @@ bufwrite(struct buf *bp)
* or syncer daemon trying to clean up as that can lead
* to deadlock.
*/
- if (curthread->td_proc != bufdaemonproc &&
- curthread->td_proc != updateproc)
+ if ((curthread->td_pflags & TDP_NORUNNINGBUF) == 0)
waitrunningbufspace();
}
@@ -1964,6 +1963,7 @@ buf_daemon()
/*
* This process is allowed to take the buffer cache to the limit
*/
+ curthread->td_pflags |= TDP_NORUNNINGBUF;
mtx_lock(&bdlock);
for (;;) {
bd_request = 0;
OpenPOWER on IntegriCloud