|
@@ -31,6 +31,7 @@
|
|
|
#include "wlan_objmgr_global_obj_i.h"
|
|
|
#include "wlan_objmgr_psoc_obj_i.h"
|
|
|
#include "wlan_objmgr_pdev_obj_i.h"
|
|
|
+#include "wlan_objmgr_vdev_obj_i.h"
|
|
|
|
|
|
|
|
|
** APIs to Create/Delete Global object APIs
|
|
@@ -2010,8 +2011,9 @@ QDF_STATUS wlan_objmgr_psoc_set_user_config(struct wlan_objmgr_psoc *psoc,
|
|
|
void wlan_objmgr_psoc_check_for_pdev_leaks(struct wlan_objmgr_psoc *psoc)
|
|
|
{
|
|
|
struct wlan_objmgr_psoc_objmgr *_psoc;
|
|
|
+ struct wlan_objmgr_pdev *pdev;
|
|
|
int pdev_id;
|
|
|
- int ref_id;
|
|
|
+ uint32_t leaks = 0;
|
|
|
|
|
|
QDF_BUG(psoc);
|
|
|
if (!psoc)
|
|
@@ -2029,38 +2031,34 @@ void wlan_objmgr_psoc_check_for_pdev_leaks(struct wlan_objmgr_psoc *psoc)
|
|
|
obj_mgr_err("Pdev Id Refs Module");
|
|
|
obj_mgr_err("--------------------------------------------------------");
|
|
|
|
|
|
- for (pdev_id = 0; pdev_id < WLAN_UMAC_MAX_PDEVS; pdev_id++) {
|
|
|
- struct wlan_objmgr_pdev *pdev = _psoc->wlan_pdev_list[pdev_id];
|
|
|
+ wlan_objmgr_for_each_psoc_pdev(psoc, pdev_id, pdev) {
|
|
|
qdf_atomic_t *ref_id_dbg;
|
|
|
-
|
|
|
- if (!pdev)
|
|
|
- continue;
|
|
|
+ int ref_id;
|
|
|
+ int32_t refs;
|
|
|
|
|
|
wlan_pdev_obj_lock(pdev);
|
|
|
ref_id_dbg = pdev->pdev_objmgr.ref_id_dbg;
|
|
|
- for (ref_id = 0; ref_id < WLAN_REF_ID_MAX; ref_id++) {
|
|
|
- int32_t refs = qdf_atomic_read(&ref_id_dbg[ref_id]);
|
|
|
-
|
|
|
- if (refs <= 0)
|
|
|
- continue;
|
|
|
-
|
|
|
- obj_mgr_err("%7u %4u x %s",
|
|
|
+ wlan_objmgr_for_each_refs(ref_id_dbg, ref_id, refs) {
|
|
|
+ leaks++;
|
|
|
+ obj_mgr_err("%7u %4u %s",
|
|
|
pdev_id, refs, string_from_dbgid(ref_id));
|
|
|
}
|
|
|
wlan_pdev_obj_unlock(pdev);
|
|
|
}
|
|
|
|
|
|
- wlan_psoc_obj_unlock(psoc);
|
|
|
+ QDF_DEBUG_PANIC("%u objmgr pdev leaks detected for psoc %u!",
|
|
|
+ leaks, _psoc->psoc_id);
|
|
|
|
|
|
- QDF_DEBUG_PANIC();
|
|
|
+ wlan_psoc_obj_unlock(psoc);
|
|
|
}
|
|
|
qdf_export_symbol(wlan_objmgr_psoc_check_for_pdev_leaks);
|
|
|
|
|
|
void wlan_objmgr_psoc_check_for_vdev_leaks(struct wlan_objmgr_psoc *psoc)
|
|
|
{
|
|
|
struct wlan_objmgr_psoc_objmgr *_psoc;
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
int vdev_id;
|
|
|
- int ref_id;
|
|
|
+ uint32_t leaks = 0;
|
|
|
|
|
|
QDF_BUG(psoc);
|
|
|
if (!psoc)
|
|
@@ -2078,30 +2076,78 @@ void wlan_objmgr_psoc_check_for_vdev_leaks(struct wlan_objmgr_psoc *psoc)
|
|
|
obj_mgr_err("Vdev Id Refs Module");
|
|
|
obj_mgr_err("--------------------------------------------------------");
|
|
|
|
|
|
- for (vdev_id = 0; vdev_id < _psoc->max_vdev_count; vdev_id++) {
|
|
|
- struct wlan_objmgr_vdev *vdev = _psoc->wlan_vdev_list[vdev_id];
|
|
|
+ wlan_objmgr_for_each_psoc_vdev(psoc, vdev_id, vdev) {
|
|
|
qdf_atomic_t *ref_id_dbg;
|
|
|
-
|
|
|
- if (!vdev)
|
|
|
- continue;
|
|
|
+ int ref_id;
|
|
|
+ int32_t refs;
|
|
|
|
|
|
wlan_vdev_obj_lock(vdev);
|
|
|
ref_id_dbg = vdev->vdev_objmgr.ref_id_dbg;
|
|
|
- for (ref_id = 0; ref_id < WLAN_REF_ID_MAX; ref_id++) {
|
|
|
- int32_t refs = qdf_atomic_read(&ref_id_dbg[ref_id]);
|
|
|
-
|
|
|
- if (refs <= 0)
|
|
|
- continue;
|
|
|
-
|
|
|
- obj_mgr_err("%7u %4u x %s",
|
|
|
+ wlan_objmgr_for_each_refs(ref_id_dbg, ref_id, refs) {
|
|
|
+ leaks++;
|
|
|
+ obj_mgr_err("%7u %4u %s",
|
|
|
vdev_id, refs, string_from_dbgid(ref_id));
|
|
|
}
|
|
|
wlan_vdev_obj_unlock(vdev);
|
|
|
}
|
|
|
|
|
|
- wlan_psoc_obj_unlock(psoc);
|
|
|
+ QDF_DEBUG_PANIC("%u objmgr vdev leaks detected for psoc %u!",
|
|
|
+ leaks, _psoc->psoc_id);
|
|
|
|
|
|
- QDF_DEBUG_PANIC();
|
|
|
+ wlan_psoc_obj_unlock(psoc);
|
|
|
}
|
|
|
qdf_export_symbol(wlan_objmgr_psoc_check_for_vdev_leaks);
|
|
|
|
|
|
+void wlan_objmgr_psoc_check_for_peer_leaks(struct wlan_objmgr_psoc *psoc)
|
|
|
+{
|
|
|
+ struct wlan_objmgr_psoc_objmgr *_psoc;
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ int vdev_id;
|
|
|
+ uint32_t leaks = 0;
|
|
|
+
|
|
|
+ QDF_BUG(psoc);
|
|
|
+ if (!psoc)
|
|
|
+ return;
|
|
|
+
|
|
|
+ wlan_psoc_obj_lock(psoc);
|
|
|
+ _psoc = &psoc->soc_objmgr;
|
|
|
+ if (!_psoc->temp_peer_count && !_psoc->wlan_peer_count) {
|
|
|
+ wlan_psoc_obj_unlock(psoc);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ obj_mgr_err("objmgr peer leaks detected for psoc %u!", _psoc->psoc_id);
|
|
|
+ obj_mgr_err("--------------------------------------------------------");
|
|
|
+ obj_mgr_err("Peer MAC Vdev Id Refs Module");
|
|
|
+ obj_mgr_err("--------------------------------------------------------");
|
|
|
+
|
|
|
+ wlan_objmgr_for_each_psoc_vdev(psoc, vdev_id, vdev) {
|
|
|
+ struct wlan_objmgr_peer *peer;
|
|
|
+
|
|
|
+ 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));
|
|
|
+ }
|
|
|
+ wlan_peer_obj_unlock(peer);
|
|
|
+ }
|
|
|
+ wlan_vdev_obj_unlock(vdev);
|
|
|
+ }
|
|
|
+
|
|
|
+ QDF_DEBUG_PANIC("%u objmgr peer leaks detected for psoc %u!",
|
|
|
+ leaks, _psoc->psoc_id);
|
|
|
+
|
|
|
+ wlan_psoc_obj_unlock(psoc);
|
|
|
+}
|
|
|
+qdf_export_symbol(wlan_objmgr_psoc_check_for_peer_leaks);
|