[PATCH] kthread_{suspend, resume, suspend_check} locking bugs
Rui Paulo
rpaulo at freebsd.org
Sat Jan 23 02:06:01 UTC 2010
On 23 Jan 2010, at 00:05, Giovanni Trematerra wrote:
> On Fri, Jan 22, 2010 at 05:40:41PM +0100, Attilio Rao wrote:
>> 2010/1/16 Jilles Tjoelker <jilles at stack.nl>:
>>> On Sun, Jan 10, 2010 at 02:09:43AM +0100, Attilio Rao wrote:
>>>> I think that routines kthread_suspend(), kthread_resume() and
>>>> kthread_suspend_check() are not adeguately SMP protected.
>>>> That is because, in particular, the critical path doesn't protect,
>>>> together, TDF_KTH_SUSP and sleeping activity. The right pattern should
>>>> be to use the thread lock spinlock as an interlock and use msleep.
>>>> Such bugs have not been revealed probabilly because there has been a
>>>> lack of testing of such primitives and there are not, currently,
>>>> consumers within our stock kernel.
>>>
>>>> Additively, kthread_suspend_check() seems to require to always pass
>>>> curthread, which is silly (as we don't have to conform to any
>>>> particular KPI), thus I think it is appropriate for the prototype to
>>>> change.
>>>> The following patch should fix the issue:
>>>> http://www.freebsd.org/~attilio/kthread.diff
>>>
>>> The analysis and patch look sensible.
>>
>> After have digged more with jhb I made a new patch:
>> http://www.freebsd.org/~attilio/kthread_races.diff
>
> In kthread_suspend_check you might have written
> panic("%s: curthread is not a valid kthread", __func__);
>
>>
>> Gianni, may you test this patch with the modules you made?
>>
>
> With your last patch, no deadlock happens now.
> It seems ok.
>
> Hope this help
>
> Just in case someone would make a review of the kernel test module
> here it is the code:
This is a great candidate for a regression add-on.
--
Rui Paulo
More information about the freebsd-arch
mailing list