On Tue, Mar 31, 2026 at 03:34:50AM -0700, Usama Arif wrote:
> On Thu, 26 Mar 2026 15:10:02 +0000 Dmitry Ilvokhin <[email protected]> wrote:
> 
> > Add the contended_release trace event. This tracepoint fires on the
> > holder side when a contended lock is released, complementing the
> > existing contention_begin/contention_end tracepoints which fire on the
> > waiter side.
> > 
> > This enables correlating lock hold time under contention with waiter
> > events by lock address.
> > 
> > Add trace_contended_release() calls to the slowpath unlock paths of
> > sleepable locks: mutex, rtmutex, semaphore, rwsem, percpu-rwsem, and
> > RT-specific rwbase locks.
> > 
> > Where possible, trace_contended_release() fires before the lock is
> > released and before the waiter is woken. For some lock types, the
> > tracepoint fires after the release but before the wake. Making the
> > placement consistent across all lock types is not worth the added
> > complexity.
> > 
> > For reader/writer locks, the tracepoint fires for every reader releasing
> > while a writer is waiting, not only for the last reader.
> > 
> > Signed-off-by: Dmitry Ilvokhin <[email protected]>
> > ---
> >  include/trace/events/lock.h   | 17 +++++++++++++++++
> >  kernel/locking/mutex.c        |  4 ++++
> >  kernel/locking/percpu-rwsem.c | 11 +++++++++++
> >  kernel/locking/rtmutex.c      |  1 +
> >  kernel/locking/rwbase_rt.c    |  6 ++++++
> >  kernel/locking/rwsem.c        | 10 ++++++++--
> >  kernel/locking/semaphore.c    |  4 ++++
> >  7 files changed, 51 insertions(+), 2 deletions(-)
> > 
> > diff --git a/include/trace/events/lock.h b/include/trace/events/lock.h
> > index da978f2afb45..1ded869cd619 100644
> > --- a/include/trace/events/lock.h
> > +++ b/include/trace/events/lock.h
> > @@ -137,6 +137,23 @@ TRACE_EVENT(contention_end,
> >     TP_printk("%p (ret=%d)", __entry->lock_addr, __entry->ret)
> >  );
> >  
> > +TRACE_EVENT(contended_release,
> > +
> > +   TP_PROTO(void *lock),
> > +
> > +   TP_ARGS(lock),
> > +
> > +   TP_STRUCT__entry(
> > +           __field(void *, lock_addr)
> > +   ),
> > +
> > +   TP_fast_assign(
> > +           __entry->lock_addr = lock;
> > +   ),
> > +
> > +   TP_printk("%p", __entry->lock_addr)
> > +);
> > +
> >  #endif /* _TRACE_LOCK_H */
> >  
> >  /* This part must be outside protection */
> > diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c
> > index 427187ff02db..6c2c9312eb8f 100644
> > --- a/kernel/locking/mutex.c
> > +++ b/kernel/locking/mutex.c
> > @@ -997,6 +997,9 @@ static noinline void __sched 
> > __mutex_unlock_slowpath(struct mutex *lock, unsigne
> >             wake_q_add(&wake_q, next);
> >     }
> >  
> > +   if (trace_contended_release_enabled() && waiter)
> > +           trace_contended_release(lock);
> > +
> 
> This won't compile? waiter is declared in the if block, so you are using
> it outside scope here.
>

Thanks for the feedback, Usama.

waiter is declared at function scope, right on top. It's also assigned
before the if block, so it's still in scope at the tracepoint.

Reply via email to