Hello, Thank you for the feedback! On Mon, 2020-11-16 at 23:27 +0100, Luc Van Oostenryck wrote: > > @@ -1606,10 +1607,12 @@ bool lock_sock_fast(struct sock *sk); > > */ > > static inline void unlock_sock_fast(struct sock *sk, bool slow) > > { > > - if (slow) > > + if (slow) { > > release_sock(sk); > > - else > > + __release(&sk->sk_lock.slock); > > The correct solution would be to annotate the declaration of > release_sock() with '__releases(&sk->sk_lock.slock)'. If I add such annotation to release_sock(), I'll get several sparse warnings for context imbalance (on each lock_sock()/release_sock() pair), unless I also add an '__acquires()' annotation to lock_sock(). The above does not look correct to me ?!? When release_sock() completes the socket spin lock is not held. The annotation added above is somewhat an artifact to let unlock_sock_fast() matches lock_sock_fast() from sparse perspective. I intentionally avoided changing the release_sock() annotation to avoid introducing more artifacts. The proposed schema is not 100% accurate, as it will also allow e.g. a really-not-fitting bh_lock_sock()/unlock_sock_fast() pair, but I could not come-up with anything better. Can we go with the schema I proposed? Thanks, Paolo