Procházet zdrojové kódy

qcacld-3.0: Add new API hdd_objmgr_get/put_vdev_by_user

Add new hdd_objmgr_get/put_vdev_by_user to include user id(reference
count dbg id) to help identify the ownership of the ref count.
The old hdd_objmgr_get_vdev api is deprecated. And it will be removed
once all of the reference to it replaced by new API.

Change-Id: Ibd6528083d725a5930cece96ed3268b27e5263b9
CRs-Fixed: 2804993
Liangwei Dong před 4 roky
rodič
revize
520205fbf1

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

@@ -333,3 +333,88 @@ int hdd_objmgr_set_peer_mlme_state(struct wlan_objmgr_vdev *vdev,
 	return 0;
 }
 
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *
+__hdd_objmgr_get_vdev_by_user(struct hdd_adapter *adapter,
+			      wlan_objmgr_ref_dbgid id,
+			      const char *func, int line)
+{
+	struct wlan_objmgr_vdev *vdev;
+	QDF_STATUS status;
+
+	if (!adapter) {
+		hdd_err("Adapter is NULL (via %s, id %d)", func, id);
+		return NULL;
+	}
+
+	qdf_spin_lock_bh(&adapter->vdev_lock);
+	vdev = adapter->vdev;
+	if (vdev) {
+		status = wlan_objmgr_vdev_try_get_ref_debug(vdev, 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, id %d)", func, id);
+
+	return vdev;
+}
+#else
+struct wlan_objmgr_vdev *
+__hdd_objmgr_get_vdev_by_user(struct hdd_adapter *adapter,
+			      wlan_objmgr_ref_dbgid id,
+			      const char *func)
+{
+	struct wlan_objmgr_vdev *vdev;
+	QDF_STATUS status;
+
+	if (!adapter) {
+		hdd_err("Adapter is NULL (via %s, id %d)", func, id);
+		return NULL;
+	}
+
+	qdf_spin_lock_bh(&adapter->vdev_lock);
+	vdev = adapter->vdev;
+	if (vdev) {
+		status = wlan_objmgr_vdev_try_get_ref(vdev, id);
+		if (QDF_IS_STATUS_ERROR(status))
+			vdev = NULL;
+	}
+	qdf_spin_unlock_bh(&adapter->vdev_lock);
+
+	if (!vdev)
+		hdd_debug("VDEV is NULL (via %s, id %d)", func, id);
+
+	return vdev;
+}
+#endif
+
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+void
+__hdd_objmgr_put_vdev_by_user(struct wlan_objmgr_vdev *vdev,
+			      wlan_objmgr_ref_dbgid id, const char *func,
+			      int line)
+{
+	if (!vdev) {
+		hdd_err("VDEV is NULL (via %s, id %d)", func, id);
+		return;
+	}
+
+	wlan_objmgr_vdev_release_ref_debug(vdev, id, func, line);
+}
+#else
+void
+__hdd_objmgr_put_vdev_by_user(struct wlan_objmgr_vdev *vdev,
+			      wlan_objmgr_ref_dbgid id, const char *func)
+{
+	if (!vdev) {
+		hdd_err("VDEV is NULL (via %s, id %d)", func, id);
+		return;
+	}
+
+	wlan_objmgr_vdev_release_ref(vdev, id);
+}
+#endif

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

@@ -174,4 +174,54 @@ int hdd_objmgr_set_peer_mlme_auth_state(struct wlan_objmgr_vdev *vdev,
 int hdd_objmgr_set_peer_mlme_state(struct wlan_objmgr_vdev *vdev,
 				   enum wlan_peer_state peer_state);
 
+/**
+ * hdd_objmgr_get_vdev_by_user() - Get reference of vdev from adapter
+ *  with user id
+ * @adapter: hdd adapter
+ * @dbgid: reference count dbg id
+ *
+ * Return: pointer to vdev object for success, NULL for failure
+ */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+#define hdd_objmgr_get_vdev_by_user(adapter, dbgid) \
+	__hdd_objmgr_get_vdev_by_user(adapter, dbgid, __func__, __LINE__)
+struct wlan_objmgr_vdev *
+__hdd_objmgr_get_vdev_by_user(struct hdd_adapter *adapter,
+			      wlan_objmgr_ref_dbgid id,
+			      const char *func,
+			      int line);
+#else
+#define hdd_objmgr_get_vdev_by_user(adapter, dbgid) \
+	__hdd_objmgr_get_vdev_by_user(adapter, dbgid, __func__)
+struct wlan_objmgr_vdev *
+__hdd_objmgr_get_vdev_by_user(struct hdd_adapter *adapter,
+			      wlan_objmgr_ref_dbgid id,
+			      const char *func);
+#endif
+
+/**
+ * hdd_objmgr_put_vdev_by_user() - Release reference of vdev object with
+ *  user id
+ * @vdev: pointer to vdev object
+ * @dbgid: reference count dbg id
+ *
+ * This API releases vdev object reference which was acquired using
+ * hdd_objmgr_get_vdev_by_user().
+ *
+ * Return: void
+ */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+#define hdd_objmgr_put_vdev_by_user(vdev, dbgid) \
+	__hdd_objmgr_put_vdev_by_user(vdev, dbgid, __func__, __LINE__)
+void
+__hdd_objmgr_put_vdev_by_user(struct wlan_objmgr_vdev *vdev,
+			      wlan_objmgr_ref_dbgid id, const char *func,
+			      int line);
+#else
+#define hdd_objmgr_put_vdev_by_user(vdev, dbgid) \
+	__hdd_objmgr_put_vdev_by_user(vdev, dbgid, __func__)
+void
+__hdd_objmgr_put_vdev_by_user(struct wlan_objmgr_vdev *vdev,
+			      wlan_objmgr_ref_dbgid id, const char *func);
+#endif
 #endif /* end #if !defined(WLAN_HDD_OBJECT_MANAGER_H) */