소스 검색

qcacmn: Add objmgr check for pdev leaks API

During objmgr psoc teardown, it would be useful to assert that there are
no longer any pdevs attached. Add an API that logs a list of all
pdevs attached to a given psoc, and panics if any are found.

Change-Id: Ia171ae1f443c91808c1f465c2570f6d9cb2237bc
CRs-Fixed: 2267143
Dustin Brown 6 년 전
부모
커밋
a8eefc87b9
2개의 변경된 파일57개의 추가작업 그리고 0개의 파일을 삭제
  1. 8 0
      umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h
  2. 49 0
      umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c

+ 8 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h

@@ -1436,6 +1436,14 @@ QDF_STATUS wlan_objmgr_print_ref_all_objects_per_psoc(
 QDF_STATUS wlan_objmgr_psoc_set_user_config(struct wlan_objmgr_psoc *psoc,
 		struct wlan_objmgr_psoc_user_config *user_config_data);
 
+/**
+ * wlan_objmgr_psoc_check_for_pdev_leaks() - Assert no pdevs attached to @psoc
+ * @psoc: The psoc to check
+ *
+ * Return: None
+ */
+void wlan_objmgr_psoc_check_for_pdev_leaks(struct wlan_objmgr_psoc *psoc);
+
 /**
  * wlan_objmgr_psoc_check_for_vdev_leaks() - Assert no vdevs attached to @psoc
  * @psoc: The psoc to check

+ 49 - 0
umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c

@@ -2005,6 +2005,55 @@ QDF_STATUS wlan_objmgr_psoc_set_user_config(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
+void wlan_objmgr_psoc_check_for_pdev_leaks(struct wlan_objmgr_psoc *psoc)
+{
+	struct wlan_objmgr_psoc_objmgr *_psoc;
+	int pdev_id;
+	int ref_id;
+
+	QDF_BUG(psoc);
+	if (!psoc)
+		return;
+
+	wlan_psoc_obj_lock(psoc);
+	_psoc = &psoc->soc_objmgr;
+	if (!_psoc->wlan_pdev_count) {
+		wlan_psoc_obj_unlock(psoc);
+		return;
+	}
+
+	obj_mgr_err("objmgr pdev leaks detected for psoc %u!", _psoc->psoc_id);
+	obj_mgr_err("--------------------------------------------------------");
+	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];
+		qdf_atomic_t *ref_id_dbg;
+
+		if (!pdev)
+			continue;
+
+		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",
+				    pdev_id, refs, string_from_dbgid(ref_id));
+		}
+		wlan_pdev_obj_unlock(pdev);
+	}
+
+	wlan_psoc_obj_unlock(psoc);
+
+	QDF_DEBUG_PANIC();
+}
+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;