Skip site navigation (1)Skip section navigation (2)
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>