HomeFreeBSD

callout: provide CALLOUT_TRYLOCK flag

Description

callout: provide CALLOUT_TRYLOCK flag

If a callout was initialized with the flag, then the callout(9) system
will not drop the callwheel lock in softclock_call_cc() to obtain the
callout lock. Instead it will use try-lock semantic to obtain the
callout's lock. In case of a failure the callout will be rescheduled to
the 50% of the precision value. The main benefit of such behavior is not
the avoidance of the lock contention in the callout thread, but the fact
that callout with such flag can be actually stopped in a safe manner,
because the race window in the beginning of softclock_call_cc() is closed.

Call of callout_stop() on such a callout would guarantee that nothing will
be executed after callout_stop() returns, neither callout lock will be
dereferenced. A callout marked as CALLOUT_TRYLOCK |
CALLOUT_RETURNUNLOCKED can call callout_stop() from the callout function
itself (0, a failure to stop, will be returned), then unlock the lock and
then free the memory containing the callout structure.

Caveat: when calling callout_stop() from outside the callout function, the
return value from callout_stop() is still inconsistent. A race window at
the end of softclock_call_cc() still exists, so callout_stop() may report
failure to stop, which would not be true.

Reviewed by: jtl, kib
Differential Revision: https://reviews.freebsd.org/D45746

Details

Provenance
glebiusAuthored on Thu, Oct 24, 4:58 PM
Reviewer
jtl
Differential Revision
D45746: callout: provide CALLOUT_TRYLOCK flag
Parents
rG656991b0c629: locks: augment lock_class with lc_trylock method
Branches
Unknown
Tags
Unknown