qcacmn: Add wakeup source tracker

Enable debug for wakeup source tracker.

Change-Id: I28983b5b6cbc15e71753264504e28fccba8a79cc
CRs-Fixed: 2760401
This commit is contained in:
Jingxiang Ge
2020-08-21 13:16:43 +08:00
committed by snandini
parent 28cecde000
commit 759cd74c04
2 changed files with 145 additions and 30 deletions

View File

@@ -487,7 +487,55 @@ static inline int qdf_semaphore_acquire_intr(qdf_semaphore_t *m)
return __qdf_semaphore_acquire_intr(m); return __qdf_semaphore_acquire_intr(m);
} }
QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name); #ifdef WLAN_WAKE_LOCK_DEBUG
/**
* qdf_wake_lock_check_for_leaks() - assert no wake lock leaks
*
* Return: None
*/
void qdf_wake_lock_check_for_leaks(void);
/**
* qdf_wake_lock_feature_init() - global init logic for wake lock
*
* Return: None
*/
void qdf_wake_lock_feature_init(void);
/**
* qdf_wake_lock_feature_deinit() - global de-init logic for wake lock
*
* Return: None
*/
void qdf_wake_lock_feature_deinit(void);
#else
static inline void qdf_wake_lock_check_for_leaks(void) { }
static inline void qdf_wake_lock_feature_init(void) { }
static inline void qdf_wake_lock_feature_deinit(void) { }
#endif /* WLAN_WAKE_LOCK_DEBUG */
/**
* __qdf_wake_lock_create() - initialize a wake lock
* @lock: The wake lock to initialize
* @name: Name of wake lock
* @func: caller function
* @line: caller line
* Return:
* QDF status success: if wake lock is initialized
* QDF status failure: if wake lock was not initialized
*/
QDF_STATUS __qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name,
const char *func, uint32_t line);
/**
* qdf_wake_lock_create() - initialized a wakeup source lock
* @lock: the wakeup source lock to initialize
* @name: the name of wakeup source lock
*
* Return: QDF_STATUS
*/
#define qdf_wake_lock_create(lock, name) \
__qdf_wake_lock_create(lock, name, __func__, __LINE__)
QDF_STATUS qdf_wake_lock_acquire(qdf_wake_lock_t *lock, uint32_t reason); QDF_STATUS qdf_wake_lock_acquire(qdf_wake_lock_t *lock, uint32_t reason);
@@ -497,7 +545,25 @@ QDF_STATUS qdf_wake_lock_timeout_acquire(qdf_wake_lock_t *lock,
QDF_STATUS qdf_wake_lock_release(qdf_wake_lock_t *lock, uint32_t reason); QDF_STATUS qdf_wake_lock_release(qdf_wake_lock_t *lock, uint32_t reason);
QDF_STATUS qdf_wake_lock_destroy(qdf_wake_lock_t *lock); /**
* __qdf_wake_lock_destroy() - destroy a wake lock
* @lock: The wake lock to destroy
* @func: caller function
* @line: caller line
*
* Return: None
*/
void __qdf_wake_lock_destroy(qdf_wake_lock_t *lock,
const char *func, uint32_t line);
/**
* qdf_wake_lock_destroy() - deinitialize a wakeup source lock
* @lock: the wakeup source lock to de-initialize
*
* Return: None
*/
#define qdf_wake_lock_destroy(lock) \
__qdf_wake_lock_destroy(lock, __func__, __LINE__)
void qdf_pm_system_wakeup(void); void qdf_pm_system_wakeup(void);

View File

@@ -233,6 +233,54 @@ QDF_STATUS qdf_mutex_release(qdf_mutex_t *lock)
} }
qdf_export_symbol(qdf_mutex_release); qdf_export_symbol(qdf_mutex_release);
#ifdef WLAN_WAKE_LOCK_DEBUG
#include "qdf_tracker.h"
#define qdf_wake_lock_tracker_bits 2 /* 4 buckets */
static qdf_tracker_declare(qdf_wake_lock_tracker, qdf_wake_lock_tracker_bits,
"wake lock leaks", "wake lock create",
"wake lock destroy");
void qdf_wake_lock_feature_init(void)
{
qdf_tracker_init(&qdf_wake_lock_tracker);
}
void qdf_wake_lock_feature_deinit(void)
{
qdf_tracker_deinit(&qdf_wake_lock_tracker);
}
void qdf_wake_lock_check_for_leaks(void)
{
qdf_tracker_check_for_leaks(&qdf_wake_lock_tracker);
}
static inline QDF_STATUS qdf_wake_lock_dbg_track(qdf_wake_lock_t *lock,
const char *func,
uint32_t line)
{
return qdf_tracker_track(&qdf_wake_lock_tracker, lock, func, line);
}
static inline void qdf_wake_lock_dbg_untrack(qdf_wake_lock_t *lock,
const char *func, uint32_t line)
{
qdf_tracker_untrack(&qdf_wake_lock_tracker, lock, func, line);
}
#else
static inline QDF_STATUS qdf_wake_lock_dbg_track(qdf_wake_lock_t *lock,
const char *func,
uint32_t line)
{
return QDF_STATUS_SUCCESS;
}
static inline void qdf_wake_lock_dbg_untrack(qdf_wake_lock_t *lock,
const char *func, uint32_t line)
{ }
#endif /* WLAN_WAKE_LOCK_DEBUG */
/** /**
* qdf_wake_lock_name() - This function returns the name of the wakelock * qdf_wake_lock_name() - This function returns the name of the wakelock
* @lock: Pointer to the wakelock * @lock: Pointer to the wakelock
@@ -256,19 +304,17 @@ const char *qdf_wake_lock_name(qdf_wake_lock_t *lock)
#endif #endif
qdf_export_symbol(qdf_wake_lock_name); qdf_export_symbol(qdf_wake_lock_name);
/**
* qdf_wake_lock_create() - initializes a wake lock
* @lock: The wake lock to initialize
* @name: Name of wake lock
*
* Return:
* QDF status success: if wake lock is initialized
* QDF status failure: if wake lock was not initialized
*/
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 110)) || \ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 110)) || \
defined(WAKEUP_SOURCE_DEV) defined(WAKEUP_SOURCE_DEV)
QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name) QDF_STATUS __qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name,
const char *func, uint32_t line)
{ {
QDF_STATUS status;
status = qdf_wake_lock_dbg_track(lock, func, line);
if (QDF_IS_STATUS_ERROR(status))
return status;
qdf_mem_zero(lock, sizeof(*lock)); qdf_mem_zero(lock, sizeof(*lock));
lock->priv = wakeup_source_register(lock->lock.dev, name); lock->priv = wakeup_source_register(lock->lock.dev, name);
if (!(lock->priv)) { if (!(lock->priv)) {
@@ -281,19 +327,28 @@ QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name)
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name) QDF_STATUS __qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name,
const char *func, uint32_t line)
{ {
QDF_STATUS status;
status = qdf_wake_lock_dbg_track(lock, func, line);
if (QDF_IS_STATUS_ERROR(status))
return status;
wakeup_source_init(&(lock->lock), name); wakeup_source_init(&(lock->lock), name);
lock->priv = &(lock->lock); lock->priv = &(lock->lock);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
#else #else
QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name) QDF_STATUS __qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name,
const char *func, uint32_t line)
{ {
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
#endif #endif
qdf_export_symbol(qdf_wake_lock_create); qdf_export_symbol(__qdf_wake_lock_create);
/** /**
* qdf_wake_lock_acquire() - acquires a wake lock * qdf_wake_lock_acquire() - acquires a wake lock
@@ -381,34 +436,28 @@ QDF_STATUS qdf_wake_lock_release(qdf_wake_lock_t *lock, uint32_t reason)
#endif #endif
qdf_export_symbol(qdf_wake_lock_release); qdf_export_symbol(qdf_wake_lock_release);
/**
* qdf_wake_lock_destroy() - destroys a wake lock
* @lock: The wake lock to destroy
*
* Return:
* QDF status success: if wake lock is acquired
* QDF status failure: if wake lock was not acquired
*/
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 110)) || \ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 110)) || \
defined(WAKEUP_SOURCE_DEV) defined(WAKEUP_SOURCE_DEV)
QDF_STATUS qdf_wake_lock_destroy(qdf_wake_lock_t *lock) void __qdf_wake_lock_destroy(qdf_wake_lock_t *lock,
const char *func, uint32_t line)
{ {
wakeup_source_unregister(lock->priv); wakeup_source_unregister(lock->priv);
return QDF_STATUS_SUCCESS; qdf_wake_lock_dbg_untrack(lock, func, line);
} }
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
QDF_STATUS qdf_wake_lock_destroy(qdf_wake_lock_t *lock) void __qdf_wake_lock_destroy(qdf_wake_lock_t *lock,
const char *func, uint32_t line)
{ {
wakeup_source_trash(&(lock->lock)); wakeup_source_trash(&(lock->lock));
return QDF_STATUS_SUCCESS; qdf_wake_lock_dbg_untrack(lock, func, line);
} }
#else #else
QDF_STATUS qdf_wake_lock_destroy(qdf_wake_lock_t *lock) void __qdf_wake_lock_destroy(qdf_wake_lock_t *lock,
const char *func, uint32_t line)
{ {
return QDF_STATUS_SUCCESS;
} }
#endif #endif
qdf_export_symbol(qdf_wake_lock_destroy); qdf_export_symbol(__qdf_wake_lock_destroy);
/** /**
* qdf_pm_system_wakeup() - wakeup system * qdf_pm_system_wakeup() - wakeup system