From owner-freebsd-hackers@FreeBSD.ORG Wed May 23 07:51:09 2007 Return-Path: X-Original-To: freebsd-hackers@freebsd.org Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 4AF0516A41F for ; Wed, 23 May 2007 07:51:09 +0000 (UTC) (envelope-from des@des.no) Received: from tim.des.no (tim.des.no [194.63.250.121]) by mx1.freebsd.org (Postfix) with ESMTP id 0B93413C46C for ; Wed, 23 May 2007 07:51:08 +0000 (UTC) (envelope-from des@des.no) Received: from tim.des.no (localhost [127.0.0.1]) by spam.des.no (Postfix) with ESMTP id 07D9F2084; Wed, 23 May 2007 09:51:05 +0200 (CEST) X-Spam-Tests: AWL X-Spam-Learn: disabled X-Spam-Score: 0.0/3.0 X-Spam-Checker-Version: SpamAssassin 3.1.7 (2006-10-05) on tim.des.no Received: from dwp.des.no (des.no [80.203.243.180]) by smtp.des.no (Postfix) with ESMTP id EC2802083; Wed, 23 May 2007 09:51:04 +0200 (CEST) Received: by dwp.des.no (Postfix, from userid 1001) id CE29E5079; Wed, 23 May 2007 09:51:04 +0200 (CEST) From: =?utf-8?Q?Dag-Erling_Sm=C3=B8rgrav?= To: Lawrence Stewart References: <4649349D.4060101@room52.net> <200705150847.38838.marc.loerner@hob.de> <46499491.2010205@room52.net> <46515DE0.20209@room52.net> <86sl9qtpd1.fsf@dwp.des.no> <4652AD8C.7000605@room52.net> <86r6p9md2n.fsf@dwp.des.no> <465397FB.9080309@room52.net> Date: Wed, 23 May 2007 09:51:04 +0200 Message-ID: <86odkcugev.fsf@dwp.des.no> User-Agent: Gnus/5.110006 (No Gnus v0.6) Emacs/21.3 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Cc: freebsd-hackers@freebsd.org Subject: Re: Writing a plain text file to disk from kernel space X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 May 2007 07:51:09 -0000 Lawrence Stewart writes: > Dag-Erling Sm=C3=B8rgrav writes: > > Since you are writing kernel code, I assume you have KDB/DDB in your > > kernel and know how to use it. > I don't know how to use them really. Thus far I haven't had a need for > really low level debugging tools... seems that may have changed > though! Any good tutorials/pointers on how to get started with kernel > debugging? The handbook and FAQ have information on debugging panics. Greg Lehey (grog@) does a tutorial on kernel debugging, you can probably find slides online (or just ask him) > > kio_write probably blocks waiting for the write to complete. You can't > > do that while holding a non-sleepable lock. > So this is where my knowledge/understanding gets very hazy... > > When a thread blocks waiting for some operation to complete or event > to happen, the thread effectively goes to sleep, correct? It depends on the type of lock used, but mostly, yes. > Looking at the kio_write code in subr_kernio.c, I'm guessing the lock > that is causing the trouble is related to the "vn_lock" function call? What matters is that kio_write() may sleep and therefore can't be called while holding a non-sleepable lock. > I don't understand though why the vnode lock would be set up in such a > way that when the write blocks whilst waiting for the underlying > filesystem to signal everything is ok, it causes the kernel to panic! You cannot sleep while holding a non-sleepable lock. You need to find out which locks are held at the point where you call kio_write(), and figure out a way to delay the kio_write() call until those locks are released. > How do I make the lock "sleepable" or make sure the thread doesn't try > go to sleep whilst holding the lock? You can't make an unsleepable lock sleepable. You might be able to replace it with a sleepable lock, but you would have to go through every part of the kernel that uses the lock and make sure that it works correctly with a sleepable lock. Most likely, it won't. DES --=20 Dag-Erling Sm=C3=B8rgrav - des@des.no