Writing a plain text file to disk from kernel space
Lawrence Stewart
lstewart at room52.net
Fri May 25 03:26:12 UTC 2007
Comments inline...
Dag-Erling Smørgrav wrote:
> Lawrence Stewart <lstewart at room52.net> writes:
>
>> Dag-Erling Smørgrav <des at 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
More information about the freebsd-hackers
mailing list