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>
next in thread | previous in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200111042259.fA4MxSc93566>