Date: Fri, 25 May 2007 13:26:58 +1000 From: Lawrence Stewart <lstewart@room52.net> To: =?UTF-8?B?RGFnLUVybGluZyBTbcO4cmdyYXY=?= <des@des.no> Cc: freebsd-hackers@freebsd.org Subject: Re: Writing a plain text file to disk from kernel space Message-ID: <46565781.2030407@room52.net> In-Reply-To: <86odkcugev.fsf@dwp.des.no> References: <4649349D.4060101@room52.net> <200705150847.38838.marc.loerner@hob.de> <46499491.2010205@room52.net> <f2j5hf$hap$2@sea.gmane.org> <46515DE0.20209@room52.net> <86sl9qtpd1.fsf@dwp.des.no> <4652AD8C.7000605@room52.net> <86r6p9md2n.fsf@dwp.des.no> <465397FB.9080309@room52.net> <86odkcugev.fsf@dwp.des.no>
next in thread | previous in thread | raw e-mail | index | archive | help
Comments inline... Dag-Erling Smørgrav wrote: > Lawrence Stewart <lstewart@room52.net> writes: > >> Dag-Erling Smørgrav <des@des.no> 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) > For reference, I found what looks to be a very comprehensive kernel debugging reference here: http://www.lemis.com/grog/Papers/Debug-tutorial/tutorial.pdf Greg certainly knows the ins and outs of kernel debugging! > >>> 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. > > Thanks for the explanations. I'm starting to get a better picture of what's actually going on. So it seems that there is no way I can call kio_write from within the function that is acting as a pfil output hook, because it blocks at some point whilst doing the disk write, which makes the kernel unhappy because pfil code is holding a non-sleepable mutex somewhere. If you read my other message from yesterday, I still can't figure out why this only happens with outbound TCP traffic, but anyways... I'll have a bit more of a think about it and get back to the list shortly... Cheers, Lawrence
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?46565781.2030407>