On 12/19/25 8:40 AM, Marco Elver wrote:
Add support for Clang's context analysis for ww_mutex.

The programming model for ww_mutex is subtly more complex than other
locking primitives when using ww_acquire_ctx. Encoding the respective
pre-conditions for ww_mutex lock/unlock based on ww_acquire_ctx state
using Clang's context analysis makes incorrect use of the API harder.

That's a very short description. It should have been explained in the
patch description how the ww_acquire_ctx changes affect callers of the
ww_acquire_{init,done,fini}() functions.

  static inline void ww_acquire_init(struct ww_acquire_ctx *ctx,
                                   struct ww_class *ww_class)
+       __acquires(ctx) __no_context_analysis
[ ... ]
  static inline void ww_acquire_done(struct ww_acquire_ctx *ctx)
+       __releases(ctx) __acquires_shared(ctx) __no_context_analysis
  {
[ ... ]
  static inline void ww_acquire_fini(struct ww_acquire_ctx *ctx)
+       __releases_shared(ctx) __no_context_analysis

The above changes make it mandatory to call ww_acquire_done() before
calling ww_acquire_fini(). In Documentation/locking/ww-mutex-design.rst
there is an example where there is no ww_acquire_done() call between
ww_acquire_init() and ww_acquire_fini() (see also line 202). The
function dma_resv_lockdep() in drivers/dma-buf/dma-resv.c doesn't call
ww_acquire_done() at all. Does this mean that the above annotations are
wrong? Is there a better solution than removing the __acquire() and
__release() annotations from the above three functions?

Bart.

Reply via email to