summaryrefslogtreecommitdiff
path: root/qdf/linux/src
diff options
context:
space:
mode:
authorHouston Hoffman <hhoffman@codeaurora.org>2016-11-16 12:40:04 -0800
committerqcabuildsw <qcabuildsw@localhost>2017-01-04 14:53:57 -0800
commit58a41f7430f2b6321b30eb543ba1acc14e836b84 (patch)
tree094a88e0207bb5ba8163dfe3dd375575ede2ca29 /qdf/linux/src
parentb6fb82d3bd77f291be53617feab2cc0c410ea5b1 (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.h2
-rw-r--r--qdf/linux/src/qdf_lock.c14
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;