qcacmn: Add debug support for vdev/peer reference and release
Allocate node for new entry and add it to existing list of function or line If function or line already present in list then increment count Change-Id: I3d737dcd33862f133b52c6d694c89f6d6b1517a5
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for
|
||||
* any purpose with or without fee is hereby granted, provided that the
|
||||
@@ -154,4 +154,20 @@ static inline qdf_size_t qdf_str_nlen(const char *str, qdf_size_t limit)
|
||||
return __qdf_str_nlen(str, limit);
|
||||
}
|
||||
|
||||
/**
|
||||
* qdf_str_ncmp - Compare two strings
|
||||
* @str1: First string
|
||||
* @str2: Second string
|
||||
* @limit: the maximum number of characters to check
|
||||
* Return:
|
||||
* 0 - strings are equal
|
||||
* <0 - str1 sorts lexicographically before str2
|
||||
* >0 - str1 sorts lexicographically after str2
|
||||
*/
|
||||
static inline int32_t
|
||||
qdf_str_ncmp(const char *str1, const char *str2, qdf_size_t limit)
|
||||
{
|
||||
return __qdf_str_ncmp(str1, str2, limit);
|
||||
}
|
||||
|
||||
#endif /* __QDF_STR_H */
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for
|
||||
* any purpose with or without fee is hereby granted, provided that the
|
||||
@@ -33,5 +33,6 @@
|
||||
#define __qdf_str_len(str) strlen(str)
|
||||
#define __qdf_str_trim(str) strim(str)
|
||||
#define __qdf_str_nlen(str, limit) strnlen(str, limit)
|
||||
#define __qdf_str_ncmp(left, right, limit) strncmp(left, right, limit)
|
||||
|
||||
#endif /* __I_QDF_STR_H */
|
||||
|
@@ -435,4 +435,62 @@ static inline char *string_from_dbgid(wlan_objmgr_ref_dbgid id)
|
||||
#define WLAN_OBJMGR_BUG(val)
|
||||
#endif
|
||||
#define WLAN_OBJMGR_RATELIMIT_THRESH 2
|
||||
|
||||
#ifdef WLAN_OBJMGR_REF_ID_TRACE
|
||||
#define WLAN_OBJMGR_TRACE_FUNC_SIZE 30
|
||||
/**
|
||||
* struct wlan_objmgr_line_ref - line reference data
|
||||
* @line: line number
|
||||
* @cnt: line reference count
|
||||
*/
|
||||
struct wlan_objmgr_line_ref {
|
||||
uint32_t line;
|
||||
qdf_atomic_t cnt;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct wlan_objmgr_line_ref_node - line reference node
|
||||
* @line_ref: line reference data
|
||||
* @next: pointer to next line reference
|
||||
*/
|
||||
struct wlan_objmgr_line_ref_node {
|
||||
struct wlan_objmgr_line_ref line_ref;
|
||||
struct wlan_objmgr_line_ref_node *next;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct wlan_objmgr_trace_func - trace function data
|
||||
* @func: function pointer
|
||||
* @line_head: pointer to head line trace reference
|
||||
* @next: pointer to next function reference
|
||||
*/
|
||||
struct wlan_objmgr_trace_func {
|
||||
char func[WLAN_OBJMGR_TRACE_FUNC_SIZE];
|
||||
struct wlan_objmgr_line_ref_node *line_head;
|
||||
struct wlan_objmgr_trace_func *next;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct wlan_objmgr_trace_id - trace reference data
|
||||
* @num_func: num of functions
|
||||
* @head: head pointer to function reference
|
||||
*/
|
||||
struct wlan_objmgr_trace_id {
|
||||
uint32_t num_func;
|
||||
struct wlan_objmgr_trace_func *head;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct wlan_objmgr_trace - trace reference data
|
||||
* @references: reference data
|
||||
* @dereferences: dereference data
|
||||
* @trace_lock: lock
|
||||
*/
|
||||
struct wlan_objmgr_trace {
|
||||
struct wlan_objmgr_trace_id references[WLAN_REF_ID_MAX];
|
||||
struct wlan_objmgr_trace_id dereferences[WLAN_REF_ID_MAX];
|
||||
qdf_spinlock_t trace_lock;
|
||||
};
|
||||
#endif /*WLAN_OBJMGR_REF_ID_TRACE*/
|
||||
|
||||
#endif /* _WLAN_OBJMGR_CMN_H_*/
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for
|
||||
* any purpose with or without fee is hereby granted, provided that the
|
||||
@@ -93,4 +93,53 @@ wlan_objmgr_debug_info_deinit(void)
|
||||
|
||||
#endif /*WLAN_OBJMGR_DEBUG*/
|
||||
|
||||
#ifdef WLAN_OBJMGR_REF_ID_TRACE
|
||||
/**
|
||||
* wlan_objmgr_trace_ref() - Save trace info to list
|
||||
* @func_head: head object of function list
|
||||
* @trace: trace object
|
||||
* @func: function name
|
||||
* @line: line number
|
||||
*
|
||||
* API to trace func and line information for reference
|
||||
* and dereference
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
void
|
||||
wlan_objmgr_trace_ref(struct wlan_objmgr_trace_func **func_head,
|
||||
struct wlan_objmgr_trace *trace,
|
||||
const char *func, int line);
|
||||
|
||||
/**
|
||||
* wlan_objmgr_trace_init_lock() - Initialize trace spinlock
|
||||
* @trace: trace object
|
||||
*
|
||||
* API to initialize trace spin lock
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
void wlan_objmgr_trace_init_lock(struct wlan_objmgr_trace *trace);
|
||||
|
||||
/**
|
||||
* wlan_objmgr_trace_deinit_lock() - Deinitialize trace spinlock
|
||||
* @trace: trace object
|
||||
*
|
||||
* API to deinitialize trace spin lock
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
void wlan_objmgr_trace_deinit_lock(struct wlan_objmgr_trace *trace);
|
||||
|
||||
/**
|
||||
* wlan_objmgr_trace_del_ref_list() - Delete reference trace list
|
||||
* @trace: trace object
|
||||
*
|
||||
* API to delete trace list
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
void wlan_objmgr_trace_del_ref_list(struct wlan_objmgr_trace *trace);
|
||||
#endif /*WLAN_OBJMGR_REF_ID_TRACE*/
|
||||
|
||||
#endif /*_WLAN_OBJMGR_DEBUG_H_*/
|
||||
|
@@ -143,6 +143,7 @@ struct wlan_objmgr_peer_mlme {
|
||||
* @ref_cnt: Ref count
|
||||
* @ref_id_dbg: Array to track Ref count
|
||||
* @print_cnt: Count to throttle Logical delete prints
|
||||
* @wlan_objmgr_trace: Trace ref and deref
|
||||
*/
|
||||
struct wlan_objmgr_peer_objmgr {
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
@@ -151,6 +152,9 @@ struct wlan_objmgr_peer_objmgr {
|
||||
qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
|
||||
#endif
|
||||
uint8_t print_cnt;
|
||||
#ifdef WLAN_OBJMGR_REF_ID_TRACE
|
||||
struct wlan_objmgr_trace trace;
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1154,4 +1158,61 @@ uint32_t
|
||||
wlan_objmgr_peer_get_comp_ref_cnt(struct wlan_objmgr_peer *peer,
|
||||
enum wlan_umac_comp_id id);
|
||||
|
||||
/**
|
||||
* wlan_objmgr_peer_trace_init_lock() - Initialize peer trace lock
|
||||
* @peer: peer object pointer
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
#ifdef WLAN_OBJMGR_TRACE
|
||||
static inline void
|
||||
wlan_objmgr_peer_trace_init_lock(struct wlan_objmgr_peer *peer)
|
||||
{
|
||||
wlan_objmgr_trace_init_lock(&peer->peer_objmgr.trace);
|
||||
}
|
||||
#else
|
||||
static inline void
|
||||
wlan_objmgr_peer_trace_init_lock(struct wlan_objmgr_peer *peer)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* wlan_objmgr_peer_trace_deinit_lock() - Deinitialize peer trace lock
|
||||
* @peer: peer object pointer
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
#ifdef WLAN_OBJMGR_TRACE
|
||||
static inline void
|
||||
wlan_objmgr_peer_trace_deinit_lock(struct wlan_objmgr_peer *peer)
|
||||
{
|
||||
wlan_objmgr_trace_deinit_lock(&peer->peer_objmgr.trace);
|
||||
}
|
||||
#else
|
||||
static inline void
|
||||
wlan_objmgr_peer_trace_deinit_lock(struct wlan_objmgr_peer *peer)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* wlan_objmgr_peer_trace_del_ref_list() - Delete peer trace reference list
|
||||
* @peer: peer object pointer
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
#ifdef WLAN_OBJMGR_REF_ID_TRACE
|
||||
static inline void
|
||||
wlan_objmgr_peer_trace_del_ref_list(struct wlan_objmgr_peer *peer)
|
||||
{
|
||||
wlan_objmgr_trace_del_ref_list(&peer->peer_objmgr.trace);
|
||||
}
|
||||
#else
|
||||
static inline void
|
||||
wlan_objmgr_peer_trace_del_ref_list(struct wlan_objmgr_peer *peer)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _WLAN_OBJMGR_PEER_OBJ_H_*/
|
||||
|
@@ -335,6 +335,7 @@ struct wlan_objmgr_vdev_nif {
|
||||
* @c_flags: creation specific flags
|
||||
* @ref_cnt: Ref count
|
||||
* @ref_id_dbg: Array to track Ref count
|
||||
* @wlan_objmgr_trace: Trace ref and deref
|
||||
*/
|
||||
struct wlan_objmgr_vdev_objmgr {
|
||||
uint8_t vdev_id;
|
||||
@@ -348,6 +349,9 @@ struct wlan_objmgr_vdev_objmgr {
|
||||
uint32_t c_flags;
|
||||
qdf_atomic_t ref_cnt;
|
||||
qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
|
||||
#ifdef WLAN_OBJMGR_REF_ID_TRACE
|
||||
struct wlan_objmgr_trace trace;
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1444,4 +1448,61 @@ void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev);
|
||||
static inline void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev) {}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* wlan_objmgr_vdev_trace_init_lock() - Initialize trace lock
|
||||
* @vdev: vdev object pointer
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
#ifdef WLAN_OBJMGR_TRACE
|
||||
static inline void
|
||||
wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
wlan_objmgr_trace_init_lock(&vdev->vdev_objmgr.trace);
|
||||
}
|
||||
#else
|
||||
static inline void
|
||||
wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* wlan_objmgr_vdev_trace_deinit_lock() - Deinitialize trace lock
|
||||
* @vdev: vdev object pointer
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
#ifdef WLAN_OBJMGR_TRACE
|
||||
static inline void
|
||||
wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
wlan_objmgr_trace_deinit_lock(&vdev->vdev_objmgr.trace);
|
||||
}
|
||||
#else
|
||||
static inline void
|
||||
wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* wlan_objmgr_vdev_trace_del_ref_list() - Delete trace ref list
|
||||
* @vdev: vdev object pointer
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
#ifdef WLAN_OBJMGR_REF_ID_TRACE
|
||||
static inline void
|
||||
wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
wlan_objmgr_trace_del_ref_list(&vdev->vdev_objmgr.trace);
|
||||
}
|
||||
#else
|
||||
static inline void
|
||||
wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/
|
||||
|
@@ -27,6 +27,7 @@
|
||||
#include "wlan_objmgr_global_obj_i.h"
|
||||
#include <qdf_mem.h>
|
||||
#include <qdf_platform.h>
|
||||
#include <qdf_str.h>
|
||||
|
||||
/*
|
||||
* Default TTL (of FW) for mgmt frames is 5 sec, by considering all the other
|
||||
@@ -351,6 +352,84 @@ static void wlan_objmgr_print_pending_refs(union wlan_objmgr_del_obj *obj,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WLAN_OBJMGR_REF_ID_TRACE
|
||||
static void
|
||||
wlan_objmgr_print_ref_func_line(struct wlan_objmgr_trace_func *func_head,
|
||||
uint32_t id)
|
||||
{
|
||||
uint32_t ref_cnt;
|
||||
struct wlan_objmgr_line_ref_node *tmp_ln_node;
|
||||
|
||||
obj_mgr_debug("ID: %s", string_from_dbgid(id));
|
||||
while (func_head) {
|
||||
obj_mgr_debug("Func: %s", func_head->func);
|
||||
tmp_ln_node = func_head->line_head;
|
||||
while (tmp_ln_node) {
|
||||
ref_cnt = qdf_atomic_read(&tmp_ln_node->line_ref.cnt);
|
||||
obj_mgr_debug("line: %d cnt: %d",
|
||||
tmp_ln_node->line_ref.line,
|
||||
ref_cnt);
|
||||
tmp_ln_node = tmp_ln_node->next;
|
||||
}
|
||||
func_head = func_head->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
wlan_objmgr_trace_print_ref(union wlan_objmgr_del_obj *obj,
|
||||
enum wlan_objmgr_obj_type obj_type)
|
||||
{
|
||||
uint32_t id;
|
||||
struct wlan_objmgr_trace_func *func_head;
|
||||
struct wlan_objmgr_trace *trace;
|
||||
struct wlan_objmgr_vdev_objmgr *vdev_obj;
|
||||
struct wlan_objmgr_peer_objmgr *peer_obj;
|
||||
|
||||
switch (obj_type) {
|
||||
case WLAN_VDEV_OP:
|
||||
vdev_obj = &obj->obj_vdev->vdev_objmgr;
|
||||
trace = &vdev_obj->trace;
|
||||
for (id = 0; id < WLAN_REF_ID_MAX; id++) {
|
||||
if (qdf_atomic_read(&vdev_obj->ref_id_dbg[id])) {
|
||||
obj_mgr_debug("Reference:");
|
||||
|
||||
func_head = trace->references[id].head;
|
||||
wlan_objmgr_print_ref_func_line(func_head, id);
|
||||
|
||||
obj_mgr_debug("Dereference:");
|
||||
func_head = trace->dereferences[id].head;
|
||||
wlan_objmgr_print_ref_func_line(func_head, id);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WLAN_PEER_OP:
|
||||
peer_obj = &obj->obj_peer->peer_objmgr;
|
||||
trace = &peer_obj->trace;
|
||||
for (id = 0; id < WLAN_REF_ID_MAX; id++) {
|
||||
if (qdf_atomic_read(&vdev_obj->ref_id_dbg[id])) {
|
||||
obj_mgr_debug("Reference:");
|
||||
|
||||
func_head = trace->references[id].head;
|
||||
wlan_objmgr_print_ref_func_line(func_head, id);
|
||||
|
||||
obj_mgr_debug("Dereference:");
|
||||
func_head = trace->dereferences[id].head;
|
||||
wlan_objmgr_print_ref_func_line(func_head, id);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
static void
|
||||
wlan_objmgr_trace_print_ref(union wlan_objmgr_del_obj *obj,
|
||||
enum wlan_objmgr_obj_type obj_type)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/* timeout handler for iterating logically deleted object */
|
||||
|
||||
static void wlan_objmgr_iterate_log_del_obj_handler(void *timer_arg)
|
||||
@@ -417,6 +496,7 @@ static void wlan_objmgr_iterate_log_del_obj_handler(void *timer_arg)
|
||||
obj_name, QDF_MAC_ADDR_ARRAY(macaddr));
|
||||
wlan_objmgr_print_pending_refs(&del_obj->obj, obj_type);
|
||||
|
||||
wlan_objmgr_trace_print_ref(&del_obj->obj, obj_type);
|
||||
if (cur_tstamp > del_obj->tstamp +
|
||||
LOG_DEL_OBJ_DESTROY_ASSERT_DURATION_SEC) {
|
||||
if (!qdf_is_recovering() && !qdf_is_fw_down())
|
||||
@@ -512,3 +592,163 @@ void wlan_objmgr_debug_info_init(void)
|
||||
g_umac_glb_obj->debug_info = debug_info;
|
||||
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
|
||||
}
|
||||
|
||||
#ifdef WLAN_OBJMGR_REF_ID_TRACE
|
||||
void
|
||||
wlan_objmgr_trace_init_lock(struct wlan_objmgr_trace *trace)
|
||||
{
|
||||
qdf_spinlock_create(&trace->trace_lock);
|
||||
}
|
||||
|
||||
void
|
||||
wlan_objmgr_trace_deinit_lock(struct wlan_objmgr_trace *trace)
|
||||
{
|
||||
qdf_spinlock_destroy(&trace->trace_lock);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_OBJMGR_REF_ID_TRACE
|
||||
static inline struct wlan_objmgr_line_ref_node*
|
||||
wlan_objmgr_trace_line_node_alloc(int line)
|
||||
{
|
||||
struct wlan_objmgr_line_ref_node *line_node;
|
||||
|
||||
line_node = qdf_mem_malloc_atomic(sizeof(*line_node));
|
||||
if (!line_node)
|
||||
return NULL;
|
||||
|
||||
line_node->line_ref.line = line;
|
||||
qdf_atomic_set(&line_node->line_ref.cnt, 1);
|
||||
line_node->next = NULL;
|
||||
|
||||
return line_node;
|
||||
}
|
||||
|
||||
static inline struct wlan_objmgr_trace_func*
|
||||
wlan_objmgr_trace_ref_node_alloc(const char *func, int line)
|
||||
{
|
||||
struct wlan_objmgr_trace_func *func_node;
|
||||
struct wlan_objmgr_line_ref_node *line_node;
|
||||
|
||||
func_node = qdf_mem_malloc_atomic(sizeof(*func_node));
|
||||
if (!func_node)
|
||||
return NULL;
|
||||
|
||||
line_node = wlan_objmgr_trace_line_node_alloc(line);
|
||||
if (!line_node) {
|
||||
qdf_mem_free(func_node);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
func_node->line_head = line_node;
|
||||
qdf_str_lcopy(func_node->func, func, WLAN_OBJMGR_TRACE_FUNC_SIZE);
|
||||
func_node->next = NULL;
|
||||
|
||||
return func_node;
|
||||
}
|
||||
|
||||
static inline void
|
||||
wlan_objmgr_trace_check_line(struct wlan_objmgr_trace_func *tmp_func_node,
|
||||
struct wlan_objmgr_trace *trace, int line)
|
||||
{
|
||||
struct wlan_objmgr_line_ref_node *line_node;
|
||||
struct wlan_objmgr_line_ref_node *tmp_ln_node;
|
||||
|
||||
tmp_ln_node = tmp_func_node->line_head;
|
||||
while (tmp_ln_node) {
|
||||
line_node = tmp_ln_node;
|
||||
if (tmp_ln_node->line_ref.line == line) {
|
||||
qdf_atomic_inc(&tmp_ln_node->line_ref.cnt);
|
||||
break;
|
||||
}
|
||||
tmp_ln_node = tmp_ln_node->next;
|
||||
}
|
||||
if (!tmp_ln_node) {
|
||||
tmp_ln_node = wlan_objmgr_trace_line_node_alloc(line);
|
||||
if (tmp_ln_node)
|
||||
line_node->next = tmp_ln_node;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
wlan_objmgr_trace_ref(struct wlan_objmgr_trace_func **func_head,
|
||||
struct wlan_objmgr_trace *trace,
|
||||
const char *func, int line)
|
||||
{
|
||||
struct wlan_objmgr_trace_func *tmp_func_node;
|
||||
struct wlan_objmgr_trace_func *func_node;
|
||||
|
||||
qdf_spin_lock_bh(&trace->trace_lock);
|
||||
if (!*func_head) {
|
||||
tmp_func_node = wlan_objmgr_trace_ref_node_alloc(func, line);
|
||||
if (tmp_func_node)
|
||||
*func_head = tmp_func_node;
|
||||
} else {
|
||||
tmp_func_node = *func_head;
|
||||
while (tmp_func_node) {
|
||||
func_node = tmp_func_node;
|
||||
if (!qdf_str_ncmp(tmp_func_node->func, func,
|
||||
WLAN_OBJMGR_TRACE_FUNC_SIZE - 1)) {
|
||||
wlan_objmgr_trace_check_line(tmp_func_node,
|
||||
trace, line);
|
||||
break;
|
||||
}
|
||||
tmp_func_node = tmp_func_node->next;
|
||||
}
|
||||
|
||||
if (!tmp_func_node) {
|
||||
tmp_func_node = wlan_objmgr_trace_ref_node_alloc(func,
|
||||
line);
|
||||
if (tmp_func_node)
|
||||
func_node->next = tmp_func_node;
|
||||
}
|
||||
}
|
||||
qdf_spin_unlock_bh(&trace->trace_lock);
|
||||
}
|
||||
|
||||
void
|
||||
wlan_objmgr_trace_del_line(struct wlan_objmgr_line_ref_node **line_head)
|
||||
{
|
||||
struct wlan_objmgr_line_ref_node *del_tmp_node;
|
||||
struct wlan_objmgr_line_ref_node *line_node;
|
||||
|
||||
line_node = *line_head;
|
||||
while (line_node) {
|
||||
del_tmp_node = line_node;
|
||||
line_node = line_node->next;
|
||||
qdf_mem_free(del_tmp_node);
|
||||
}
|
||||
*line_head = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
wlan_objmgr_trace_del_ref_list(struct wlan_objmgr_trace *trace)
|
||||
{
|
||||
struct wlan_objmgr_trace_func *func_node;
|
||||
struct wlan_objmgr_trace_func *del_tmp_node;
|
||||
uint32_t id;
|
||||
|
||||
qdf_spin_lock_bh(&trace->trace_lock);
|
||||
for (id = 0; id < WLAN_REF_ID_MAX; id++) {
|
||||
func_node = trace->references[id].head;
|
||||
while (func_node) {
|
||||
del_tmp_node = func_node;
|
||||
wlan_objmgr_trace_del_line(&del_tmp_node->line_head);
|
||||
func_node = func_node->next;
|
||||
qdf_mem_free(del_tmp_node);
|
||||
}
|
||||
trace->references[id].head = NULL;
|
||||
}
|
||||
for (id = 0; id < WLAN_REF_ID_MAX; id++) {
|
||||
func_node = trace->dereferences[id].head;
|
||||
while (func_node) {
|
||||
del_tmp_node = func_node;
|
||||
wlan_objmgr_trace_del_line(&del_tmp_node->line_head);
|
||||
func_node = func_node->next;
|
||||
qdf_mem_free(del_tmp_node);
|
||||
}
|
||||
trace->dereferences[id].head = NULL;
|
||||
}
|
||||
qdf_spin_unlock_bh(&trace->trace_lock);
|
||||
}
|
||||
#endif
|
||||
|
@@ -129,6 +129,8 @@ static QDF_STATUS wlan_objmgr_peer_obj_free(struct wlan_objmgr_peer *peer)
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_OBJMGR_ID);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
wlan_objmgr_peer_trace_del_ref_list(peer);
|
||||
wlan_objmgr_peer_trace_deinit_lock(peer);
|
||||
qdf_spinlock_destroy(&peer->peer_lock);
|
||||
qdf_mem_free(peer);
|
||||
|
||||
@@ -203,6 +205,7 @@ struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
|
||||
peer->peer_objmgr.print_cnt = 0;
|
||||
|
||||
qdf_spinlock_create(&peer->peer_lock);
|
||||
wlan_objmgr_peer_trace_init_lock(peer);
|
||||
/* Attach peer to psoc, psoc maintains the node table for the device */
|
||||
if (wlan_objmgr_psoc_peer_attach(psoc, peer) !=
|
||||
QDF_STATUS_SUCCESS) {
|
||||
@@ -211,6 +214,7 @@ struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
|
||||
macaddr[0], macaddr[1], macaddr[2],
|
||||
macaddr[3], macaddr[4], macaddr[5]);
|
||||
qdf_spinlock_destroy(&peer->peer_lock);
|
||||
wlan_objmgr_peer_trace_deinit_lock(peer);
|
||||
qdf_mem_free(peer);
|
||||
return NULL;
|
||||
}
|
||||
@@ -224,6 +228,7 @@ struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
|
||||
/* if attach fails, detach from psoc table before free */
|
||||
wlan_objmgr_psoc_peer_detach(psoc, peer);
|
||||
qdf_spinlock_destroy(&peer->peer_lock);
|
||||
wlan_objmgr_peer_trace_deinit_lock(peer);
|
||||
qdf_mem_free(peer);
|
||||
return NULL;
|
||||
}
|
||||
@@ -641,6 +646,13 @@ wlan_objmgr_peer_ref_trace(struct wlan_objmgr_peer *peer,
|
||||
wlan_objmgr_ref_dbgid id,
|
||||
const char *func, int line)
|
||||
{
|
||||
struct wlan_objmgr_trace *trace;
|
||||
|
||||
trace = &peer->peer_objmgr.trace;
|
||||
|
||||
if (func)
|
||||
wlan_objmgr_trace_ref(&trace->references[id].head,
|
||||
trace, func, line);
|
||||
}
|
||||
|
||||
static inline void
|
||||
@@ -648,6 +660,12 @@ wlan_objmgr_peer_deref_trace(struct wlan_objmgr_peer *peer,
|
||||
wlan_objmgr_ref_dbgid id,
|
||||
const char *func, int line)
|
||||
{
|
||||
struct wlan_objmgr_trace *trace;
|
||||
|
||||
trace = &peer->peer_objmgr.trace;
|
||||
if (func)
|
||||
wlan_objmgr_trace_ref(&trace->dereferences[id].head,
|
||||
trace, func, line);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@@ -103,6 +103,8 @@ static QDF_STATUS wlan_objmgr_vdev_obj_free(struct wlan_objmgr_vdev *vdev)
|
||||
QDF_STATUS_E_FAILURE)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
wlan_objmgr_vdev_trace_del_ref_list(vdev);
|
||||
wlan_objmgr_vdev_trace_deinit_lock(vdev);
|
||||
qdf_spinlock_destroy(&vdev->vdev_lock);
|
||||
|
||||
qdf_mem_free(vdev->vdev_mlme.bss_chan);
|
||||
@@ -157,6 +159,7 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
wlan_objmgr_vdev_trace_init_lock(vdev);
|
||||
/* Initialize spinlock */
|
||||
qdf_spinlock_create(&vdev->vdev_lock);
|
||||
/* Attach VDEV to PSOC VDEV's list */
|
||||
@@ -167,6 +170,7 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
|
||||
qdf_mem_free(vdev->vdev_mlme.bss_chan);
|
||||
qdf_mem_free(vdev->vdev_mlme.des_chan);
|
||||
qdf_spinlock_destroy(&vdev->vdev_lock);
|
||||
wlan_objmgr_vdev_trace_deinit_lock(vdev);
|
||||
qdf_mem_free(vdev);
|
||||
return NULL;
|
||||
}
|
||||
@@ -181,6 +185,7 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
|
||||
qdf_mem_free(vdev->vdev_mlme.bss_chan);
|
||||
qdf_mem_free(vdev->vdev_mlme.des_chan);
|
||||
qdf_spinlock_destroy(&vdev->vdev_lock);
|
||||
wlan_objmgr_vdev_trace_deinit_lock(vdev);
|
||||
qdf_mem_free(vdev);
|
||||
return NULL;
|
||||
}
|
||||
@@ -975,6 +980,13 @@ wlan_objmgr_vdev_ref_trace(struct wlan_objmgr_vdev *vdev,
|
||||
wlan_objmgr_ref_dbgid id,
|
||||
const char *func, int line)
|
||||
{
|
||||
struct wlan_objmgr_trace *trace;
|
||||
|
||||
trace = &vdev->vdev_objmgr.trace;
|
||||
|
||||
if (func)
|
||||
wlan_objmgr_trace_ref(&trace->references[id].head,
|
||||
trace, func, line);
|
||||
}
|
||||
|
||||
static inline void
|
||||
@@ -982,6 +994,13 @@ wlan_objmgr_vdev_deref_trace(struct wlan_objmgr_vdev *vdev,
|
||||
wlan_objmgr_ref_dbgid id,
|
||||
const char *func, int line)
|
||||
{
|
||||
struct wlan_objmgr_trace *trace;
|
||||
|
||||
trace = &vdev->vdev_objmgr.trace;
|
||||
|
||||
if (func)
|
||||
wlan_objmgr_trace_ref(&trace->dereferences[id].head,
|
||||
trace, func, line);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user