diff --git a/qdf/inc/qdf_str.h b/qdf/inc/qdf_str.h index 7864a4412e..5c04baa5bd 100644 --- a/qdf/inc/qdf_str.h +++ b/qdf/inc/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 @@ -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 */ diff --git a/qdf/linux/src/i_qdf_str.h b/qdf/linux/src/i_qdf_str.h index 0f54196c36..53378e12ba 100644 --- a/qdf/linux/src/i_qdf_str.h +++ b/qdf/linux/src/i_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 */ diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h index c642b0aa79..9b473664fb 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.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_*/ diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_debug.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_debug.h index 2df21f0d6d..ee5c5430a6 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_debug.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_debug.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_*/ diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_peer_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_peer_obj.h index 9d4ba0f761..0a19b7747d 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_peer_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_peer_obj.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_*/ diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h index e3db4e953e..7c7cd8dd35 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_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_*/ diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_debug.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_debug.c index d65d8e73a6..e62a57072b 100644 --- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_debug.c +++ b/umac/cmn_services/obj_mgr/src/wlan_objmgr_debug.c @@ -27,6 +27,7 @@ #include "wlan_objmgr_global_obj_i.h" #include #include +#include /* * 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 diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_peer_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_peer_obj.c index 4421c12c43..ded7cd8e5a 100644 --- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_peer_obj.c +++ b/umac/cmn_services/obj_mgr/src/wlan_objmgr_peer_obj.c @@ -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 diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c index 9b29b68628..784319e71d 100644 --- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c +++ b/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c @@ -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