Lines Matching refs:m
16 void mutex_init(struct mutex *m) in mutex_init() argument
18 *m = (struct mutex)MUTEX_INITIALIZER; in mutex_init()
21 void mutex_init_recursive(struct recursive_mutex *m) in mutex_init_recursive() argument
23 *m = (struct recursive_mutex)RECURSIVE_MUTEX_INITIALIZER; in mutex_init_recursive()
26 static void __mutex_lock(struct mutex *m, const char *fname, int lineno) in __mutex_lock() argument
32 mutex_lock_check(m); in __mutex_lock()
48 old_itr_status = cpu_spin_lock_xsave(&m->spin_lock); in __mutex_lock()
50 can_lock = !m->state; in __mutex_lock()
52 wq_wait_init(&m->wq, &wqe, false /* wait_read */); in __mutex_lock()
54 m->state = -1; /* write locked */ in __mutex_lock()
57 cpu_spin_unlock_xrestore(&m->spin_lock, old_itr_status); in __mutex_lock()
64 wq_wait_final(&m->wq, &wqe, 0, m, fname, lineno); in __mutex_lock()
70 static void __mutex_lock_recursive(struct recursive_mutex *m, const char *fname, in __mutex_lock_recursive() argument
78 if (atomic_load_short(&m->owner) == ct) { in __mutex_lock_recursive()
79 if (!refcount_inc(&m->lock_depth)) in __mutex_lock_recursive()
84 __mutex_lock(&m->m, fname, lineno); in __mutex_lock_recursive()
86 assert(m->owner == THREAD_ID_INVALID); in __mutex_lock_recursive()
87 atomic_store_short(&m->owner, ct); in __mutex_lock_recursive()
88 refcount_set(&m->lock_depth, 1); in __mutex_lock_recursive()
91 static void __mutex_unlock(struct mutex *m, const char *fname, int lineno) in __mutex_unlock() argument
98 mutex_unlock_check(m); in __mutex_unlock()
100 old_itr_status = cpu_spin_lock_xsave(&m->spin_lock); in __mutex_unlock()
102 if (!m->state) in __mutex_unlock()
105 m->state = 0; in __mutex_unlock()
107 cpu_spin_unlock_xrestore(&m->spin_lock, old_itr_status); in __mutex_unlock()
109 wq_wake_next(&m->wq, m, fname, lineno); in __mutex_unlock()
112 static void __mutex_unlock_recursive(struct recursive_mutex *m, in __mutex_unlock_recursive() argument
116 assert(m->owner == thread_get_id()); in __mutex_unlock_recursive()
118 if (refcount_dec(&m->lock_depth)) { in __mutex_unlock_recursive()
123 atomic_store_short(&m->owner, THREAD_ID_INVALID); in __mutex_unlock_recursive()
124 __mutex_unlock(&m->m, fname, lineno); in __mutex_unlock_recursive()
128 static bool __mutex_trylock(struct mutex *m, const char *fname __unused, in __mutex_trylock() argument
137 old_itr_status = cpu_spin_lock_xsave(&m->spin_lock); in __mutex_trylock()
139 can_lock_write = !m->state; in __mutex_trylock()
141 m->state = -1; in __mutex_trylock()
143 cpu_spin_unlock_xrestore(&m->spin_lock, old_itr_status); in __mutex_trylock()
146 mutex_trylock_check(m); in __mutex_trylock()
151 static void __mutex_read_unlock(struct mutex *m, const char *fname, int lineno) in __mutex_read_unlock() argument
159 old_itr_status = cpu_spin_lock_xsave(&m->spin_lock); in __mutex_read_unlock()
161 if (m->state <= 0) in __mutex_read_unlock()
163 m->state--; in __mutex_read_unlock()
164 new_state = m->state; in __mutex_read_unlock()
166 cpu_spin_unlock_xrestore(&m->spin_lock, old_itr_status); in __mutex_read_unlock()
170 wq_wake_next(&m->wq, m, fname, lineno); in __mutex_read_unlock()
173 static void __mutex_read_lock(struct mutex *m, const char *fname, int lineno) in __mutex_read_lock() argument
193 old_itr_status = cpu_spin_lock_xsave(&m->spin_lock); in __mutex_read_lock()
195 can_lock = m->state != -1; in __mutex_read_lock()
197 wq_wait_init(&m->wq, &wqe, true /* wait_read */); in __mutex_read_lock()
199 m->state++; /* read_locked */ in __mutex_read_lock()
202 cpu_spin_unlock_xrestore(&m->spin_lock, old_itr_status); in __mutex_read_lock()
209 wq_wait_final(&m->wq, &wqe, 0, m, fname, lineno); in __mutex_read_lock()
215 static bool __mutex_read_trylock(struct mutex *m, const char *fname __unused, in __mutex_read_trylock() argument
225 old_itr_status = cpu_spin_lock_xsave(&m->spin_lock); in __mutex_read_trylock()
227 can_lock = m->state != -1; in __mutex_read_trylock()
229 m->state++; in __mutex_read_trylock()
231 cpu_spin_unlock_xrestore(&m->spin_lock, old_itr_status); in __mutex_read_trylock()
237 void mutex_unlock_debug(struct mutex *m, const char *fname, int lineno) in mutex_unlock_debug() argument
239 __mutex_unlock(m, fname, lineno); in mutex_unlock_debug()
242 void mutex_lock_debug(struct mutex *m, const char *fname, int lineno) in mutex_lock_debug() argument
244 __mutex_lock(m, fname, lineno); in mutex_lock_debug()
247 bool mutex_trylock_debug(struct mutex *m, const char *fname, int lineno) in mutex_trylock_debug() argument
249 return __mutex_trylock(m, fname, lineno); in mutex_trylock_debug()
252 void mutex_read_unlock_debug(struct mutex *m, const char *fname, int lineno) in mutex_read_unlock_debug() argument
254 __mutex_read_unlock(m, fname, lineno); in mutex_read_unlock_debug()
257 void mutex_read_lock_debug(struct mutex *m, const char *fname, int lineno) in mutex_read_lock_debug() argument
259 __mutex_read_lock(m, fname, lineno); in mutex_read_lock_debug()
262 bool mutex_read_trylock_debug(struct mutex *m, const char *fname, int lineno) in mutex_read_trylock_debug() argument
264 return __mutex_read_trylock(m, fname, lineno); in mutex_read_trylock_debug()
267 void mutex_unlock_recursive_debug(struct recursive_mutex *m, const char *fname, in mutex_unlock_recursive_debug() argument
270 __mutex_unlock_recursive(m, fname, lineno); in mutex_unlock_recursive_debug()
273 void mutex_lock_recursive_debug(struct recursive_mutex *m, const char *fname, in mutex_lock_recursive_debug() argument
276 __mutex_lock_recursive(m, fname, lineno); in mutex_lock_recursive_debug()
279 void mutex_unlock(struct mutex *m) in mutex_unlock() argument
281 __mutex_unlock(m, NULL, -1); in mutex_unlock()
284 void mutex_unlock_recursive(struct recursive_mutex *m) in mutex_unlock_recursive() argument
286 __mutex_unlock_recursive(m, NULL, -1); in mutex_unlock_recursive()
289 void mutex_lock(struct mutex *m) in mutex_lock() argument
291 __mutex_lock(m, NULL, -1); in mutex_lock()
294 void mutex_lock_recursive(struct recursive_mutex *m) in mutex_lock_recursive() argument
296 __mutex_lock_recursive(m, NULL, -1); in mutex_lock_recursive()
299 bool mutex_trylock(struct mutex *m) in mutex_trylock() argument
301 return __mutex_trylock(m, NULL, -1); in mutex_trylock()
304 void mutex_read_unlock(struct mutex *m) in mutex_read_unlock() argument
306 __mutex_read_unlock(m, NULL, -1); in mutex_read_unlock()
309 void mutex_read_lock(struct mutex *m) in mutex_read_lock() argument
311 __mutex_read_lock(m, NULL, -1); in mutex_read_lock()
314 bool mutex_read_trylock(struct mutex *m) in mutex_read_trylock() argument
316 return __mutex_read_trylock(m, NULL, -1); in mutex_read_trylock()
320 void mutex_destroy(struct mutex *m) in mutex_destroy() argument
326 if (m->state) in mutex_destroy()
328 if (!wq_is_empty(&m->wq)) in mutex_destroy()
330 mutex_destroy_check(m); in mutex_destroy()
333 void mutex_destroy_recursive(struct recursive_mutex *m) in mutex_destroy_recursive() argument
335 mutex_destroy(&m->m); in mutex_destroy_recursive()
338 unsigned int mutex_get_recursive_lock_depth(struct recursive_mutex *m) in mutex_get_recursive_lock_depth() argument
341 assert(m->owner == thread_get_id()); in mutex_get_recursive_lock_depth()
343 return refcount_val(&m->lock_depth); in mutex_get_recursive_lock_depth()
346 void mutex_pm_aware_init(struct mutex_pm_aware *m) in mutex_pm_aware_init() argument
348 *m = (struct mutex_pm_aware)MUTEX_PM_AWARE_INITIALIZER; in mutex_pm_aware_init()
351 void mutex_pm_aware_destroy(struct mutex_pm_aware *m) in mutex_pm_aware_destroy() argument
353 mutex_destroy(&m->mutex); in mutex_pm_aware_destroy()
356 void mutex_pm_aware_lock(struct mutex_pm_aware *m) in mutex_pm_aware_lock() argument
359 if (!cpu_spin_trylock(&m->lock) || m->mutex.state) in mutex_pm_aware_lock()
362 mutex_lock(&m->mutex); in mutex_pm_aware_lock()
363 if (!thread_spin_trylock(&m->lock)) in mutex_pm_aware_lock()
368 void mutex_pm_aware_unlock(struct mutex_pm_aware *m) in mutex_pm_aware_unlock() argument
371 assert(!m->mutex.state); in mutex_pm_aware_unlock()
372 cpu_spin_unlock(&m->lock); in mutex_pm_aware_unlock()
374 thread_spin_unlock(&m->lock); in mutex_pm_aware_unlock()
375 mutex_unlock(&m->mutex); in mutex_pm_aware_unlock()
386 if (cv->m && wq_have_condvar(&cv->m->wq, cv)) in condvar_destroy()
396 struct mutex *m; in cv_signal() local
399 m = cv->m; in cv_signal()
402 if (m) in cv_signal()
403 wq_promote_condvar(&m->wq, cv, only_one, m, fname, lineno); in cv_signal()
430 static TEE_Result __condvar_wait_timeout(struct condvar *cv, struct mutex *m, in __condvar_wait_timeout() argument
440 mutex_unlock_check(m); in __condvar_wait_timeout()
444 if (cv->m && cv->m != m) in __condvar_wait_timeout()
447 cv->m = m; in __condvar_wait_timeout()
450 cpu_spin_lock(&m->spin_lock); in __condvar_wait_timeout()
452 if (!m->state) in __condvar_wait_timeout()
454 old_state = m->state; in __condvar_wait_timeout()
456 wq_wait_init_condvar(&m->wq, &wqe, cv, m->state > 0); in __condvar_wait_timeout()
458 if (m->state > 1) { in __condvar_wait_timeout()
460 m->state--; in __condvar_wait_timeout()
463 m->state = 0; in __condvar_wait_timeout()
465 new_state = m->state; in __condvar_wait_timeout()
467 cpu_spin_unlock_xrestore(&m->spin_lock, old_itr_status); in __condvar_wait_timeout()
471 wq_wake_next(&m->wq, m, fname, lineno); in __condvar_wait_timeout()
473 res = wq_wait_final(&m->wq, &wqe, timeout_ms, m, fname, lineno); in __condvar_wait_timeout()
476 mutex_read_lock(m); in __condvar_wait_timeout()
478 mutex_lock(m); in __condvar_wait_timeout()
484 void condvar_wait_debug(struct condvar *cv, struct mutex *m, in condvar_wait_debug() argument
487 __condvar_wait_timeout(cv, m, 0, fname, lineno); in condvar_wait_debug()
490 TEE_Result condvar_wait_timeout_debug(struct condvar *cv, struct mutex *m, in condvar_wait_timeout_debug() argument
494 return __condvar_wait_timeout(cv, m, timeout_ms, fname, lineno); in condvar_wait_timeout_debug()
497 void condvar_wait(struct condvar *cv, struct mutex *m) in condvar_wait() argument
499 __condvar_wait_timeout(cv, m, 0, NULL, -1); in condvar_wait()
502 TEE_Result condvar_wait_timeout(struct condvar *cv, struct mutex *m, in condvar_wait_timeout() argument
505 return __condvar_wait_timeout(cv, m, timeout_ms, NULL, -1); in condvar_wait_timeout()