Browse Source

qcacld-3.0: Add hdd_objmgr_get_vdev to obj tracing

Add implementation of hdd_objmgr_get_vdev and hdd_objmgr_put_vdev
api for object ref id tracing enabled.
When WLAN_OBJMGR_REF_ID_TRACE enabled, add line and func name to
the two API to record the ref/deref history.

Change-Id: I7c4c52159d4e1b842026b584ff8f25faa47c168c
CRs-Fixed: 2802668
Liangwei Dong 4 years ago
parent
commit
23bc217297
2 changed files with 56 additions and 0 deletions
  1. 41 0
      core/hdd/src/wlan_hdd_object_manager.c
  2. 15 0
      core/hdd/src/wlan_hdd_object_manager.h

+ 41 - 0
core/hdd/src/wlan_hdd_object_manager.c

@@ -220,6 +220,46 @@ int hdd_objmgr_release_and_destroy_pdev(struct hdd_context *hdd_ctx)
 	return qdf_status_to_os_return(status);
 }
 
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *__hdd_objmgr_get_vdev(struct hdd_adapter *adapter,
+					       const char *func,
+					       int line)
+{
+	struct wlan_objmgr_vdev *vdev = NULL;
+	QDF_STATUS status;
+
+	if (!adapter) {
+		hdd_err("Adapter is NULL (via %s)", func);
+		return NULL;
+	}
+
+	qdf_spin_lock_bh(&adapter->vdev_lock);
+	vdev = adapter->vdev;
+	if (vdev) {
+		status = wlan_objmgr_vdev_try_get_ref_debug(vdev, WLAN_OSIF_ID,
+							    func, line);
+		if (QDF_IS_STATUS_ERROR(status))
+			vdev = NULL;
+	}
+	qdf_spin_unlock_bh(&adapter->vdev_lock);
+
+	if (!vdev)
+		hdd_debug("VDEV is NULL (via %s)", func);
+
+	return vdev;
+}
+
+void __hdd_objmgr_put_vdev(struct wlan_objmgr_vdev *vdev, const char *func,
+			   int line)
+{
+	if (!vdev) {
+		hdd_err("VDEV is NULL (via %s)", func);
+		return;
+	}
+
+	wlan_objmgr_vdev_release_ref_debug(vdev, WLAN_OSIF_ID, func, line);
+}
+#else
 struct wlan_objmgr_vdev *__hdd_objmgr_get_vdev(struct hdd_adapter *adapter,
 					       const char *func)
 {
@@ -255,6 +295,7 @@ void __hdd_objmgr_put_vdev(struct wlan_objmgr_vdev *vdev, const char *func)
 
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_OSIF_ID);
 }
+#endif
 
 int hdd_objmgr_set_peer_mlme_auth_state(struct wlan_objmgr_vdev *vdev,
 					bool is_authenticated)

+ 15 - 0
core/hdd/src/wlan_hdd_object_manager.h

@@ -117,10 +117,18 @@ int hdd_objmgr_release_and_destroy_pdev(struct hdd_context *hdd_ctx);
  *
  * Return: pointer to vdev object for success, NULL for failure
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+#define hdd_objmgr_get_vdev(adapter) \
+	__hdd_objmgr_get_vdev(adapter, __func__, __LINE__)
+struct wlan_objmgr_vdev *__hdd_objmgr_get_vdev(struct hdd_adapter *adapter,
+					       const char *func,
+					       int line);
+#else
 #define hdd_objmgr_get_vdev(adapter) \
 	__hdd_objmgr_get_vdev(adapter, __func__)
 struct wlan_objmgr_vdev *__hdd_objmgr_get_vdev(struct hdd_adapter *adapter,
 					       const char *func);
+#endif
 
 /**
  * hdd_objmgr_put_vdev() - Release reference of vdev object
@@ -131,9 +139,16 @@ struct wlan_objmgr_vdev *__hdd_objmgr_get_vdev(struct hdd_adapter *adapter,
  *
  * Return: void
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+#define hdd_objmgr_put_vdev(vdev) \
+	__hdd_objmgr_put_vdev(vdev, __func__, __LINE__)
+void __hdd_objmgr_put_vdev(struct wlan_objmgr_vdev *vdev, const char *func,
+			   int line);
+#else
 #define hdd_objmgr_put_vdev(vdev) \
 	__hdd_objmgr_put_vdev(vdev, __func__)
 void __hdd_objmgr_put_vdev(struct wlan_objmgr_vdev *vdev, const char *func);
+#endif
 
 /**
  * hdd_objmgr_set_peer_mlme_auth_state() - set the peer mlme auth state