cvs commit: src/sys/kern vnode_if.src
Don Lewis
truckman at FreeBSD.org
Wed May 31 02:20:32 PDT 2006
On 31 May, Diomidis Spinellis wrote:
> Don Lewis wrote:
>> On 28 May, Diomidis Spinellis wrote:
>>> dds 2006-05-28 07:24:12 UTC
>>>
>>> FreeBSD src repository
>>>
>>> Modified files:
>>> sys/kern vnode_if.src
>>> Log:
>>> Add missing % signs in the lock annotations of the functions:
>>> lookup, rename, strategy, islocked
>>> The missing % sign meant that the lines were processed as plain
>>> comments and the corresponding assertions were never generated.
>>>
>>> Revision Changes Path
>>> 1.80 +8 -8 src/sys/kern/vnode_if.src
>>
>> [appearing from the void]
>>
>> The additional sanity checking generated by this patch made my system
>> unbootable with DEBUG_VFS_LOCKS enabled.
>>
>> ASSERT_VI_UNLOCKED() calls are added to VOP_ISLOCKED_APV(), but there
>> is an explicit call to VOP_ISLOCKED() in vput() with the vnode
>> interlock held. This could be fixed by re-ordering the code in
>> vput(), but there are also a number of places in lower level code that
>> are called with the vnode interlock held that contain calls to
>> ASSERT_VOP_LOCKED(), which in turn calls VOP_ISLOCKED(). Possible
>> fixes:
>> Specify the locking value as "-" for vop_islocked() in vnode_if.src
>>
>> Introduce a new locking value, similar to "=", but which skips the
>> interlock check. Note: vnode_if.awk does not implement the "="
>> vnode lock assertion.
>>
>> The fdvp and fvp initial vnode lock state assertions can't be checked
>> by the generated wrapper. If fdvp and fvp happen to be references to
>> tdvp and/or tvp, which must be locked, then fdvp and/or fvp will also
>> be locked. They should only be unlocked if they are different vnodes
>> than tdvp and tvp. The proper sanity checking appears to be done in
>> vop_rename_pre(). The initial lock value for fdvp and fvp should
>> probably be set to "-" in vnode_if.src, or to another value that only
>> generates the interlock assertion.
>>
>> VOP_RENAME_APV() calls ASSERT_VI_UNLOCKED() on tvp before and after
>> the vop->vop_rename() call, even though tvp may be NULL. vnode_if.src
>> specifies the initial lock state as "X", which indicates that the
>> check should be skipped if the vnode pointer is NULL, but vnode_if.awk
>> does not handle the "X" value at all, and adds an unconditional
>> interlock check. vop_rename_pre() does the conditional vnode lock
>> check, so maybe the interlock check could be done there as well and
>> omitted from the wrapper. The final state is specified as "U", though
>> this should also be a conditional check, but there is no vnode locking
>> value that generates a conditional unlock assertion.
>> vop_rename_post() does not do any lock state sanity checks.
>>
>> BTW, the VOP_ISLOCKED(9) man page does not document that the return
>> value is the shared/exclusive lock type.
>>
>> [disappearing into the void]
>
> I committed a stopgap measure (I disabled the erroneous checks), and
> will look at how I can correctly enable them again. Do you think that
> booting with DEBUG_VFS_LOCKS and performing a kernel build would be
> enough to gain confidence that a particular assertion is correctly
> generated? Any proposals for additional tests? (The system I use for
> testing has unfortunately only a single processor).
That should be sufficient. The VOP_ISLOCKED() bug gets tripped pretty
quickly, when the root file system gets mounted as I recall. The
VOP_RENAME() bugs got triggered during the transition to multi-user
mode. Once I disabled the tests that I mentioned, I was able to build
a bunch of ports.
More information about the cvs-src
mailing list