From dba48c8d9de13c4fdfa475a25faa60fbe042fc8e Mon Sep 17 00:00:00 2001 From: Dustin Brown Date: Wed, 15 Mar 2017 14:28:48 -0700 Subject: [PATCH] qcacld-3.0: Add debug prints to catch session_id/vdev_id desync When HDD detects that the session id and vdev id have de-synchronized, print the PSOC reference tree and induce a crash. Change-Id: I1ca47837cd024fd66e19d86222cfbbd85e3f5704 CRs-Fixed: 2020092 --- core/hdd/src/wlan_hdd_object_manager.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/hdd/src/wlan_hdd_object_manager.c b/core/hdd/src/wlan_hdd_object_manager.c index 746fef5b1f45..2aa531bc622f 100644 --- a/core/hdd/src/wlan_hdd_object_manager.c +++ b/core/hdd/src/wlan_hdd_object_manager.c @@ -141,6 +141,7 @@ int hdd_create_and_store_vdev(struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_peer *peer; struct vdev_osif_priv *osif_priv; struct wlan_vdev_create_params vdev_params; + uint8_t vdev_id; vdev_params.opmode = adapter->device_mode; qdf_mem_copy(vdev_params.macaddr, adapter->macAddressCurrent.bytes, @@ -165,10 +166,14 @@ int hdd_create_and_store_vdev(struct wlan_objmgr_pdev *pdev, return -ENOMEM; } - if (adapter->sessionId != wlan_vdev_get_id(vdev)) { - hdd_err("session id and vdev id mismatch"); - wlan_objmgr_vdev_obj_delete(vdev); - QDF_ASSERT(0); + vdev_id = wlan_vdev_get_id(vdev); + if (vdev_id != adapter->sessionId) { + hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter); + hdd_err("session id (%d) and vdev id (%d) mismatch\n" + "likely, a component leaked a vdev reference", + adapter->sessionId, vdev_id); + wlan_objmgr_print_ref_all_objects_per_psoc(hdd_ctx->hdd_psoc); + QDF_BUG(0); return -EINVAL; } @@ -176,7 +181,7 @@ int hdd_create_and_store_vdev(struct wlan_objmgr_pdev *pdev, vdev_params.macaddr); if (!peer) { hdd_err("obj manager self peer create fails for adapter %d", - adapter->device_mode); + adapter->device_mode); wlan_objmgr_vdev_obj_delete(vdev); return -ENOMEM; }