Browse Source

qcacmn: add locks in dp_get_vdev_from_soc_vdev_id_wifi3 API

In dp_get_vdev_from_soc_vdev_id_wifi3 add vdev list lock
while traversing through pdev->vdev_list

Change-Id: I24652a7a65247625b3a6da092476287bf8560e1b
CRs-fixed: 2323655
Chaithanya Garrepalli 6 years ago
parent
commit
3ba616a89a
2 changed files with 5 additions and 0 deletions
  1. 2 0
      dp/wifi3.0/dp_htt.c
  2. 3 0
      dp/wifi3.0/dp_peer.h

+ 2 - 0
dp/wifi3.0/dp_htt.c

@@ -1885,6 +1885,8 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev,
 		vdev =
 		       dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc,
 							  ppdu_desc->vdev_id);
+		if (!vdev)
+			return;
 		qdf_mem_copy(ppdu_user_desc->mac_addr, vdev->mac_addr.raw,
 			     DP_MAC_ADDR_LEN);
 	} else {

+ 3 - 0
dp/wifi3.0/dp_peer.h

@@ -173,15 +173,18 @@ dp_get_vdev_from_soc_vdev_id_wifi3(struct dp_soc *soc,
 
 	for (i = 0; i < MAX_PDEV_CNT && soc->pdev_list[i]; i++) {
 		pdev = soc->pdev_list[i];
+		qdf_spin_lock_bh(&pdev->vdev_list_lock);
 		TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
 			if (vdev->vdev_id == vdev_id) {
 				QDF_TRACE(QDF_MODULE_ID_DP,
 					QDF_TRACE_LEVEL_INFO,
 					FL("Found vdev 0x%pK on pdev %d"),
 					vdev, i);
+				qdf_spin_unlock_bh(&pdev->vdev_list_lock);
 				return vdev;
 			}
 		}
+		qdf_spin_unlock_bh(&pdev->vdev_list_lock);
 	}
 	return NULL;