Lines Matching refs:lockcnt

32 void qemu_lockcnt_init(QemuLockCnt *lockcnt)  in qemu_lockcnt_init()  argument
34 lockcnt->count = 0; in qemu_lockcnt_init()
37 void qemu_lockcnt_destroy(QemuLockCnt *lockcnt) in qemu_lockcnt_destroy() argument
57 static bool qemu_lockcnt_cmpxchg_or_wait(QemuLockCnt *lockcnt, int *val, in qemu_lockcnt_cmpxchg_or_wait() argument
64 trace_lockcnt_fast_path_attempt(lockcnt, expected, new_if_free); in qemu_lockcnt_cmpxchg_or_wait()
65 *val = qatomic_cmpxchg(&lockcnt->count, expected, new_if_free); in qemu_lockcnt_cmpxchg_or_wait()
67 trace_lockcnt_fast_path_success(lockcnt, expected, new_if_free); in qemu_lockcnt_cmpxchg_or_wait()
84 trace_lockcnt_futex_wait_prepare(lockcnt, expected, new); in qemu_lockcnt_cmpxchg_or_wait()
85 *val = qatomic_cmpxchg(&lockcnt->count, expected, new); in qemu_lockcnt_cmpxchg_or_wait()
94 trace_lockcnt_futex_wait(lockcnt, *val); in qemu_lockcnt_cmpxchg_or_wait()
95 qemu_futex_wait(&lockcnt->count, *val); in qemu_lockcnt_cmpxchg_or_wait()
96 *val = qatomic_read(&lockcnt->count); in qemu_lockcnt_cmpxchg_or_wait()
97 trace_lockcnt_futex_wait_resume(lockcnt, *val); in qemu_lockcnt_cmpxchg_or_wait()
106 static void lockcnt_wake(QemuLockCnt *lockcnt) in lockcnt_wake() argument
108 trace_lockcnt_futex_wake(lockcnt); in lockcnt_wake()
109 qemu_futex_wake(&lockcnt->count, 1); in lockcnt_wake()
112 void qemu_lockcnt_inc(QemuLockCnt *lockcnt) in qemu_lockcnt_inc() argument
114 int val = qatomic_read(&lockcnt->count); in qemu_lockcnt_inc()
120 val = qatomic_cmpxchg(&lockcnt->count, val, in qemu_lockcnt_inc()
127 if (qemu_lockcnt_cmpxchg_or_wait(lockcnt, &val, QEMU_LOCKCNT_COUNT_STEP, in qemu_lockcnt_inc()
141 lockcnt_wake(lockcnt); in qemu_lockcnt_inc()
145 void qemu_lockcnt_dec(QemuLockCnt *lockcnt) in qemu_lockcnt_dec() argument
147 qatomic_sub(&lockcnt->count, QEMU_LOCKCNT_COUNT_STEP); in qemu_lockcnt_dec()
154 bool qemu_lockcnt_dec_and_lock(QemuLockCnt *lockcnt) in qemu_lockcnt_dec_and_lock() argument
156 int val = qatomic_read(&lockcnt->count); in qemu_lockcnt_dec_and_lock()
163 val = qatomic_cmpxchg(&lockcnt->count, val, in qemu_lockcnt_dec_and_lock()
172 if (qemu_lockcnt_cmpxchg_or_wait(lockcnt, &val, locked_state, &waited)) { in qemu_lockcnt_dec_and_lock()
192 lockcnt_wake(lockcnt); in qemu_lockcnt_dec_and_lock()
203 bool qemu_lockcnt_dec_if_lock(QemuLockCnt *lockcnt) in qemu_lockcnt_dec_if_lock() argument
205 int val = qatomic_read(&lockcnt->count); in qemu_lockcnt_dec_if_lock()
213 if (qemu_lockcnt_cmpxchg_or_wait(lockcnt, &val, locked_state, &waited)) { in qemu_lockcnt_dec_if_lock()
232 lockcnt_wake(lockcnt); in qemu_lockcnt_dec_if_lock()
237 void qemu_lockcnt_lock(QemuLockCnt *lockcnt) in qemu_lockcnt_lock() argument
239 int val = qatomic_read(&lockcnt->count); in qemu_lockcnt_lock()
247 while (!qemu_lockcnt_cmpxchg_or_wait(lockcnt, &val, val + step, &waited)) { in qemu_lockcnt_lock()
257 void qemu_lockcnt_inc_and_unlock(QemuLockCnt *lockcnt) in qemu_lockcnt_inc_and_unlock() argument
261 val = qatomic_read(&lockcnt->count); in qemu_lockcnt_inc_and_unlock()
265 trace_lockcnt_unlock_attempt(lockcnt, val, new); in qemu_lockcnt_inc_and_unlock()
266 val = qatomic_cmpxchg(&lockcnt->count, val, new); in qemu_lockcnt_inc_and_unlock()
269 trace_lockcnt_unlock_success(lockcnt, val, new); in qemu_lockcnt_inc_and_unlock()
271 lockcnt_wake(lockcnt); in qemu_lockcnt_inc_and_unlock()
275 void qemu_lockcnt_unlock(QemuLockCnt *lockcnt) in qemu_lockcnt_unlock() argument
279 val = qatomic_read(&lockcnt->count); in qemu_lockcnt_unlock()
283 trace_lockcnt_unlock_attempt(lockcnt, val, new); in qemu_lockcnt_unlock()
284 val = qatomic_cmpxchg(&lockcnt->count, val, new); in qemu_lockcnt_unlock()
287 trace_lockcnt_unlock_success(lockcnt, val, new); in qemu_lockcnt_unlock()
289 lockcnt_wake(lockcnt); in qemu_lockcnt_unlock()
293 unsigned qemu_lockcnt_count(QemuLockCnt *lockcnt) in qemu_lockcnt_count() argument
295 return qatomic_read(&lockcnt->count) >> QEMU_LOCKCNT_COUNT_SHIFT; in qemu_lockcnt_count()
298 void qemu_lockcnt_init(QemuLockCnt *lockcnt) in qemu_lockcnt_init() argument
300 qemu_mutex_init(&lockcnt->mutex); in qemu_lockcnt_init()
301 lockcnt->count = 0; in qemu_lockcnt_init()
304 void qemu_lockcnt_destroy(QemuLockCnt *lockcnt) in qemu_lockcnt_destroy() argument
306 qemu_mutex_destroy(&lockcnt->mutex); in qemu_lockcnt_destroy()
309 void qemu_lockcnt_inc(QemuLockCnt *lockcnt) in qemu_lockcnt_inc() argument
313 old = qatomic_read(&lockcnt->count); in qemu_lockcnt_inc()
315 qemu_lockcnt_lock(lockcnt); in qemu_lockcnt_inc()
316 qemu_lockcnt_inc_and_unlock(lockcnt); in qemu_lockcnt_inc()
319 if (qatomic_cmpxchg(&lockcnt->count, old, old + 1) == old) { in qemu_lockcnt_inc()
326 void qemu_lockcnt_dec(QemuLockCnt *lockcnt) in qemu_lockcnt_dec() argument
328 qatomic_dec(&lockcnt->count); in qemu_lockcnt_dec()
335 bool qemu_lockcnt_dec_and_lock(QemuLockCnt *lockcnt) in qemu_lockcnt_dec_and_lock() argument
337 int val = qatomic_read(&lockcnt->count); in qemu_lockcnt_dec_and_lock()
339 int old = qatomic_cmpxchg(&lockcnt->count, val, val - 1); in qemu_lockcnt_dec_and_lock()
348 qemu_lockcnt_lock(lockcnt); in qemu_lockcnt_dec_and_lock()
349 if (qatomic_fetch_dec(&lockcnt->count) == 1) { in qemu_lockcnt_dec_and_lock()
353 qemu_lockcnt_unlock(lockcnt); in qemu_lockcnt_dec_and_lock()
363 bool qemu_lockcnt_dec_if_lock(QemuLockCnt *lockcnt) in qemu_lockcnt_dec_if_lock() argument
366 int val = qatomic_read(&lockcnt->count); in qemu_lockcnt_dec_if_lock()
371 qemu_lockcnt_lock(lockcnt); in qemu_lockcnt_dec_if_lock()
372 if (qatomic_fetch_dec(&lockcnt->count) == 1) { in qemu_lockcnt_dec_if_lock()
376 qemu_lockcnt_inc_and_unlock(lockcnt); in qemu_lockcnt_dec_if_lock()
380 void qemu_lockcnt_lock(QemuLockCnt *lockcnt) in qemu_lockcnt_lock() argument
382 qemu_mutex_lock(&lockcnt->mutex); in qemu_lockcnt_lock()
385 void qemu_lockcnt_inc_and_unlock(QemuLockCnt *lockcnt) in qemu_lockcnt_inc_and_unlock() argument
387 qatomic_inc(&lockcnt->count); in qemu_lockcnt_inc_and_unlock()
388 qemu_mutex_unlock(&lockcnt->mutex); in qemu_lockcnt_inc_and_unlock()
391 void qemu_lockcnt_unlock(QemuLockCnt *lockcnt) in qemu_lockcnt_unlock() argument
393 qemu_mutex_unlock(&lockcnt->mutex); in qemu_lockcnt_unlock()
396 unsigned qemu_lockcnt_count(QemuLockCnt *lockcnt) in qemu_lockcnt_count() argument
398 return qatomic_read(&lockcnt->count); in qemu_lockcnt_count()