소스 검색

qcacmn: Do not free objmgr global context if child objects are leaked

Object manager global context contains all child pointers to PSOC,
PDEV, VDEV and PEER. In case any child object is leaked in that
case do not free object manager global context to avoid memory
corruptions.

Change-Id: I490ce3a219ece3486d8a612de9132dd870e5bc7a
CRs-fixed: 2027166
Rajeev Kumar 8 년 전
부모
커밋
a3fc523714
1개의 변경된 파일11개의 추가작업 그리고 9개의 파일을 삭제
  1. 11 9
      umac/cmn_services/obj_mgr/src/wlan_objmgr_global_obj.c

+ 11 - 9
umac/cmn_services/obj_mgr/src/wlan_objmgr_global_obj.c

@@ -45,6 +45,7 @@ QDF_STATUS wlan_objmgr_global_obj_init(void)
 		qdf_print("%s: Global object is already created\n", __func__);
 		return QDF_STATUS_E_FAILURE;
 	}
+
 	/* Allocation of memory for Global object */
 	umac_global_obj = (struct wlan_objmgr_global *)qdf_mem_malloc(
 				sizeof(*umac_global_obj));
@@ -69,15 +70,15 @@ QDF_STATUS wlan_objmgr_global_obj_deinit(void)
 		qdf_print("%s: Global object is not allocated\n", __func__);
 		return QDF_STATUS_E_FAILURE;
 	}
-	/* TODO: Do we need to check, if any object
-	*  is not freed before this is called ??
-	*  ideally, init/deinit module should take care of freeing */
-	/* Initialize spinlock */
-	qdf_spinlock_destroy(&g_umac_glb_obj->global_lock);
-	/* Free Global object memory */
-	qdf_mem_free(g_umac_glb_obj);
-	/* Reset Global variable to NULL */
-	g_umac_glb_obj = NULL;
+
+	if (QDF_STATUS_SUCCESS == wlan_objmgr_global_obj_can_destroyed()) {
+		qdf_spinlock_destroy(&g_umac_glb_obj->global_lock);
+		qdf_mem_free(g_umac_glb_obj);
+		g_umac_glb_obj = NULL;
+	} else {
+		qdf_print("PSOCs are leaked can't free global objmgr ctx\n");
+	}
+
 	return QDF_STATUS_SUCCESS;
 }
 EXPORT_SYMBOL(wlan_objmgr_global_obj_deinit);
@@ -769,6 +770,7 @@ QDF_STATUS wlan_objmgr_global_obj_can_destroyed(void)
 		index++;
 	}
 	qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
+
 	return status;
 }
 EXPORT_SYMBOL(wlan_objmgr_global_obj_can_destroyed);