cvs commit: src/sys/kern vnode_if.src
Diomidis Spinellis
dds at aueb.gr
Tue May 30 22:49:03 PDT 2006
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).
Diomidis
More information about the cvs-src
mailing list