Old LOR between devfs & devfsmount resurfacing?
Marcel Moolenaar
xcllnt at mac.com
Thu Feb 7 17:42:35 UTC 2008
On Feb 7, 2008, at 6:11 AM, Attilio Rao wrote:
>>>>>>>> Correct lock order is devfs vnode -> devfs mount sx lock. When
>>>>>>>> allocating new devfs vnode, see devfs_allocv(), the newly
>>>>>>>> created
>>>>>>>> vnode is locked while devfs mount lock already held (see line
>>>>>>>> 250 of
>>>>>>>> fs/devfs/devfs_vnops.c). Nonetheless, this cannot cause
>>>>>>>> deadlock since
>>>>>>>> no other thread can find the new vnode, and thus perform the
>>>>>>>> other lock
>>>>>>>> order for this vnode lock.
>>>>>>>>
>>>>>>>> The fix is to shut the witness in this particular case.
>>>>>>>> Attilio, how to
>>>>>>>> do this ?
>>>>>>>
>>>>>>> Just add LK_NOWITNESS for one of the lock involved in the
>>>>>>> lockinit().
>>>>>>
>>>>>>
>>>>>> Then, we loss the useful reports of the actual LORs later,
>>>>>> isn't it ?
>>>>>
>>>>> Another solution would be to rewamp BLESSING option which allow to
>>>>> 'bless' some LORs.
>>>>> jhb and me, btw, didn't want to enable it because it could lead
>>>>> some
>>>>> less experienced developer to hide LORs under this label and
>>>>> this is
>>>>> something we want to avoid.
>>>>
>>>>
>>>> This LOR shall not be ignored globally. When real, it caused the
>>>> easily
>>>> reproducable lockup of the machine.
>>>>
>>>> It would be better to introduce some lockmgr flag to ignore
>>>> _this_ locking.
>>>
>>> flag to pass where?
>> To the lockmgr itself at the point of aquisition, like
>> lockmgr(&lk, LK_EXCLUSIVE | LK_INTERLOCK | LK_NOWARN,
>> &interlk, ...);
>
> No, I really want a general WITNESS support for this (as I also think
> that having something more fine grained than BLESSING will break all
> concerns jhb and me are considering now).
> A simple way to do it would mean hard-coding file and line in a
> witness table. While file is ok, line makes trouble so we should find
> an alternative way to do this. Otherwise we can consider skiping
> checks for a whole function, this should be not so difficult to
> achive.
>
> I need to think more about this.
What about a linker set that lists file regions (based on line number).
If you want to exclude a particular lock from WITNESS you can do
something like this:
WITNESS_REGION_START(function)
lockmgr(...)
WITNESS_REGION_END
The WITNESS_REGION_START and WITNESS_WITNESS_END together create a
region in the linker set and witness can check if a lock operation
falls within that region. If yes, we can make it do something special
by given the _START and/or _END a function pointer or we can make it
ignore the operation by passing NULL or something.
You can safely use file & line numbers in this case. Something along
those lines...
Thoughts?
--
Marcel Moolenaar
xcllnt at mac.com
More information about the freebsd-current
mailing list