qcacmn: Move peer ref id debug support under compile flag

ref id debug support adds an array of atomic_t to peer object which
significantly increases peer object size. Move this debug support
under compile time flag WLAN_OBJMGR_REF_ID_DEBUG to save memory.

Change-Id: I9c14e23078a702419a15ad79eb384cc6727a5ef3
CRs-Fixed: 2293170
This commit is contained in:
Om Prakash Tripathi
2018-08-02 18:25:35 +05:30
committato da Nitesh Shrivastav
parent 14b27a774b
commit bf3428b207
3 ha cambiato i file con 145 aggiunte e 32 eliminazioni

Vedi File

@@ -147,7 +147,9 @@ struct wlan_objmgr_peer_mlme {
struct wlan_objmgr_peer_objmgr {
struct wlan_objmgr_vdev *vdev;
qdf_atomic_t ref_cnt;
#ifdef WLAN_OBJMGR_REF_ID_DEBUG
qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
#endif
uint8_t print_cnt;
};
@@ -1036,4 +1038,25 @@ static inline void wlan_peer_set_pdev_id(struct wlan_objmgr_peer *peer,
peer->pdev_id = pdev_id;
}
/**
* wlan_objmgr_print_peer_ref_ids() - print peer object refs
* @peer: peer object pointer
* @log_level: log level
*
* Return: void
*/
void wlan_objmgr_print_peer_ref_ids(struct wlan_objmgr_peer *peer,
QDF_TRACE_LEVEL log_level);
/**
* wlan_objmgr_peer_get_comp_ref_cnt() - get component ref count for a peer
* @peer: peer object pointer
* @id: component id
*
* Return: uint32_t
*/
uint32_t
wlan_objmgr_peer_get_comp_ref_cnt(struct wlan_objmgr_peer *peer,
enum wlan_umac_comp_id id);
#endif /* _WLAN_OBJMGR_PEER_OBJ_H_*/

Vedi File

@@ -132,6 +132,20 @@ static QDF_STATUS wlan_objmgr_peer_obj_free(struct wlan_objmgr_peer *peer)
}
#ifdef WLAN_OBJMGR_REF_ID_DEBUG
static void
wlan_objmgr_peer_init_ref_id_debug(struct wlan_objmgr_peer *peer)
{
uint8_t id;
for (id = 0; id < WLAN_REF_ID_MAX; id++)
qdf_atomic_init(&peer->peer_objmgr.ref_id_dbg[id]);
}
#else
static inline void
wlan_objmgr_peer_init_ref_id_debug(struct wlan_objmgr_peer *peer) {}
#endif
struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
struct wlan_objmgr_vdev *vdev,
enum wlan_peer_type type,
@@ -172,8 +186,7 @@ struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
}
peer->obj_state = WLAN_OBJ_STATE_ALLOCATED;
qdf_atomic_init(&peer->peer_objmgr.ref_cnt);
for (id = 0; id < WLAN_REF_ID_MAX; id++)
qdf_atomic_init(&peer->peer_objmgr.ref_id_dbg[id]);
wlan_objmgr_peer_init_ref_id_debug(peer);
wlan_objmgr_peer_get_ref(peer, WLAN_OBJMGR_ID);
/* set vdev to peer */
wlan_peer_set_vdev(peer, vdev);
@@ -330,8 +343,7 @@ QDF_STATUS wlan_objmgr_peer_obj_delete(struct wlan_objmgr_peer *peer)
QDF_MAC_ADDR_ARRAY(macaddr));
print_idx = qdf_get_pidx();
wlan_objmgr_print_ref_ids(peer->peer_objmgr.ref_id_dbg,
QDF_TRACE_LEVEL_DEBUG);
wlan_objmgr_print_peer_ref_ids(peer, QDF_TRACE_LEVEL_DEBUG);
/**
* Update VDEV object state to LOGICALLY DELETED
* It prevents further access of this object
@@ -574,8 +586,21 @@ void *wlan_objmgr_peer_get_comp_private_obj(
}
qdf_export_symbol(wlan_objmgr_peer_get_comp_private_obj);
#ifdef WLAN_OBJMGR_REF_ID_DEBUG
static inline void
wlan_objmgr_peer_get_debug_id_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id)
{
qdf_atomic_inc(&peer->peer_objmgr.ref_id_dbg[id]);
}
#else
static inline void
wlan_objmgr_peer_get_debug_id_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id) {}
#endif
void wlan_objmgr_peer_get_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id)
wlan_objmgr_ref_dbgid id)
{
if (peer == NULL) {
obj_mgr_err("peer obj is NULL for %d", id);
@@ -584,7 +609,7 @@ void wlan_objmgr_peer_get_ref(struct wlan_objmgr_peer *peer,
}
/* Increment ref count */
qdf_atomic_inc(&peer->peer_objmgr.ref_cnt);
qdf_atomic_inc(&peer->peer_objmgr.ref_id_dbg[id]);
wlan_objmgr_peer_get_debug_id_ref(peer, id);
return;
}
@@ -622,20 +647,14 @@ QDF_STATUS wlan_objmgr_peer_try_get_ref(struct wlan_objmgr_peer *peer,
}
qdf_export_symbol(wlan_objmgr_peer_try_get_ref);
void wlan_objmgr_peer_release_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id)
#ifdef WLAN_OBJMGR_REF_ID_DEBUG
static void
wlan_objmgr_peer_release_debug_id_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id)
{
uint8_t *macaddr;
if (peer == NULL) {
obj_mgr_err("peer obj is NULL for %d", id);
QDF_ASSERT(0);
return;
}
macaddr = wlan_peer_get_macaddr(peer);
if (!qdf_atomic_read(&peer->peer_objmgr.ref_id_dbg[id])) {
obj_mgr_err(
"peer(%02x:%02x:%02x:%02x:%02x:%02x) ref was not taken by %d",
@@ -646,6 +665,27 @@ void wlan_objmgr_peer_release_ref(struct wlan_objmgr_peer *peer,
WLAN_OBJMGR_BUG(0);
}
qdf_atomic_dec(&peer->peer_objmgr.ref_id_dbg[id]);
}
#else
static inline void
wlan_objmgr_peer_release_debug_id_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id) {}
#endif
void wlan_objmgr_peer_release_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id)
{
uint8_t *macaddr;
if (!peer) {
obj_mgr_err("peer obj is NULL for %d", id);
QDF_ASSERT(0);
return;
}
macaddr = wlan_peer_get_macaddr(peer);
if (!qdf_atomic_read(&peer->peer_objmgr.ref_cnt)) {
obj_mgr_err("peer(%02x:%02x:%02x:%02x:%02x:%02x) ref cnt is 0",
macaddr[0], macaddr[1], macaddr[2],
@@ -653,7 +693,7 @@ void wlan_objmgr_peer_release_ref(struct wlan_objmgr_peer *peer,
WLAN_OBJMGR_BUG(0);
return;
}
qdf_atomic_dec(&peer->peer_objmgr.ref_id_dbg[id]);
wlan_objmgr_peer_release_debug_id_ref(peer, id);
/* Provide synchronization from the access to add peer
* to logically deleted peer list.
@@ -860,3 +900,36 @@ struct wlan_objmgr_peer *wlan_peer_get_next_peer_of_psoc_ref(
return peer_next;
}
#ifdef WLAN_OBJMGR_REF_ID_DEBUG
void
wlan_objmgr_print_peer_ref_ids(struct wlan_objmgr_peer *peer,
QDF_TRACE_LEVEL log_level)
{
wlan_objmgr_print_ref_ids(peer->peer_objmgr.ref_id_dbg, log_level);
}
uint32_t
wlan_objmgr_peer_get_comp_ref_cnt(struct wlan_objmgr_peer *peer,
enum wlan_umac_comp_id id)
{
return qdf_atomic_read(&peer->peer_objmgr.ref_id_dbg[id]);
}
#else
void
wlan_objmgr_print_peer_ref_ids(struct wlan_objmgr_peer *peer,
QDF_TRACE_LEVEL log_level)
{
uint32_t pending_ref;
pending_ref = qdf_atomic_read(&peer->peer_objmgr.ref_cnt);
obj_mgr_log_level(log_level, "Pending refs -- %d", pending_ref);
}
uint32_t
wlan_objmgr_peer_get_comp_ref_cnt(struct wlan_objmgr_peer *peer,
enum wlan_umac_comp_id id)
{
return 0;
}
#endif

Vedi File

@@ -1935,8 +1935,7 @@ static void wlan_objmgr_psoc_peer_ref_print(struct wlan_objmgr_psoc *psoc,
obj_mgr_alert("Peer MAC:%02x:%02x:%02x:%02x:%02x:%02x state:%d vdev_id:%d",
macaddr[0], macaddr[1], macaddr[2], macaddr[3],
macaddr[4], macaddr[5], obj_state, vdev_id);
wlan_objmgr_print_ref_ids(peer->peer_objmgr.ref_id_dbg,
QDF_TRACE_LEVEL_FATAL);
wlan_objmgr_print_peer_ref_ids(peer, QDF_TRACE_LEVEL_FATAL);
}
static void wlan_objmgr_psoc_vdev_ref_print(struct wlan_objmgr_psoc *psoc,
@@ -2098,6 +2097,35 @@ void wlan_objmgr_psoc_check_for_vdev_leaks(struct wlan_objmgr_psoc *psoc)
}
qdf_export_symbol(wlan_objmgr_psoc_check_for_vdev_leaks);
#ifdef WLAN_OBJMGR_REF_ID_DEBUG
static void
wlan_objmgr_print_peer_ref_leaks(struct wlan_objmgr_peer *peer, int vdev_id)
{
qdf_atomic_t *ref_id_dbg;
int32_t refs;
int ref_id;
ref_id_dbg = peer->peer_objmgr.ref_id_dbg;
wlan_objmgr_for_each_refs(ref_id_dbg, ref_id, refs) {
obj_mgr_err(QDF_MAC_ADDR_STR " %7u %4u %s",
QDF_MAC_ADDR_ARRAY(peer->macaddr),
vdev_id,
refs,
string_from_dbgid(ref_id));
}
}
#else
static inline void
wlan_objmgr_print_peer_ref_leaks(struct wlan_objmgr_peer *peer, int vdev_id)
{
obj_mgr_err(QDF_MAC_ADDR_STR " %7u %4u %s",
QDF_MAC_ADDR_ARRAY(peer->macaddr),
vdev_id,
qdf_atomic_read(&peer->peer_objmgr.ref_cnt),
"TOTAL_REF_COUNT");
}
#endif
void wlan_objmgr_psoc_check_for_peer_leaks(struct wlan_objmgr_psoc *psoc)
{
struct wlan_objmgr_psoc_objmgr *_psoc;
@@ -2126,20 +2154,9 @@ void wlan_objmgr_psoc_check_for_peer_leaks(struct wlan_objmgr_psoc *psoc)
wlan_vdev_obj_lock(vdev);
wlan_objmgr_for_each_vdev_peer(vdev, peer) {
qdf_atomic_t *ref_id_dbg;
int ref_id;
int32_t refs;
wlan_peer_obj_lock(peer);
ref_id_dbg = peer->peer_objmgr.ref_id_dbg;
wlan_objmgr_for_each_refs(ref_id_dbg, ref_id, refs) {
leaks++;
obj_mgr_err(QDF_MAC_ADDR_STR " %7u %4u %s",
QDF_MAC_ADDR_ARRAY(peer->macaddr),
vdev_id,
refs,
string_from_dbgid(ref_id));
}
leaks += qdf_atomic_read(&peer->peer_objmgr.ref_cnt);
wlan_objmgr_print_peer_ref_leaks(peer, vdev_id);
wlan_peer_obj_unlock(peer);
}
wlan_vdev_obj_unlock(vdev);