17#ifndef __LINUX_WW_MUTEX_H
18#define __LINUX_WW_MUTEX_H
24#if defined(CONFIG_DEBUG_MUTEXES) || \
25 (defined(CONFIG_PREEMPT_RT) && defined(CONFIG_DEBUG_RT_MUTEXES))
26#define DEBUG_WW_MUTEXES
29#ifndef CONFIG_PREEMPT_RT
30#define WW_MUTEX_BASE mutex
31#define ww_mutex_base_init(l,n,k) __mutex_init(l,n,k)
32#define ww_mutex_base_is_locked(b) mutex_is_locked((b))
34#define WW_MUTEX_BASE rt_mutex
35#define ww_mutex_base_init(l,n,k) __rt_mutex_init(l,n,k)
36#define ww_mutex_base_is_locked(b) rt_mutex_base_is_locked(&(b)->rtmutex)
50 struct ww_acquire_ctx *ctx;
51#ifdef DEBUG_WW_MUTEXES
59 unsigned int acquired;
60 unsigned short wounded;
61 unsigned short is_wait_die;
62#ifdef DEBUG_WW_MUTEXES
63 unsigned int done_acquire;
65 void *contending_lock;
67#ifdef CONFIG_DEBUG_LOCK_ALLOC
80#ifdef CONFIG_DEBUG_WW_MUTEX_SLOWPATH
81 unsigned int deadlock_inject_interval;
82 unsigned int deadlock_inject_countdown;
86#define __WW_CLASS_INITIALIZER(ww_class, _is_wait_die) \
87 { .stamp = ATOMIC_LONG_INIT(0) \
88 , .acquire_name = #ww_class "_acquire" \
89 , .mutex_name = #ww_class "_mutex" \
90 , .is_wait_die = _is_wait_die }
92#define DEFINE_WD_CLASS(classname) \
93 struct ww_class classname = __WW_CLASS_INITIALIZER(classname, 1)
95#define DEFINE_WW_CLASS(classname) \
96 struct ww_class classname = __WW_CLASS_INITIALIZER(classname, 0)
109static inline void ww_mutex_init(
struct ww_mutex *lock,
114#ifdef DEBUG_WW_MUTEXES
143static inline void ww_acquire_init(
struct ww_acquire_ctx *ctx,
148 ctx->stamp = atomic_long_inc_return_relaxed(&
ww_class->
stamp);
150 ctx->wounded =
false;
152#ifdef DEBUG_WW_MUTEXES
154 ctx->done_acquire = 0;
155 ctx->contending_lock =
NULL;
157#ifdef CONFIG_DEBUG_LOCK_ALLOC
158 debug_check_no_locks_freed((
void *)ctx,
sizeof(*ctx));
163 mutex_acquire(&ctx->dep_map, 0, 0,
_RET_IP_);
164 mutex_acquire_nest(&ctx->first_lock_dep_map, 0, 0, &ctx->dep_map,
_RET_IP_);
166#ifdef CONFIG_DEBUG_WW_MUTEX_SLOWPATH
167 ctx->deadlock_inject_interval = 1;
168 ctx->deadlock_inject_countdown = ctx->stamp & 0xf;
183static inline void ww_acquire_done(
struct ww_acquire_ctx *ctx)
186#ifdef DEBUG_WW_MUTEXES
190 ctx->done_acquire = 1;
201static inline void ww_acquire_fini(
struct ww_acquire_ctx *ctx)
204#ifdef CONFIG_DEBUG_LOCK_ALLOC
205 mutex_release(&ctx->first_lock_dep_map,
_THIS_IP_);
208#ifdef DEBUG_WW_MUTEXES
215 ctx->done_acquire = 1;
286 struct ww_acquire_ctx *ctx)
313ww_mutex_lock_slow(
struct ww_mutex *lock,
struct ww_acquire_ctx *ctx)
317#ifdef DEBUG_WW_MUTEXES
350ww_mutex_lock_slow_interruptible(
struct ww_mutex *lock,
351 struct ww_acquire_ctx *ctx)
354#ifdef DEBUG_WW_MUTEXES
363 struct ww_acquire_ctx *ctx)
374static inline void ww_mutex_destroy(
struct ww_mutex *lock)
377#ifndef CONFIG_PREEMPT_RT
388static inline bool ww_mutex_is_locked(
struct ww_mutex *lock)
#define NULL
Definition actypes.h:561
#define _THIS_IP_
Definition linkage.h:46
#define __acquires(...)
Definition compiler-context-analysis.h:299
#define __must_not_hold(...)
Definition compiler-context-analysis.h:291
#define __cond_acquires(ret, x)
Definition compiler-context-analysis.h:326
#define __must_hold(...)
Definition compiler-context-analysis.h:283
#define context_lock_struct(name,...)
Definition compiler-context-analysis.h:188
#define __no_context_analysis
Definition compiler-context-analysis.h:191
#define __releases(...)
Definition compiler-context-analysis.h:335
#define __must_check
Definition compiler.h:114
#define DEBUG_LOCKS_WARN_ON(c)
Definition debug_locks.h:24
struct i915_user_extension base
Definition i915_drm.h:0
#define _RET_IP_
Definition instruction_pointer.h:22
#define IS_ENABLED(option)
Definition kconfig.h:80
#define U
Definition libunicode.c:1830
#define mutex_destroy(m)
Definition mutex.h:71
#define lockdep_init_map(lock, name, key, sub)
Definition lockdep.h:57
#define lockdep_assert_held(l)
Definition lockdep.h:71
#define current
Definition mm.h:90
atomic_long_t stamp
Definition ww_mutex.h:40
struct lock_class_key acquire_key
Definition ww_mutex.h:41
struct lock_class_key mutex_key
Definition ww_mutex.h:42
const char * mutex_name
Definition ww_mutex.h:44
unsigned int is_wait_die
Definition ww_mutex.h:45
const char * acquire_name
Definition ww_mutex.h:43
void ww_mutex_unlock(struct ww_mutex *lock) __releases(lock)
#define ww_mutex_base_init(l, n, k)
Definition ww_mutex.h:31
#define WW_MUTEX_BASE
Definition ww_mutex.h:30
int ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) __cond_acquires(0
#define ww_mutex_base_is_locked(b)
Definition ww_mutex.h:32
int __must_check ww_mutex_lock_interruptible(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) __cond_acquires(0
int __must_check ww_mutex_trylock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) __cond_acquires(true