diff options
| author | Houston Hoffman <hhoffman@codeaurora.org> | 2016-11-16 12:40:04 -0800 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2017-01-04 14:53:57 -0800 |
| commit | 58a41f7430f2b6321b30eb543ba1acc14e836b84 (patch) | |
| tree | 094a88e0207bb5ba8163dfe3dd375575ede2ca29 /qdf/linux/src | |
| parent | b6fb82d3bd77f291be53617feab2cc0c410ea5b1 (diff) | |
qcacmn: add stats to spinlock & mutexes
Wish to profile spinlock & mutex usage.
Bug on when spinlock is being used to protect
large regions of time.
(1mS for irq disabled, 5mS for bh disabled,
5ms for regular spinlock).
Change-Id: I95190a0d3d407a91a869f9f015e61d75e80830a7
CRs-Fixed: 1100505
Diffstat (limited to 'qdf/linux/src')
| -rw-r--r-- | qdf/linux/src/i_qdf_lock.h | 2 | ||||
| -rw-r--r-- | qdf/linux/src/qdf_lock.c | 14 |
2 files changed, 13 insertions, 3 deletions
diff --git a/qdf/linux/src/i_qdf_lock.h b/qdf/linux/src/i_qdf_lock.h index 53725f8ec531..d062db2f191a 100644 --- a/qdf/linux/src/i_qdf_lock.h +++ b/qdf/linux/src/i_qdf_lock.h @@ -68,6 +68,7 @@ enum { * @process_id: Process ID to track lock * @state: Lock status * @refcount: Reference count for recursive lock + * @stats: a structure that contains usage statistics */ struct qdf_lock_s { struct mutex m_lock; @@ -75,6 +76,7 @@ struct qdf_lock_s { int process_id; uint32_t state; uint8_t refcount; + struct lock_stats stats; }; typedef struct qdf_lock_s __qdf_mutex_t; diff --git a/qdf/linux/src/qdf_lock.c b/qdf/linux/src/qdf_lock.c index adaee6beaeba..08dcc8df7695 100644 --- a/qdf/linux/src/qdf_lock.c +++ b/qdf/linux/src/qdf_lock.c @@ -48,7 +48,8 @@ typedef __qdf_mutex_t qdf_mutex_t; * =0 success * else fail status */ -QDF_STATUS qdf_mutex_create(qdf_mutex_t *lock) +#undef qdf_mutex_create +QDF_STATUS qdf_mutex_create(qdf_mutex_t *lock, const char *func, int line) { /* check for invalid pointer */ if (lock == NULL) { @@ -70,6 +71,8 @@ QDF_STATUS qdf_mutex_create(qdf_mutex_t *lock) return QDF_STATUS_E_FAULT; } + qdf_lock_stats_create(&lock->stats, func, line); + /* initialize new lock */ mutex_init(&lock->m_lock); lock->cookie = LINUX_LOCK_COOKIE; @@ -128,8 +131,11 @@ QDF_STATUS qdf_mutex_acquire(qdf_mutex_t *lock) #endif return QDF_STATUS_SUCCESS; } + + BEFORE_LOCK(lock, mutex_is_locked(&lock->m_lock)); /* acquire a Lock */ mutex_lock(&lock->m_lock); + AFTER_LOCK(lock); rc = mutex_is_locked(&lock->m_lock); if (rc == 0) { QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, @@ -227,6 +233,7 @@ QDF_STATUS qdf_mutex_release(qdf_mutex_t *lock) lock->refcount = 0; lock->state = LOCK_RELEASED; /* release a Lock */ + BEFORE_UNLOCK(lock, 0); mutex_unlock(&lock->m_lock); #ifdef QDF_NESTED_LOCK_DEBUG QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, "%s: Freeing lock %x %d %d", lock, lock->process_id, @@ -555,7 +562,7 @@ EXPORT_SYMBOL(qdf_runtime_lock_deinit); */ QDF_STATUS qdf_spinlock_acquire(qdf_spinlock_t *lock) { - spin_lock(&lock->spinlock); + spin_lock(&lock->lock.spinlock); return QDF_STATUS_SUCCESS; } EXPORT_SYMBOL(qdf_spinlock_acquire); @@ -570,7 +577,7 @@ EXPORT_SYMBOL(qdf_spinlock_acquire); */ QDF_STATUS qdf_spinlock_release(qdf_spinlock_t *lock) { - spin_unlock(&lock->spinlock); + spin_unlock(&lock->lock.spinlock); return QDF_STATUS_SUCCESS; } EXPORT_SYMBOL(qdf_spinlock_release); @@ -627,6 +634,7 @@ QDF_STATUS qdf_mutex_destroy(qdf_mutex_t *lock) lock->process_id = 0; lock->refcount = 0; + qdf_lock_stats_destroy(&lock->stats); mutex_unlock(&lock->m_lock); return QDF_STATUS_SUCCESS; |
