diff --git a/qdf/inc/qdf_lock.h b/qdf/inc/qdf_lock.h index eb7efd608c..50d3d5b918 100644 --- a/qdf/inc/qdf_lock.h +++ b/qdf/inc/qdf_lock.h @@ -50,6 +50,8 @@ struct lock_stats {}; #define BEFORE_LOCK(x...) do {} while (0) #define AFTER_LOCK(x...) do {} while (0) +#define BEFORE_TRYLOCK(x...) do {} while (0) +#define AFTER_TRYLOCK(x...) do {} while (0) #define BEFORE_UNLOCK(x...) do {} while (0) #define qdf_lock_stats_create(x...) do {} while (0) #define qdf_lock_stats_destroy(x...) do {} while (0) @@ -71,7 +73,7 @@ struct lock_stats { #define LARGE_CONTENTION QDF_LOG_TIMESTAMP_CYCLES_PER_10_US #define BEFORE_LOCK(lock, was_locked) \ -{ \ +do { \ uint64_t BEFORE_LOCK_time; \ uint64_t AFTER_LOCK_time; \ bool BEFORE_LOCK_is_locked = was_locked; \ @@ -99,7 +101,24 @@ struct lock_stats { lock->stats.max_contention_wait) \ lock->stats.max_contention_wait = \ AFTER_LOCK_time - BEFORE_LOCK_time; \ -} +} while (0) + +#define BEFORE_TRYLOCK(lock) \ +do { \ + uint64_t BEFORE_LOCK_time; \ + uint64_t AFTER_LOCK_time; \ + BEFORE_LOCK_time = qdf_get_log_timestamp(); \ + do {} while (0) + +#define AFTER_TRYLOCK(lock, trylock_return) \ + AFTER_LOCK_time = qdf_get_log_timestamp(); \ + if (trylock_return) { \ + lock->stats.acquired++; \ + lock->stats.last_acquired = AFTER_LOCK_time; \ + lock->stats.non_contention_time += \ + (AFTER_LOCK_time - BEFORE_LOCK_time); \ + } \ +} while (0) /* max_hold_time in US */ #define BEFORE_UNLOCK(lock, max_hold_time) \ @@ -121,8 +140,6 @@ do {\ } \ } while (0) - - static inline void qdf_lock_stats_destroy(struct lock_stats *stats) { if (QDF_LOCK_STATS_DESTROY_PRINT) { @@ -239,7 +256,12 @@ static inline int qdf_spin_is_locked(qdf_spinlock_t *lock) */ static inline int qdf_spin_trylock_bh(qdf_spinlock_t *lock) { - return __qdf_spin_trylock_bh(&lock->lock); + int trylock_return; + BEFORE_TRYLOCK(lock); + trylock_return = __qdf_spin_trylock_bh(&lock->lock); + AFTER_TRYLOCK(lock, trylock_return); + + return trylock_return; } int qdf_spin_trylock_bh_outline(qdf_spinlock_t *lock);