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:
aloksing
2019-12-15 22:13:46 +05:30
committed by nshrivas
parent 5567f874e7
commit 18f309c7f4
9 changed files with 526 additions and 3 deletions

View File

@@ -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 */

View File

@@ -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 */

View File

@@ -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_*/

View File

@@ -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_*/

View File

@@ -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_*/

View File

@@ -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_*/

View File

@@ -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

View File

@@ -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

View File

@@ -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