Date: Sun, 4 Nov 2001 14:59:28 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: Mark Santcroos <marks@ripe.net> Cc: current@FreeBSD.ORG Subject: Re: buf_daemon() lockup Message-ID: <200111042259.fA4MxSc93566@apollo.backplane.com> References: <20011101092118.A434@laptop.6bone.nl>
index | next in thread | previous in thread | raw e-mail
Hmm. Well, bufdaemon is doing the right thing by blocking
in that loop. The problem appears to be related to the
double-I/O that is occuring due to the way MD filesystems
work. A vnode-backed MD takes a strategy call and turns
around and issues a high-level filesystem write. This
can deadlock the system in wdrain.
I'll take a look at it. I think the easiest thing to do
is to simply convert the async writes into synchronous
writes when we hit the I/O pipe limit, rather then
blocking.
-Matt
Matthew Dillon
<dillon@backplane.com>
:I have an easy to reproduce case where my system goes into a blocking
:sleep.
:
:# mdconfig -a -t vnode -f largefile -u 0
:# newfs /dev/md0c
:# mount /dev/md0c /mnt
:# cd /mnt
:# cp -prv /boot .
:[ runs for a while and then stops ]
:
:While breaking into ddb I see that "cp", and "bufdaemon" are asleep with
:"wdrain".
:
:To my understanding, bufdaemon is the thread that takes care of flushing
:out the buffers. But as it is put to a blocking sleep, it will never get
:out of this.
:
:A quick (and dirty) fix of it is attached. It doesnt put bufdaemon to wait
:for buffers to flush. But probably this needs to be done in a different
:way. (Like not calling waitrunningbufspace() from buf_daemon())
:
:If it can be pointed out in which direction this should be solved I can
:work it out further.
:
:Thanks
:
:Mark
:
:--
:Mark Santcroos RIPE Network Coordination Centre
:http://www.ripe.net/home/mark/ New Projects Group/TTM
:
:--uQr8t48UFsdbeI+V
:Content-Type: text/plain; charset=us-ascii
:Content-Disposition: attachment; filename="vfs_bio.patch"
:
:--- vfs_bio.c.orig Thu Nov 1 08:31:30 2001
:+++ vfs_bio.c Thu Nov 1 08:30:36 2001
:@@ -270,7 +270,10 @@
: {
: while (runningbufspace > hirunningspace) {
: ++runningbufreq;
:+ if(curthread->td_proc->p_pid!=5)
: tsleep(&runningbufreq, PVM, "wdrain", 0);
:+ else
:+ break;
: }
: }
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200111042259.fA4MxSc93566>
