On Mon, Jan 06, 2020 at 06:54:59PM +0100, Luc Van Oostenryck wrote: > On Mon, Jan 06, 2020 at 04:41:19PM +0100, Peter Zijlstra wrote: > > extern bool spin_trylock(spinlock_t *lock) __attribute__((context(lock, 0, spin_trylock(lock)); > > Well, allowing arbitrary conditions would be hard/impossible but you're > only asking to have the *return value* as condition, right? That looks > as reasonably feasible. Just the return value would cover all the known cases yes. At the time I might have been somewhat over ambitious.. > > Basically have sparse do a transform on its own expression tree and > > inject the very same crud we now do manually. This avoids cluttering the > > kernel tree with this nonsense. > > So, a call of a function declared with __acquires() or releases() is > interpreted by Sparse as if the call is immediately followed by an > increase or a decrease of the context. It wouldn't be very hard to > add a new attribute (something like __cond_context) and let Sparse do > as if a call to a function with such attribute is directly followed > by a test of its return value and a corresponding change in the context. > It would boil down to: > > extern bool spin_trylock(lock) __cond_context(lock); > > if (spin_trylock(lock)) { > /* do crap */ > spin_unlock(); > } > > behaving like the following code currently would: > > extern bool spin_trylock(lock); > > if (spin_trylock(lock)) { > __acquire(lock); > /* do crap */ > spin_unlock(); > } > > > Would something like this be satisfactory? Very much so, Thanks!